Einzelnen Beitrag anzeigen

Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Auf Windows Fax drucken - Nur ein weißes Blatt

  Alt 29. Feb 2008, 20:36
Danke, Union, aber das is auch nicht das Problem. Ich habe nach langem googlen Abhilfe gefunden:

Man muss anstatt GetMem bei Windows XP GlobalAlloc benutzen:

Delphi-Quellcode:
PROCEDURE PrintBitmap(Canvas: TCanvas; DestRect: TRect; Bitmap:TBitmap);

VAR BitmapHeader : pBitmapInfo;
    BitmapImage : POINTER;
    HeaderSize : DWORD; // Use DWORD for D3-D5 compatibility
    ImageSize : DWORD;
    kopierte_Zeilen : integer;
    alles_ok : boolean;
    OldMode : integer;
    InfoHandle, ImageHandle : THandle;

BEGIN
  GetDIBSizes(Bitmap.Handle, HeaderSize, ImageSize);

  // Anstelle von GetMem wird hier GlobalAlloc und GlobalLock verwendet,
  // da bei Verwendung von GetMem auf einigen Druckern sporatischentweder
  // eine scharze Grafikfläche oder eine weiße Grafikfläche anstelle der
  // Grafik selbst gedruckt wird.

  //GetMem(BitmapHeader, HeaderSize);
  //GetMem(BitmapImage, ImageSize);
  InfoHandle := GlobalAlloc(HeapAllocFlags, HeaderSize);
  BitmapHeader := GlobalLock(InfoHandle);
  ImageHandle := GlobalAlloc(HeapAllocFlags, ImageSize);
  BitmapImage := GlobalLock(ImageHandle);

  TRY
    alles_ok := GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^,BitmapImage^);
    if not alles_ok then
      MessageDlg('Bitmap copy error!', mtWarning, [mbOk], 0);
    OldMode := SetStretchBltMode(Canvas.Handle, COLORONCOLOR);
    kopierte_Zeilen := 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);
    if kopierte_Zeilen < 1 then
      begin
      if GetLastError <> NoError then
        MessageDlg(SysErrorMessage(getLastError), mtWarning, [mbOk],0);
    end;
    SetStretchBltMode(Printer.Canvas.Handle, OldMode);

  FINALLY

  // FreeMem(BitmapHeader);
  // FreeMem(BitmapImage)
  GlobalUnlock(ImageHandle);
  GlobalFree(ImageHandle);
  GlobalUnlock(InfoHandle);
  GlobalFree(InfoHandle);

  END
END {PrintBitmap};
Hoffe, dass dieser Thread wenigstens den Leuten hilft, die nach mir dieses Problem haben!

Gute nacht!
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat