Probleme mit Bitmap im Hauptdialogfeld



  • Ich versuche gerade bei einem Programm eine Bitmap im Hauptdialogfeld anzuzeigen, leider klappt das nicht so recht. Ich habe jetzt den ganzen code nach OnInitDialog() verlagert, OnPaint() kann ich ja später noch verwenden wenn überhaupt mal was geht. Also hier der Code:

    BOOL CBitmapsDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	[.....]
    
    	// TODO: Hier zusätzliche Initialisierung einfügen
    
    	// Gewählte Bitmap-Datei laden
    	HBITMAP hBitmap = (HBITMAP) ::LoadImage(AfxGetInstanceHandle(),
    	"C:\\xyz.bmp", IMAGE_BITMAP, 0, 0,
    	LR_LOADFROMFILE | LR_CREATEDIBSECTION);
    
    	// Aktuell geladenes Bitmap mit Bitmap-Objekt verbinden
    	m_bmpBitmap.Attach(hBitmap);
    
    	CBitmapsDlg *pWnd = this;
    	CPaintDC dc(this);
    	ShowBitmap(&dc, pWnd);
    
    	Invalidate();
    
    	return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    
    void CBitmapsDlg::ShowBitmap(CPaintDC* pdc, CWnd* pWnd)
    {
    	// Bitmap anzeigen
    	CBitmapsDlg *lpWnd = (CBitmapsDlg*)pWnd;				// Dialogpointer erstellen
    	BITMAP bm;								// Bitmappuffer
    	lpWnd->m_bmpBitmap.GetBitmap(&bm);		// Bitmap an bm
    
    	CDC dcMem;
    	dcMem.CreateCompatibleDC(pdc);			// CDC zu CPaintDC
    	dcMem.SelectObject(lpWnd->m_bmpBitmap);
    
    	pdc->StretchBlt(10, 10, 200, 400, &dcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
    }
    

    was passt da denn nicht? 😕
    währe natürlich klasse wenn jemand gleich den code so anpassen würde das es hinhaut, irgendwie komm ich damit nicht so richtig zurecht 😃



  • Compilieren lässt sich das Prog, nur angezeigt wird nichts, der Hanel auf die Bitmap ist gültig.

    Hat vielleicht jemand ein (funktionierendes)Codebeispiel für die Anzeige einer Bitmap? Hier http://www.c-plusplus.net/forum/viewtopic-var-t-is-110197-and-highlight-is-attach.html
    wird leider nur darauf eingegangen wie man sie lädt.

    mfg



  • 1. Was sollen die ganzen Pointer auf dein CWnd? Das ist schwachsinnig!
    2. OnEraseBackground ist die stelle an der man sowas unter anderem auch mache kann..
    3.

    BOOL CBitmapsDlg::OnEraseBkgnd(CDC* pDC)
    {
    	CDialog::OnEraseBkgnd(pDC);
    
    	if(!m_bmpBitmap.m_hObject)
    		return true;
    
    	CRect		rcClient;
    	CDC			memDC;
    	int			nBmpWidth;
    	int			nBmpHeight;
    	BITMAP		bitmap;
    	CBitmap*	pOldBitmap;
    
    	GetClientRect(&rcClient);
    	memDC.CreateCompatibleDC(pDC);
    	pOldBitmap	= memDC.SelectObject(&m_bmpBitmap);
    	m_bmpBitmap.GetBitmap(&bitmap);
    	nBmpWidth	= bitmap.bmWidth;
    	nBmpHeight	= bitmap.bmHeight;
    
    	pDC->StretchBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, nBmpWidth, nBmpHeight, SRCCOPY);
    
    	memDC.SelectObject(pOldBitmap);
    
    	return 1;
    }
    
    m_bmpBitmap.LoadImage(...);
    

    im Konstruktor sollte seinen Dienst auch tuen 😉


Anmelden zum Antworten