Bitmap in Hauptdialogfeld einbinden



  • Hallöchen,

    ich habe ein Problem in VC++.net eine Bitmap in mein Hauptdialogfeld einzubinden.
    Beim Kompilieren und Ausführen des Projektes treten keine Fehlermeldungen auf, nur das
    Bild wird leider nicht geladen. Beim Debuggen schaut auch alles sehr gut aus...die Bitmap
    wird in den Speicher geladen, aber eben nicht im Bereich des Dialogfeldes ausgegeben.

    Ich habe die Programmsteuerung in die Funktion OnInitDialog() eingefügt, damit sie gleich
    beim Laden des Dialogfeldes gestartet wird. Am Ende wird die Fkt. ShowBitmap aufgerufen, die
    die grafische Ausgabe vornehmen soll.

    In der Fkt StretchBlt (am Ende von ShowBitmap) konnte ich mit dem Debugger überprüfen, dass die
    Maße der geladenen Bitmap in die Argumenten übernommen werden. Aber weshalb funktioniert die
    Anzeige nicht?!

    Wäre schön, wenn mir jemand helfen kann.

    BOOL CRFID1Dlg::OnInitDialog()
    {	
    		.
    		.
    		.
    		.
    		.
    		.
    		.
    	//Gerätekontext zum Zeichnen
    	CPaintDC dc(this);
    
    	// Pointer auf CRFIDDlg holen, um dessen Membervariable zu erreichen
    	CRFID1Dlg* pFrame = (CRFID1Dlg*) AfxGetMainWnd();
    	HBITMAP hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),"Bild.bmp",
    		IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
    
    	// Ist Handle für das geladene Bild gültig?
    	if (hBitmap)
    	{
    		// Aktuelle Bitmap löschen
    		if (pFrame->m_bmpBitmap.DeleteObject())
    		{
    			// War Bitmap vorhanden, lösen
    			pFrame->m_bmpBitmap.Detach();
    		}
    		// Aktuell geladene Bitmap mit Bitmap-Objekt verbinden
    		pFrame->m_bmpBitmap.Attach(hBitmap);
    		// Anzeigebereich für ungültig erklären, um Neuzeichnen zu veranlassen
    		pFrame->Invalidate();
    
    		ShowBitmap(&dc);
    
    	}
    
    	return TRUE; 
    }
    
    void CRFID1Dlg::ShowBitmap(CPaintDC* pdc)
    {
    	// Pointer auf CRFIDDlg holen, um dessen Membervariable zu erreichen
    	CRFID1Dlg* pFrame = (CRFID1Dlg*) AfxGetMainWnd();
    
    	// Geladenes Bitmap holen
    	BITMAP bmp;
    	pFrame->m_bmpBitmap.GetBitmap(&bmp);
    
    	// zu pdc kompatiblen Gerätekontext erzeugen, in den Bitmap geladen wird
    	CDC SpeicherDC;
    	SpeicherDC.CreateCompatibleDC(pdc);
    
    	// Bitmap in den kompatiblen Gerätekontext selektieren
    	CBitmap* pAltesBitmap = (CBitmap*)SpeicherDC.SelectObject(pFrame->m_bmpBitmap);
    
    	// Anzeigebereich verfügbar machen
    	CRect lRect;
    	GetClientRect(lRect);
    	lRect.NormalizeRect();
    
    	// Bitmap normal anzeigen
    	pdc->StretchBlt(0, 0, bmp.bmWidth, bmp.bmHeight, &SpeicherDC,
    		0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
    }
    

    Gruß,
    Krommi



  • Krommi schrieb:

    Aber weshalb funktioniert die
    Anzeige nicht?!

    Weil das in OnInitDialog nichts zu suchen hat. Siehe auch die Doku zu CPaintDC.



  • Hmm weil das alles so nicht sinnig ist ... wieso holst du dir, wenn du in der Klasse bist noch einen Pointer auf diese?! Naja ... und wie Vorredner schon sagte ... in die OnPaint den Aufruf von ShowBitmap setzen ...

    void CRFID1Dlg::ShowBitmap(CDC* pDC)
    {
        if (pDC == NULL || m_bmpBitmap.m_hObject == NULL)
            return;
    
        BITMAP bmp;
        m_bmpBitmap.GetBitmap(&bmp);
    
        CDC dcMem;
        dcMem.CreateCompatibleDC(pDC);
    
        CBitmap* pOldBitmap = (CBitmap*)dcMem.SelectObject(m_bmpBitmap);
        pDC->BitBlt(0, 0, bmp.bmWidth, bmp.bmHeight, &dcMem, 0, 0, SRCCOPY);
        dcMem.SelectObject(pOldBitmap);
    
        dcMem.DeleteDC();
    }
    


  • Danke für die Tipps, habe es hinbekommen.
    Arbeite mich gerade in VC++ ein und muss mich erstmal
    zurecht finden.

    Falls ein anderer Anfänger Interesse hat, poste ich den Code hier.
    ...Einfach bescheid geben.

    Ciao, Krommi


Anmelden zum Antworten