Einzelnen Beitrag anzeigen

matashen

Registriert seit: 29. Jan 2007
Ort: daheim
463 Beiträge
 
Delphi XE2 Enterprise
 
#7

Re: Maßeinheitengenau ein Canvas ausdrucken

  Alt 28. Mär 2007, 07:58
Nimm zum Drucken eines Bildes am besten folgenden Code

Delphi-Quellcode:
PROCEDURE PrintBitmap(Canvas: TCanvas; DestRect: TRect; Bitmap: TBitmap);
// PROC eingeführt am 10.1.07 da bessere ausgabeergebnisse
  VAR
    BitmapHeader: pBitmapInfo;
    BitmapImage,header,bits : POINTER;
    HeaderSize, BitsSize: Cardinal;
    //HeaderSize : DWORD; // Use DWORD for D3-D5 compatibility
    ImageSize : DWORD;
    nographics:boolean;
BEGIN
// TEST
//if GetDeviceCaps(Printer.Handle, RASTERCAPS) then NoGraphics := True;

  GetDIBSizes(Bitmap.Handle, HeaderSize, ImageSize);
  //GetMem(BitmapHeader, HeaderSize);
  //GetMem(BitmapImage, ImageSize);
  Bitmapheader := VirtualAlloc(nil, HeaderSize, MEM_COMMIT, PAGE_READWRITE);
  BitmapImage := VirtualAlloc(nil, ImageSize, MEM_COMMIT, PAGE_READWRITE);

  TRY
    GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^);

    StretchDIBits(Canvas.Handle,
                  DestRect.Left, DestRect.Top, // Destination Origin
                  DestRect.Right - DestRect.Left, // Destination Width
                  DestRect.Bottom - DestRect.Top, // Destination Height
                  0, 0, // Source Origin
                  Bitmap.Width, Bitmap.Height, // Source Width & Height
                  BitmapImage,
                  TBitmapInfo(BitmapHeader^),
                  DIB_RGB_COLORS,
                  SRCCOPY)
  FINALLY
    //FreeMem(BitmapHeader);
    //FreeMem(BitmapImage)
    VirtualFree(Bitmapheader, 0, MEM_FREE);
    VirtualFree(bitmapimage, 0, MEM_FREE);
  END
END {PrintBitmap};
hab hier mal vor einiger Zeit Getmem durch getdibsizes ersetzt, da ich bei getmem zum teil falsche Wérte bekommen habe. Sollte so funktionieren. Den Grundcode hab ich irgendwo gegoogelt.

um dann das ganze auf eine bestimmte Größe anpassen zu können nutzt du das:

Delphi-Quellcode:
printer.title:=Dein Programmname '+filetext;
if printer.printing then printer.abort;
printer.begindoc;
//Drucker-Daten ermitteln: (Hoehe und Breite in cm und Pixeln)
//durch 10, da mm in cm umrechnen
BreiteCm :=GetDeviceCaps(Printer.Handle,HORZSIZE) div 10;
BreitePixel :=GetDeviceCaps(Printer.Handle,HORZRES);
HoeheCm :=GetDeviceCaps(Printer.Handle,VERTSIZE) div 10;
HoehePixel :=GetDeviceCaps(Printer.Handle,VERTRES);
//wieviel Pixel auf 1 cm kommen:
HorizPixelProCm :=BreitePixel div BreiteCm;
VertPixelProCm :=HoehePixel div HoeheCm;
breitereal:=BreitePixel/BreiteCm;
hoehereal:=(HoehePixel/HoeheCm);
horp:= HorizPixelProCm;
verp:= VertPixelProCm;
faktor:=10;
LRand := HorizPixelProCm;
ORand :=VertPixelProCm;

...
...
Printbitmap(...)
printer.enddoc;

gruß Matthias
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat