Virtuelles Drucken klappt, wirkliches Drucken nur auf manchen Druckern !?



  • Wie sieht denn Deine Druckfunktion aus? Welches Projekt hast Du erstellt (MDI, SDI, Dialog)?



  • Ich benutze eine Dialogfeld-Anwendung.

    Ich habe gerade zufällig rausgefunden, dass der Fehler bei StretchBlt() auftritt.

    Ich erzeuge einen Memory DC (Kompaibler DC ist PaintDC(this)). Darauf zeichne ich das Bild. Anschließend kopiere ich mit 'StretchBlt()' den Inhalt des Memory DC auf PrintDC. Dort wird mir dann FALSE zurückgegeben.

    Die Funkion der ganzen Druckergeschichte kann nicht das Problem sein, virtuell drucken kann ich ja.

    Den Code muss ich erst auseinander reißen (viel Arbeit), wenns sein muß mache ich das. Könnt Ihr Euch auf die fehlgeschlagene 'StretchBlt()' Funktion einen Reim machen ?



  • Dazu fällt mir ein, ich hatte auch mal das Problem mit dem Leerblatt. Bei mir lag es an der Größe der Ausgabe. Soll heißen, sie war so klein, dass der Drucker sie nicht darstellen konnte.

    Experimentiere mal mit den physikalischen und logischen Koordinaten des DC und versuche auf dem speziellen Drucker einfach mal relativ großen Text zu printen.



  • Danke, ich habe gerade was gefunden, was den Fehler auslösen kann (Ähnlich wie dein Ansatz):

    http://support.microsoft.com/kb/269585/de

    Denke das Problem kann ich später beheben 😉

    EDIT:
    Die Seite lest Ihe besser auf englisch, die Computer-Übersetzung ist ne Katastrophe ^^



  • Red Skall schrieb:

    Die Funkion der ganzen Druckergeschichte kann nicht das Problem sein, virtuell drucken kann ich ja.

    Ich hatte ein Problem mit deinem Begriff "virtuell Drucken". Wenn Du in eine Datei druckst, dann ist die praktische Auflösung deines Ausgabegerätes u.U. wesentlich höher wie die eines physisch vorhandenen Drucker (Laser oder Tinte).
    Hast Du schon mal mit den Abbildungsmodi (über pDC->SetMapMode(....)) gespielt?



  • Bisher noch nicht, aber ich habe es heute gestestet, leider ohne Erfolg. Egal was für Parameter ich bei 'SetMapMode()' eingestellt habe hat er immer eine dunkle Linie gedruckt.

    Ich wollte das Problem eigentlich so lösen, dass ich einen Memory DC erstelle, der gena so groß ist, wie der Print DC. Dort benutze ich nur die Fläche, die ich brauche.

    Ich kann den Memory DC dieser größe (6675 x 4800 Pixel) aber erst garnicht erstellen:

    CBitmap* CreateMemoryDC(CDC *dReferenceDC, CDC *dDC, CSize sSize)
    {
    	CBitmap bBitmap;
    
    	// DC erstellen:
    	if ((dDC->CreateCompatibleDC(dReferenceDC)) && (bBitmap.CreateCompatibleBitmap(dReferenceDC, sSize.cx, sSize.cy)))
    		// Altes Bitmap zurückgeben:
    		return (dDC->SelectObject(&bBitmap));
    	else
    		return (NULL);
    }
    

    bei bBitmap.CreateCompatibleBitmap gibt er aber FALSE zurück 😞

    Normalerweise habe den Memory DC zum Testen immer mit 2172 x 3072 Pixeln erstellt.



  • [quote="Red Skall"]Ich wollte das Problem eigentlich so lösen, dass ich einen Memory DC erstelle, der gena so groß ist, wie der Print DC. Dort benutze ich nur die Fläche, die ich brauche.
    quote]

    Woher weißt Du denn auf welche Größe Dein PrintDC drucken kann? Legst Du es manuell fest oder holst Du Dir den PrintDC mittels GetPrinterDC? Was passiert, wenn Du NULL übergibst? Liefert dann CreateCompatibleDC auch false zurück?
    Ansonsten schau mal hier nach. Das muss man dann nur noch auf die Bitmap umschreiben.



  • Die größe hole ich mir mit 'GetDeviceCaps()' nachdem ich mit 'CreateDC()' den PrintDC erstellt habe.

    Also wenn ich da 'NULL' übergebe stürzt das Programm ab 😉

    Habe mir den Link mal genau angeguckt, ich mache es ja im Prinzip so. Habe aber auch noch ein par Kleinigkeiten in mein Programm übernommen. Leider ohne Erfolg, es tritt der selbe Fehler auf.

    Wenn ich 'bBitmap.CreateCompatibleBitmap()' aufrufe, da bricht er ja auch mit 'FALSE' ab. Kann die Funktion auch nicht ausgeführt werden, wenn sich die Abmessungen von Quell-DC und Ziel-Bitmap deutlich unterscheiden ?



  • Red Skall schrieb:

    Die größe hole ich mir mit 'GetDeviceCaps()' nachdem ich mit 'CreateDC()' den PrintDC erstellt habe.

    Also wenn ich da 'NULL' übergebe stürzt das Programm ab 😉

    Habe mir den Link mal genau angeguckt, ich mache es ja im Prinzip so. Habe aber auch noch ein par Kleinigkeiten in mein Programm übernommen. Leider ohne Erfolg, es tritt der selbe Fehler auf.

    Wenn ich 'bBitmap.CreateCompatibleBitmap()' aufrufe, da bricht er ja auch mit 'FALSE' ab. Kann die Funktion auch nicht ausgeführt werden, wenn sich die Abmessungen von Quell-DC und Ziel-Bitmap deutlich unterscheiden ?

    Im Grund schon. Dann schau doch mal welche Größe der PrintDC dir zur Verfügung stellt und wie grorß deine Bitmap ist...



  • Größen:

    Print DC: 6675 x 4800 Pixel
    Bitmapgröße: 2172 x 3072 Pixel
    

    Die größe für den Memory DC hat immer die selbe Größe wie das Bitmap. Ist schon ein großer Unterschied 😉

    Aber ich kann es ja nicht umgehen. Entweder ich erstelle einen DC mit Bitmapgröße und der Fehler kommt beim blitten von Memory DC auf Printer DC, oder oder Fehler kommt wenn ich den Memory DC mit gleicher Größe wie Printer DC erstelle.

    Gibt es da vielleicht nen ganz anderen Ansatz den ich verfolgen soll ?

    Ich will ja ein Bild, was unter Umständen viel kleiner ist als der Print DC ist ainfach genau dadrauf zeichnen. Da ich aber von Drucker zu Drucker unterschiedliche Größen vom Print DC zurück bekomme, muss ich das zu zeichnende Bild auf einen Memory DC zeichnen, und anschließen diesem auf den Printer DC zeichnen (Wegen Stretch-Funktion).


Anmelden zum Antworten