Drucken mit GDI: Mit manchen Treibern wird Text auf Bitmap nicht gedruckt



  • Hallo zusammen,
    Seit einigen tagen bin Ich jetzt schon auf der suche nach dem Problem und finde einfach nichts, deshalb frag ich mal.
    Was ich versuche:
    Ich versuche folgendermaßen zu drucken:
    1. Drucker Device-context über printer-dialog holen
    2. CreateCompatibleDC darauf und CreateCompatibleBitmap. Da wird dann ein bitmap von der Festplatte geladen und anschließend wieder mit BitBlt auf den originalen Drucker-context kopiert
    3. Aufruf von CreateCompatibleDC auf den Drucker-context um einen memory-DC zu erstellen. Damit wird dann mit CreateCompatibleBitmap ein bitmap-erzeugt in dem gezeichnet wird (MoveToEx/LineTo/FillRect im wesentlichen). Außerdem wird mit TextOut (auch mit diveren ähnlichen funktionen probiert) auf das Bitmap geschrieben.
    Anschließend wird das Bitmap mit BitBlt() auf den originalen Drucker-context kopiert.
    4. Punkt 3. wird mehrmals wiederholt für verschiedene kleine Zeichnungen die alle über dem original-bitmap aus punkt 2. liegen. Letztendlich sieht dass dan so aus dass auf dem großen Bild aus 2. mehrere kästchen an verschiedenen Stellen gezeichnet werden in denen text steht.

    Das Problem:
    Solange der DeviceContext z.B. der Bildschirm ist funktioniert der Vorgang super. Auch mit z.B. Brother-druckern gibt es keine Probleme. Bei bestimmten Treibern geht's dann aber nicht mehr. Vor allem HP-Drucker scheinen betroffen zu sein (Auch der NovaPDF PDF drucker funktioniert nicht, PDF Creator aber schon). Was dann passiert ist sehr merkwürdig.
    Das große Original-Bitmap wird gezeichnet. Die mit MoveToEx/LineTo/FillRect gezeichneten kästchen werden ebenfalls über das Bitmap gemalt. Der Text (mit TextOut und konsorten) hingegen ist plötzlich unsichtbar. Aber es kommt noch besser: Wenn ich dem Text per logFont/CreateFontIndirect ein "Underline" oder "Strikeout" verpasse sehe ich den Unterstrich bzw. Durchstrich. Der Text bleibt aber weiter unsichtbar. Die Textfarbe spielt ebenfalls keine Rolle (diverse probiert, auch mit anderem Hintergrund etc.). Die Device-capabilities sollten ausreichen und unterstützen alles was ich mache. Alle WinAPI aufrufe geben Erfolgsmeldungen zurück (nichts schlägt fehl).
    Rausgefunden habe ich auch, dass es mit dem Device-context zutun haben muss. Wenn ich das Bitmap auf den bildschirm-context rendern lasse (CreateCompatibleDC(NULL)) und es anschließend mit SelectObject in den Drucker-context zwinge funktioniert alles - nur eben natürlich mit den falschen maßen (die Schrift ist dann sehr klein).

    Für mich klingt das sehr nach Treiberproblemen. Aber das kann man dem Kunden schlecht sagen, wenn alle anderen Anwendungen drucken können.
    Hat jemand eine Idee an was das liegen könnte?

    Danke schonmal,
    t3hb3n



  • Vielleicht liegt es daran, dass der Text auf das Bitmap geschrieben wird.
    Wenn in den Drucker-Device-Context direkt geschrieben wird klappt es vielleicht.
    TextOut(DuckerHDC,....usw.



  • Der Effekt ist leider genau der gleiche.
    (Was ich probiert hab ist: die vorhandenen statischen bitmaps wie bisher mit BitBlt rein kopieren und anschließend ein TextOut auf den printer-DC an der selben stelle. Wieder sehe ich auf dem Bildschirm das richtige, beim Drucken aber nichts).

    t3hb3n



  • So.. Hab einen hässlichen aber funktionierenden Workaround.
    Falls mal jemand das Problem haben sollte:
    Ich habe 2 Memory-DCs erstellt. einen kompatiblen zum Drucker und einen zum Bildschirm. Dann hab ich die kästchengröße über den Drucker-DC berechnen lassen, und das kästchen auf dem Drucker-DC gezeichnet. Mit der selben Größe hab ich dann ein zweites Bitmap für den Bildschirm-DC erstellt, da den Text rein geschrieben und ihn anschließend mit BitBlt auf den Drucker-kompatiblen DC kopiert. Also alles hässlich zusammen-gefrimelt. Naja. Es funktioniert.

    t3hb3n



  • Auf der Hilfeseite für LOGFONT steht ne Formel wie man die Schriftgröße berechnen kann so das sie unabhängig vom Gerät ist.


Anmelden zum Antworten