Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Bitmap an den Drucker senden (https://www.delphipraxis.net/110139-bitmap-den-drucker-senden.html)

Moony 17. Mär 2008 16:18

Re: Bitmap an den Drucker senden
 
Ich besitze keinen Canvas.

Hier der Verlauf:

1. Ich rufe eine andere Applikation auf, diese Applikation erstellt mit CreateDC ein Handle. Dieses Handle bekomme ich von dieser Applikation zurück.

2. Zurück bei mir muß ich diesem Handle meine Druckdaten mitteilen.

3. Ich sage der anderen Applikation, dass Sie den Druckauftrag abschließen und ausführen kann.

Das Problem ist also, dass ich lediglich ein Handle bekomme und damit weiter arbeiten muss. Ich habe keinen Canvas. Deshalb war zu aller erst meine Frage wie ich das Canvas eines Druckers anhand des Handles bekomme. So wie ich bei meinem letzten Beitrag Daten an den Drucker schicke kommt es zumindest zu keinem Fehler, aber der Drucker druckt nichts.

Was die Funktion GetDC betrifft:
Mit GetDC bekomme ich ein weiteres Handle und ich weiß immer noch nicht was ich dann mit einem wieteren Handle anfangen soll?

Vjay 17. Mär 2008 16:19

Re: Bitmap an den Drucker senden
 
Nein und der Drucker steht zuweit weg als ich da mal gucken gehen würde ob was rauskommt.
Naja es war von getDC die Rede und von Canvas.handle := printerHandle, aber nicht davon beides kombiniert einzusetzen (oder ich habs übersehen) ;-)

Vjay 17. Mär 2008 16:21

Re: Bitmap an den Drucker senden
 
Naja mit CreatDC ist der Devicecontext, den du dem Canvas.handle zuweisen kannst, generell schonmal da.

Der Fehler liegt dann woanders, z.B. dass du nicht im richtigen Koordinatensystem druckst (somit wird dein Bitmap weggeworfen(geclippt)) und es kommt eine leere Seite heraus.

Moony 17. Mär 2008 16:31

Re: Bitmap an den Drucker senden
 
Und wie kann man das beheben? Ich wüßte jetzt nicht, dass ich im System bin...

Zur kleinen Info:

Wenn ich einen TextOut() ausführe, dann wird dieser gedruckt. Das was mir aber wichtig ist, ist eine Bilddatei an den Drucker zu schicken.

Vjay 17. Mär 2008 16:48

Re: Bitmap an den Drucker senden
 
Sorry, überlesen. Also ausgehend von deinem Beispiel versuch mal folgendes:

Delphi-Quellcode:
C:= TCanvas.create;
C.handle:= Printerhandle;
C.TextOut(0-x, 0-y, 'schnickschnackschnuck');
C.draw(0-x, 0-y, myGraphic);
C.stretchDraw(Rect( 0-x, 0-y, -1, -1), myGraphic);
C.free;
// drucken
Was siehst du, Text, dein Bild, dein Bild ganzsseitig?

Moony 17. Mär 2008 17:09

Re: Bitmap an den Drucker senden
 
Also bis auf das die Druckereinstellungen nicht stimmen wurde zumindest das Bild draufgedruckt!!!! Ich werde das morgen weiter unter die Lupe, wie man das optimieren kann.

Kann ich denn noch die richtigen Druckereinstellungen setzen?

Moony 19. Mär 2008 11:08

Re: Bitmap an den Drucker senden
 
So, habe das jetzt bei mir eingebaut und habe nur noch ein Problem:

Wie schicke ich ihm ne zweite Seite?

Ich habe das so versucht:

Delphi-Quellcode:
  myGraphic := TBitmap.Create;
  myCanvasF := TCanvas.Create;
  myCanvasB := TCanvas.Create;
  try
    if FileExists(ExtractFilePath(Application.ExeName) +  '!NewCard.bmp') then
      myGraphic.LoadFromFile(ExtractFilePath(Application.ExeName) +  '!NewCard.bmp');

    myCanvasF.Handle := PrntHandle;
    X := GetDeviceCaps(PrntHandle,PHYSICALOFFSETX);
    Y := GetDeviceCaps(PrntHandle,PHYSICALOFFSETY);

    GetDIBSizes(myGraphic.Handle, HeaderSize, ImageSize);

    myCanvasF.Draw(0-X, 0-Y, myGraphic);
    myCanvasF.StretchDraw(Rect(0-X, 0-Y, 1027, 648), myGraphic);

    if FileExists(ExtractFilePath(Application.ExeName) +  '!NewCard2.bmp') then
    begin
      if @_DCStartPage <> nil then
        _DCStartPage();

      myGraphic.LoadFromFile(ExtractFilePath(Application.ExeName) +  '!NewCard2.bmp');

      myCanvasB.Handle := PrntHandle;
      myCanvasB.Draw(0-X, 0-Y, myGraphic);
      myCanvasB.StretchDraw(Rect(0-X, 0-Y, 1027, 648), myGraphic);
    end;
  finally
    myGraphic.Free;
    myCanvasF.Free;
    myCanvasB.Free;
  end;
  Result := _DCContinue(0);
Bei diesem Code wird die zweite Seite auf die erste Seite gedruckt und die erste gar nicht.
Alle Funktionen mit dem Underscore sind aus einer anderen Applikation die aufgerufen werden und die den Druckjob verwalten.

Vjay 19. Mär 2008 14:21

Re: Bitmap an den Drucker senden
 
Teile der anderen Awendung, die den Druckjob verwaltet mit, eine neue Seite zu erstellen und dir den Devicecontext zu übermitteln.

Um eine neue Seite selber zu erstellen benötigst du mehr als das DC-Handle.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 Uhr.
Seite 4 von 4   « Erste     234   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz