1 Bmp in Monitor und Drucker ausgeben



  • Hallo zusammen,
    ich habe ein Bitmap, welches ich sowohl auf dem Bildschirm als auch auf dem Drucker ausgeben möchte. Angelegt wurde das Bitmap nach folgendem Schema: (Hab ich aus nem MFC Buch)

    CClientDC dcScreen (this);
    
    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap (&dcScreen, 100, 100);
    
    CDC dcMem;
    dcMem.CreateCompatibleDC (&dcScreen);
    
    CBrush brush (RGB (0, 0, 0));
    dcMem.SelectObject (&bitmap);
    dcMem.FillRect (CRect (0, 0, 100, 100), &brush);
    
    dcMem.StretchBlt(x1,y1,...);
    

    Dies erscheint auf dem Bildschirm anstandslos. Was muß ich tun, um dies auf den Drucker zu bekommen? Auf der Seitenansicht wird das Rechteck dargestellt, jedoch nicht gedruckt 😕 Muß ich etwa für den Drucker extra einen Kontext anlegen? Wenn ja, muß ich dann auch ein dazu passendes Bitmap erzeugen, oder kann ich den Druckerkontext auf das vorhandene Bitmap umbiegen?
    Zweiteres wäre mir lieber, da ich in Wirklichkeit eine ganze Bitmapliste inklusive Speicherkontexte habe, die auf dem Bildschirm ausgegeben werden und die jetzt gedruckt werden sollen. Da diese aber schon relativ speicherintensiv sind, wären nochmal 2 Listen (eine für Bitmap und eine für Druckerkontext) aus Performanceaspekten kaum auszuhalten 😞

    Hat jemand 'ne Idee?

    Gruß
    RG_Basser

    [ Dieser Beitrag wurde am 23.05.2003 um 16:51 Uhr von rg_Basser editiert. ]



  • http://www.mut.de/media/buecher/VCPLUS6/data/start.htm
    siehe Anhang C dieses Buches, da findest Du die Grundlagen gut erklärt.



  • Hi Erhard,

    der Verweis darauf bringt leider überhaupt nix!
    Ich hab hier seit ca. 5 Tagen ebenfalls einen Thread dazu am Laufen und mir konnte bisher leider auch niemand richtig helfen!
    Wenn Du Dir "VC++ in 21 Tagen" mal anguckst (ich habs daheim), dann wirst Du auch sehen, dass da mit keinem Thema "bitmap Drucken" erwähnt ist!

    René hat mir auch geschrieben, dass dies irgendwie wohl etwas problematisch ist!

    Falls Du zufällig einen Artikel oder sonst irgendwas zu diesem Thema kennst, dann würde ich mich über einen Link oder irgendwas auch sehr freuen, da ich das Problem auch nicht in den Griff bekomme!

    Gruss, Tobias



  • Ich war mir nicht sicher, ob die Printing Basics das Problem sind. Der Artikel in dem VC++ in 21 Tagen - Buch ist sehr gut für den Einstieg.

    Also Bitmaps drucken, da empfehle ich zunächst diesen Artikel: http://www.codeproject.com/useritems/general.asp 🙂

    Ich hoffe, das dies weiter hilft. 😕

    [ Dieser Beitrag wurde am 24.05.2003 um 13:01 Uhr von Erhard Henkes editiert. ]





  • @Henkes
    Erstmal Danke für die Links. Zwar haben mir diese nicht unmittelbar helfen können, weil Sie nicht unbedingt mein Problem behandeln, aber trotzdem haben sie mich auf die zündende Idee gebracht !! 🙂
    Und wie so oft ist des Rätsels Lösung so einfach, daß ich in meinem Beispielcode nur ein Wort zu ändern habe, um das Bitmap sowohl auf dem Bildschirm als auch auf dem Drucker zu bekommen! Allerdings muß im Vorfeld noch was erledigt werden.
    Und zwar muß ich zusätzlich zum Kontext dcScreen, der ja für den Bildschirm steht, noch ein Druckerkontext anlegen, den ich über folgende Methode anlege(hab ich aus einen deiner Links) : 😉

    CDC prtDC;
    if( AfxGetApp()->GetPrinterDeviceDefaults(&printInfo.m_pPD->m_pd) )
    {
       HDC hDC = printInfo.m_pPD->m_pd.hDC;
       if (hDC == NULL)
         hDC = printInfo.m_pPD->CreatePrinterDC();
       if(hDC !=NULL)
       {
         prtDC.Attach(hDC);
       }
       else
       {
         AfxMessageBox("Can not find printer. Please check installed/default printers.");
         return;
       }
    }
    

    Und jetzt kommt's: Wenn ich diesen Kontext habe, muß ich ihn nur an Stelle von '&dcScreen' in der Zeile

    bitmap.CreateCompatibleBitmap (&dcScreen, 100, 100);
    

    einsetzen und schon wird das Bitmap sowohl auf Monitor als auch Drucker ausgegeben 😃

    Im Gesamten sieht dann der Code so aus ( inkl davorigem Anlegen des Druckkontexts):

    CClientDC dcScreen (this);
    
    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap (&prtDC, 100, 100);
    
    CDC dcMem;
    dcMem.CreateCompatibleDC (&dcScreen);
    
    CBrush brush (RGB (0, 0, 0));
    dcMem.SelectObject (&bitmap);
    dcMem.FillRect (CRect (0, 0, 100, 100), &brush);
    
    dcMem.StretchBlt(x1,y1,...);
    

    [ Dieser Beitrag wurde am 26.05.2003 um 17:04 Uhr von rg_Basser editiert. ]

    [ Dieser Beitrag wurde am 26.05.2003 um 17:06 Uhr von rg_Basser editiert. ]


Anmelden zum Antworten