Bitmap drucken: Monocrom und steht Kopf



  • Hallo!

    Ich möchte ein Logo drucken. Nun habe ich mit der Suche einen Beitrag gefunden, wo jemand auch ein Problem damit hat - leider ohne Lösung, aber ein Ansatz.

    Quelle:http://www.c-plusplus.net/forum/viewtopic.php?t=84723
    Meine Funktion:

    void CDoc::DruckeLogo(CDC& f_dc)
    {
    	CBitmap bmp;
    	bmp.LoadBitmap(IDB_LOGO);
    
    	BITMAP bm;
    	bmp.GetObject(sizeof(bm),&bm);
    	CDC sdc;
    	sdc.CreateCompatibleDC(&f_dc);
    	sdc.SelectObject(&bmp);
    	f_dc.TextOut(10,-10,"Test");
    	f_dc.BitBlt(10,-100,bm.bmWidth,bm.bmHeight,&sdc,0,0,SRCCOPY);
    }
    

    Nun verschwinden leider alle Farben und das Bild steht Kopf.
    Ich habe schon mit ein paar Parametern rumgespielt, aber ich kriege es nicht hin.
    Mit dem Versuch oben sehe ich wenigstens was... 😞

    Mache ich das total falsch? Oder ist es nur eine Kleinigkeit?



  • Okay, ich hab es jetzt so weit, dass es grün ist - das lag wohl an den Farben. 😕

    Aber es steht immer noch Kopf. 😞



  • Ohne es ausprobiert zu haben und ohne das eigentliche Problem zu lösen:
    kann man den Bildbereich nicht einfach umrechnen ?
    f_dc.BitBlt(10+bm.bmWidth,-100+bm.bmHeight,-bm.bmWidth,-bm.bmHeight,&sdc,0,0,SRCCOPY);



  • Nein, auf die Idee bin ich schon gekommen.
    Den MapMode des sdc an den des f_dc anzupassen hilft auch nicht.

    Generell scheint man die Größe nicht ändern zu dürfen. Ich wollte es doppelt so groß haben, da hat er gar nichts mehr angezeigt. 😞
    Mach ich das so:

    f_dc.BitBlt(10,-100,bm.bmWidth,-bm.bmHeight,&sdc,0,0,SRCCOPY);
    }
    

    Dann zeigt er auch nix an. (Das war ja dein Vorschlag.)



  • Ich habe es! *freu* 🙂

    Damit druckt man das Bild doppelt so groß in die obere rechte Ecke der Seite (bzw. des Fensters, ist ja identisch):

    void CDoc::DruckeLogo(CDC& f_dc)
    {
    	CBitmap bmp;
    	bmp.LoadBitmap(IDB_LOGO);
    
    	BITMAP bm;
    	bmp.GetBitmap(&bm);
    	CDC sdc;
    	sdc.CreateCompatibleDC(&f_dc);
    	sdc.SelectObject(&bmp);
    	const short flFaktor = 2;
    	f_dc.StretchBlt(f_dc.GetWindowExt().cx - flFaktor*bm.bmWidth, 0, flFaktor*bm.bmWidth, -flFaktor*bm.bmHeight, &sdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
    }
    

    PS: Bitte beachten, ich habe einen anderen Befehl verwenden müssen:
    Statt BitBlt muss man StretchBlt nehmen. ⚠


Anmelden zum Antworten