Funkcja MeasureString

0

Witam.
Mam takie dwie funkcje :

void funkcja1() {
Font font = new Font(FontFamily.GenericMonospace, 12, FontStyle.Bold);
int width = 100;
Bitmap b = new Bitmap(1,1);
Graphics g = Graphics.FromImage(b);
PointF size = g.MeasureString("BLA", font, width);
}
protected override void OnPrintPage(PrintPageEventArgs e) {
Font font = new Font(FontFamily.GenericMonospace, 12, FontStyle.Bold);
int width = 100;
PointF size = e.Graphics.MeasureString("BLA", font, width);
}

Chcę zapytać co takiego w obiekcie Graphics powoduje, że te rozmiary się różnią? Nieznacznie, ale na tyle dużo, by utrudnić obliczanie stron, dokładne rysowanie tekstu, czy obramowania, np. funkcja1 obliczyła rozmiar, w funkcji onprintpage rysuję według tego rozmiaru z funkcja1 i niestety jest źle tzn. tekst nie mieści się w prostokącie itp:(
Próbowałem bawić się DPI, ale mimo iż wartości są te same, zwracany rozmiar jest inny.

Jeśli istnieje jakieś inne rozwiązanie od obliczania wszystkiego w funkcji OnPrintPage to będę wdzięczny...
Dziękuję.

0

A może to tylko moje domysł czy w oknie aplikacji nie robisz jakiegoś skalowania tego obrazu żeby się dopasowywał ładnie może przez to ucina kawałek? Tak tylko zgaduje.

0
DibbyDum napisał(a):

A może to tylko moje domysł czy w oknie aplikacji nie robisz jakiegoś skalowania tego obrazu żeby się dopasowywał ładnie może przez to ucina kawałek? Tak tylko zgaduje.

Nie. Mam po prostu klasę "Cell", która ma metodę SetText(text) i Draw(Graphics g, Point p). Po wprowadzeniu tekstu to klasy Cell obliczana jest jej wielkość na podstawie funkcja1... Jednak gdy przychodzi czas na prawdziwe drukowanie to rozmiar zostaje, ale okazuje się, że tekst się nie mieści. . . Jedynym czynnikiem, który różni te obliczenia jest obiekt Graphics, który pierwszy raz pochodzi od Bitmapy, a za drugim razem z funkcji drukującej PrintPage.

0

zapewne różne wartości DPI - dla bitmapy będzie to pewnie DPI jakie masz ustawione w systemie (chyba 96) a dla drukarki takie jakie ma drukarka

1

Return Value
Type: System.Drawing.SizeF
This method returns a SizeF structure that represents the size, in the units specified by the PageUnit property, of the string specified by the text parameter as drawn with the font parameter.

Zobacz co masz pod PageUnit w obu przypadkach. Może operujesz na różnych jednostkach.

http://msdn.microsoft.com/en-us/library/system.drawing.graphicsunit.aspx

Member name Description
Display Specifies the unit of measure of the display device. Typically pixels for video displays, and 1/100 inch for printers.
Document Specifies the document unit (1/300 inch) as the unit of measure.
Inch Specifies the inch as the unit of measure.
Millimeter Specifies the millimeter as the unit of measure.
Pixel Specifies a device pixel as the unit of measure.
Point Specifies a printer's point (1/72 inch) as the unit of measure.
World Specifies the world coordinate system unit as the unit of measure.

1 użytkowników online, w tym zalogowanych: 0, gości: 1