Bitmap Problem



  • Hi,
    mit dem folgenden Code will ich ein Bitmap in meinem Fenster unterbringen, aber es tut sich rein gar nix, obwohl ich das schon in x Beispielen so gesehen hab, außer, dass "dc" da "pDC" hieß und die erste Zeile gefehlt hat, aber damit hab ich Fehler gekriegt!
    Das da unten läuft sauber durch den Compiler, aber ohne Effekt. Warum? Ich versteh's nicht!!!

    CDC *dc = GetDC(); 
    	CBitmap bitmap;
    	CDC dcMemory;
    	bitmap.LoadBitmap(IDB_BITMAP1);
    	BITMAP bm;
    	bitmap.GetObject(sizeof(bm),&bm);
    	CDC speicherDC;
    	speicherDC.CreateCompatibleDC(dc);
    	speicherDC.SelectObject(&bitmap);
    	dc->StretchBlt(10,10,100,100,&speicherDC,0,0,100,100,SRCCOPY);
    

    Ich hoffe, nein ich weiß ⚠ , hier sind n paar klügere Köpfe als ich! 😉



  • Hi, ich probier mich mal an deinem Problem.

    In Beispielen die Du wohl gelesen hast handelte es sich um Funktionen wie:
    OnDraw(CDC pDC)* oder OnPrint etc. wo der DeviceContext schon initialisiert ist auf den Du zeichnen kannst/willst.

    Solltest Du nicht in einer dieser Funktionen arbeiten wird dein Problem dadran liegen, daß Du den DC nicht korrekt ansprichst.
    Eine Möglichkeit eine CFormView anzusprechen habe ich dir unten gepostet. Sollte dieses nicht dem entsprechen was Du suchst präzisier dein Problem bitte und poste die ganze Funktion.

    CWnd* wnd = GetDlgItem(IDC_OUT2_TREE);
    	CDC dc;
    	HDC hdc;
    
        hdc = ::GetWindowDC(wnd->m_hWnd);
        dc.Attach(hdc);
    
        CDC memDC;
        memDC.CreateCompatibleDC(&dc);
    
    	CBitmap bm;
    	bm.LoadBitmap(IDB_TREE_ICON);
    
    	BITMAP bmpInfo;
    	bm.GetBitmap(&bmpInfo);
    
    	bm.CreateCompatibleBitmap(&dc, sz.cx, sz.cy);
    	CBitmap * oldbm = memDC.SelectObject(&bm);
    	memDC.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &dc, 0, 0, SRCCOPY);
    
    	memDC.SelectObject(oldbm);
    	::ReleaseDC(wnd->m_hWnd,hdc);
    


  • Hmm, also ich kann kein Fehler entdecken und klappen tut der Code auch, hab ihn getestet.... Muss also an was anderes liegen....

    Hab den Code nochmal sauber umgesetzt, da du einige Dinge in deinem Code
    überhaupt nicht benötigst...

    CDC* pDC = GetDC();
    	CDC dc;
    	CBitmap bitmap;
    
    	bitmap.LoadBitmap(IDB_BITMAP1);
    
    	dc.CreateCompatibleDC(pDC);
    	dc.SelectObject(&bitmap);
    
    	pDC->StretchBlt(0, 0, 100, 100, &dc, 0, 0, 100, 100, SRCCOPY);
    

    das dcMemory is überflüssig, wird ersetzt durch SpeicherDC und GetObject() brauchst du auch nicht, da du mit dieser Funktion nur die Größe des Bitmaps usw. herausfinden kannst.

    Bis denne
    Dot.



  • @ Puppet

    1. Wer sagt das er eine CFormView benutzt ?

    2. Er spricht den DC richtig an, da er doch sicherlich den DC des ganzen Fensters haben will, und nicht nur den eines Steuerelementes...



  • @ Puppet

    1. Wer sagt das er eine CFormView benutzt ?

    2. Er spricht den DC richtig an, da er doch sicherlich den DC des ganzen Fensters haben will, und nicht nur den eines Steuerelementes...

    1. Keiner drum schrieb ich ja wenn das nich das is was er brauch dann könne er präzisieren 🙄

    2. Mit dem Code kannst Du auch das gesamte Fenster ansprechen.



  • In welcher Klasse und Funktion befindet sich der Code denn?



  • Ok, bevor hier noch Streit ausbricht 😉 mal ne kurze Erklärung...
    Ich hatte den zuerst in OnInitDialog(), dann in InitInstance() und jetzt in OnPaint(). Und was soll ich sagen, das Ergebnis war immer das gleiche...keins!
    Ich kann jetzt leider nicht mehr schreiben, weil ich morgen in Urlaub fahr 👍 😃 aber danke für Eure Mühe!
    Ciao



  • // Logo laden
    	CBitmap logo;
    	logo.LoadBitmap(IDB_APOS2);
    
    	CDC memDC;
    	memDC.CreateCompatibleDC(pDC);	//SpeicherDC initialisieren
    	memDC.SelectObject(&logo);		//Hintergrundbild --> Speicher
    
    	pDC->BitBlt(91,42,534,500,&memDC,0,0,SRCCOPY);
    	memDC.DeleteDC();
    

Anmelden zum Antworten