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