Chodzi pewnie Tobie o coÅ› takiego:
- Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Bmp->Assign(Image1->Picture->Bitmap); // Image musi zawierać bitmapę, jeżeli nie należy dokonać konwersji
THandle hDeviceMode;
PDeviceMode DevMode;
char *ADevice, *ADriver, *APort;
ADevice =new char[100];
ADriver =new char[100];
APort =new char[100];
Printer()->GetPrinter(ADevice, ADriver, APort, hDeviceMode);
DevMode =(_devicemodeA*) GlobalLock((void *)hDeviceMode);
DevMode->dmFields = DevMode->dmFields | DM_DEFAULTSOURCE;
DevMode->dmFields = DevMode->dmFields | DM_ORIENTATION;
DevMode->dmFields = DevMode->dmFields | DM_SCALE;
DevMode->dmFields = DevMode->dmFields | DM_PRINTQUALITY;
DevMode->dmFields = DevMode->dmFields | DM_YRESOLUTION;
DevMode->dmPaperSize = DMPAPER_A5;
DevMode->dmOrientation = DMORIENT_PORTRAIT;
DevMode->dmYResolution = 600; //<-- brak zastosowania
DevMode->dmPrintQuality = DMRES_LOW;
DevMode->dmScale = 100; // <- brak zastosowania
Printer()->SetPrinter(ADevice, ADriver, APort, hDeviceMode);
Printer()->BeginDoc();
int x = Printer()->PageWidth; // długość strony.
int y = Printer()->PageHeight; // wysokość strony.
int width;
int height;
if((x / Bmp->Width) < (y / Bmp->Height))
{
width = Bmp->Width * ((x / Bmp->Width) + 0.5);
height = Bmp->Height * ((x / Bmp->Width) + 0.5);
}
else
{
height = Bmp->Height * ((y / Bmp->Height) + 0.5);
width = Bmp->Width * ((y / Bmp->Height) + 0.5);
}
Printer()->Canvas->CopyRect(Rect(10, 10, width, height), Bmp->Canvas, Rect(0, 0, Bmp->Width, Bmp->Height)); // <- tutaj Image
Printer()->Canvas->Brush->Style = bsClear; // usuwanie tła spod tekstu - tło przeźroczyste
Printer()->Canvas->TextOut(100, 200, Label1->Caption); // <-- tutaj Label->Caption
Printer()->EndDoc();
delete Bmp;
}
//---------------------------------------------------------------------------
Struktura DEVMODE ma zastosowanie nie tylko przy drukowaniu, ale również przy wyświetlaniu grafiki na ekranie monitora, dlatego nie wszystkie elementy tej struktury mają zastosowanie przy drukowaniu i tak
dmYResolution,
dmScale nie majÄ… zastosowania w odniesieniu do drukarki lecz ekranu.
Za rozdzielczość wydruku odpowiada
DevMode->dmPrintQuality, która może przyjmować cztery zdefiniowane wartości:
DMRES_HIGH
DMRES_MEDIUM
DMRES_LOW
DMRES_DRAFT
nie ma możliwości określenia jawnie rozdzielczości wydruku.
W odniesieniu do mojej drukarki te pre-definiowane właściwości mają następujące odpowiedniki:
DMRES_HIGH - najlepsza (600 dpi)
DMRES_MEDIUM - normalna (600 dpi)
DMRES_LOW - szybka zwykła (300 dpi)
DMRES_DRAFT - szybka robocza (300 dpi)
brak tutaj jednak jednego odpowiednika: Maksymalna (1200 dpi).