Bitmap in MDI Frame verschwindet

GrooveXT

Grünschnabel
Hallo,
ich habe mir von der Seite hier http://support.microsoft.com/kb/103786/en-us das Beispiel gezogen wie man die Hintergrundfarbe in einem MDI Fenster ändert. So jetzt habe ich probiert das auf ein Bitmap umzumünzen. Das hat auch insofern funktioniert das mir das Bitmap angezeigt wird, allerdings wird es bei jedem möglichen Event übermalt, wenn ich z.B. ein anderes Fenster in den Vordergrund hole, das Fenster über den Monitor Rand rausschiebe oder MDIChild Fenster öffne.

Meine Frage lautet nun, wie kann ich das verhindern? Bzw wie kann ich einen Repaint auslösen? (RedrawWindow, Invalidate etc. habe ich schon durch probiert)

Habe schon alles probiert, aber ein OnDraw Methode gibt es in diesem Fall nicht und OnPaint macht die gleichen Probleme wie OnEraseBkgnd.

Code:
CNewCleintWnd::CNewCleintWnd()
{
	m_MyBitmap.LoadBitmap(IDB_BITMAP1);
	m_MyBitmap.GetBitmap(&BmpParam);	

}

CNewCleintWnd::~CNewCleintWnd()
{

}


BEGIN_MESSAGE_MAP(CNewCleintWnd, CWnd)
	//{{AFX_MSG_MAP(CNewCleintWnd)
	ON_WM_ERASEBKGND()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// Behandlungsroutinen für Nachrichten CNewCleintWnd 

BOOL CNewCleintWnd::OnEraseBkgnd(CDC* pDC) 
{
	int bx, by;
	m_pMemDC = new CDC;
	m_pMemDC->CreateCompatibleDC(pDC);


	// Set brush to desired background color
      CBrush backBrush(RGB(255,255,255));

      // Save old brush
      CBrush* pOldBrush = pDC->SelectObject(&backBrush);

      CRect rect;
      pDC->GetClipBox(&rect);     // Erase the area needed

      pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(),
          PATCOPY);

	

	m_pMemDC->SelectObject(&m_MyBitmap);
	bx=rect.right/2-BmpParam.bmWidth/2;
	by=rect.bottom/2-BmpParam.bmHeight/2;   
	
	pDC->BitBlt(bx,by,BmpParam.bmWidth,BmpParam.bmHeight,
                    m_pMemDC,0,0,SRCCOPY);
	m_pMemDC->Detach();
	ReleaseDC(pDC);
	return TRUE;


	return CWnd::OnEraseBkgnd(pDC);
}

Vielen Dank für eure Hilfe.

Achja und vielleicht kann mir ja auch jmd sagen warum das Bitmap immer mit 256 Farben angezeigt wird, obwohl es 32 Bit Farben hat?!

gruß
Groove
 

langer1801

Erfahrenes Mitglied
Hallo,

du benutzt zur Darstellung offenbar eine GDI-Bitmap. Diese kann standardmäßig nur 256 Farben darstellen. Wenn du andere Auflösungen willst, mußt du DIB (deviceunabhängige Bitmap) benutzen. Dafür gibt es die Klasse CPicture - einfach mal danach googlen.

Den Codeteil, der den Hintergrund neu einfärbt, kannst du löschen, da du den Hintergrund ja mit einer Bitmap übermalen willst. Das Problem ist, dass du bei den von dir genannten Events das Neuzeichnen des Fensters anstoßen mußt. Invalidate() ist dafür schon richtig. Allerdings mußt du für die Events die WM-Message auswerten und in dem Handler dann Invalidate() und am besten noch UpdateWindow() (zwingt das Framework, das Fenster sofort zu zeichnen) aufrufen. Wenn du das Fenster verschiebst, mußt du also WM_MOVE auswerten und in diesem Handler das Neuzeichnen veranlassen. Genauso für andere Meldungen (WM_ACTIVATE, WM_SETFOCUS usw.) Das Invalidate()/UpdateWindow() ruft dann die Methode OnPaint() oder OnDraw() und OnEraseBkgnd() auf.

Mfg

langer