Trzeba ustawić zmienną która będzie przechowywała współczynnik określający np. szerokość strony do jej rozdzielczości. Podając pozycję strony trzeba mnożyć wartości przez ten współczynnik.
Jeżeli np. w rozdzielczości
300dpi strona ma długość
2400, to współczynnik będzie wyglądał tak:
ratio = Printer()->PageWidth / 2400 = 1; gdyż przy
300dpi PageWidth jest równe
2400, ale już przy
600dpi PageWidth = 4800, więc
ratio = Printer()->PageWidth / 1200 = 2.
Mnożąc pozycję przez współczynnik tekst zawsze będzie znajdował się w określonej przez Ciebie pozycji.
Współczynnik należy obliczać po wywołaniu metody
BeginDoc(), gdyż przed wywołaniem tej metody
Printer() nie zna wymiarów drukowanej strony:
Printer()->BeginDoc();
int pw = Printer()->PageWidth; // długość strony.
int ph = Printer()->PageHeight; // wysokość strony.
double ratio_x = pw / 2400;
double ratio_y = ph / 3344;
Printer()->Canvas->TextOut(100 * ratio_x, 200 * ratio_y, "Przykładowy tekst.");
Printer()->EndDoc();
Ustalasz współczynnik dla jednej rozdzielczości i ustalasz pozycję tekstu na stronie w oparciu o tą rozdzielczość. Na różnych drukarkach rozdzielczość dpi zawsze będzie taka sama, ale rozmiar strony może się różnić w zależności od tego jakie marginesy obsługuje drukarka. Ja np. testowałem ten kod na drukarce przy rozdzielczości 300dpi i otrzymałem dla PageWidt dwa różne wyniki 2400 i 2480 a to dlatego, że druga drukarka miała mniejsze marginesy, dlatego pozycja tekstu: 100 * ratio_x da na dwóch drukarkach różne wyniki: 100 * 1 = 100; 100 * 1.03 = 103; W drugim przypadku tekst zostanie przesunięty o trzy piksele bardziej w prawą stronę, ale ponieważ wymiar strony jest trochę większy to licząc w milimetrach w obydwu przypadkach tekst będzie mniej więcej w tej samej pozycji.
By uniknąć tej zabawy z marginesami lepiej jest pobierać całkowity fizyczny rozmiar obszaru drukowania i w oparciu o niego obliczać współczynnik. Dla rozdzielczości 300dpi wynosi on 2480:
Printer()->BeginDoc();
TPoint PhysPageSize;
Escape( Printer()->Handle, GETPHYSPAGESIZE, 0, NULL, &PhysPageSize);
double ratio = PhysPageSize.x / 2480;
Printer()->Canvas->TextOut(100 * ratio, 200 * ratio, "Przykładowy tekst.");
Printer()->EndDoc();
Tym razem w przykładzie użyłem jednego współczynnika do obliczania pozycji tekstu w poziomie i w pionie, gdyż jeden w zupełności wystarczy.
Można też pobrać rozdzielczość drukarki i w oparciu o nią obliczać współczynnik, ale to się do niczego nie przyda, gdyż nie uwzględnia to marginesów. Niemniej jednak rozdzielczość drukarki można sprawdzić tak:
Printer()->BeginDoc();
int resolution = GetDeviceCaps(Printer()->Handle, LOGPIXELSX);
Printer()->EndDoc();
Gdybyś chciał wyliczyć marginesy drukarki to sprawa jest prosta:
/* rozdzielczość w poziomie i w pionie, w praktyce identyczne */
int ppi_x = GetDeviceCaps(Printer()->Handle, LOGPIXELSX);
int ppi_y = GetDeviceCaps(Printer()->Handle, LOGPIXELSY);
int pr_x = GetDeviceCaps(Printer()->Handle, HORZRES); /* to samo co Printer()->PageWidth */
int pr_y = GetDeviceCaps(Printer()->Handle, VERTRES); /* to samo co Printer()->PageHeight */
TPoint PhysPageSize;
/* całkowity rozmiar strony razem z marginesami */
Escape( Printer()->Handle, GETPHYSPAGESIZE, 0, NULL, &PhysPageSize);
TPoint Offset;
/* marginesy lewy raz górny */
Escape( Printer()->Handle, GETPRINTINGOFFSET, 0, NULL, &Offset);
int margin_Left = Offset.x;
int margin_Top = Offset.y;
int margin_Right = PhysPageSize.x - pr_x - Offset.x;
int margin_Bottom = PhysPageSize.y - pr_y - Offset.y;
/* obliczamy rozmiar strony w milimetrach */
int page_width_mm = (PhysPageSize.x / ppi_x) * 25.4;
int page_height_mm = (PhysPageSize.y / ppi_y) * 25.4;
/* obliczamy rozmiar strony w centymetrach */
int page_width_cm = (PhysPageSize.x / ppi_x) * 2.54;
int page_height_cm = (PhysPageSize.y / ppi_y) * 2.54;
/* obliczamy marginesy w centymetrach */
int margin_Left_cm = (margin_Left / ppi_x) * 2.54;
int margin_Top_cm = (margin_Top / ppi_y) * 2.54;
int margin_Right_cm = (margin_Right / ppi_x) * 2.54;
int margin_Bottom_cm = (margin_Bottom / ppi_y) * 2.54;
Funkcje
GetDeviceCaps i
Escape sprawdzają parametry drukarki bez konieczności jej uruchamiania za pomocą funkcji
BeginDoc.