2008-10-14 7 views
2

Existe-t-il un moyen de modifier la couleur de l'arrière-plan d'une fenêtre MDIParent dans MFC (2005)?Définition de la couleur d'arrière-plan CMDIFrameWnd

J'ai essayé d'intercepter ON_WM_CTLCOLOR et ON_WM_ERASEBKGND, mais aucun d'entre eux ne fonctionne. OnEraseBkgnd fonctionne, mais il est écrasé par la couleur WM_CTL standard.

Vive

+0

mec, ne donnerais-je pas la réponse réelle plutôt que d'un lien vers une réponse? –

Répondre

3

Le CMDIFrameWnd est en fait masqué par une autre fenêtre appelée fenêtre MDIClient. Voici un article de Microsoft sur la façon de sous-classer cette fenêtre MDIClient et de modifier la couleur d'arrière-plan. Je l'ai juste essayé moi-même et ça marche très bien.

http://support.microsoft.com/kb/129471

0

juste deviner ici, mais essayez la manipulation ON_WM_PAINT.

3

Créer une classe dérivant CWnd (CClientWnd par exemple)

Dans votre poignée de classe dérivée CWnd-

afx_msg BOOL OnEraseBkgnd(CDC* pDC); 
afx_msg void OnPaint(void); 
afx_msg void OnSize(UINT nType, int cx, int cy); 

Vous avez besoin des entrées de mappage de message suivant:

ON_WM_ERASEBKGND() 
ON_WM_PAINT() 
ON_WM_SIZE() 

Dans OnEraseBkgnd retourne juste TRUE, vous ferez tous le travail dans OnPaint

Dans OnPaint, faites ce que vous voulez. Pour remplir avec une couleur, vous pouvez faire

CBrush brush; 
brush.CreateSolidBrush(COLORREF(RGB(80, 160, 240))); 

CRect clientRect; 
GetClientRect(clientRect); 

CPaintDC dc(this); 
dc.FillRect(clientRect, &brush); 

En OnSize appellent la superclasse, invalidera alors forcer un repeindre.


Dans votre ordinateur central, déclarer un CClientWnd membre (m_clientWnd par exemple)

Dans OnCreate de votre ordinateur central, d'abord appeler la superclasse, puis

m_clientWnd.SubclassWindow(m_hWndMDIClient); 
1

Il semble y avoir une solution simple à ce problème dans VS2008 au moins:

En

CMainFrame :: OnPaint()

{

..

// obtenir le courant continu de la fenêtre d'arrière-plan

CWnd * pWnd = CWnd :: FromHandle (m_hWndMDIClient);

CPaintDC dc1 (pWnd);

// puis dessiner ou BitBlt dans ce DC

}

Questions connexes