可以捕获WM_CTLCOLOR消息来做,这里的WM_CTLCOLOR消息是一个16位Windows下的消息,到了32位下,系统就将各个控件的消息分开来了。可以对号入座:
- WM_CTLCOLORBTN
- WM_CTLCOLOREDIT
- WM_CTLCOLORDLG
- WM_CTLCOLORLISTBOX
- WM_CTLCOLORSCROLLBAR
- WM_CTLCOLORSTATIC
参数如下:
- hwnd
- Handle to destination window.
- wParam
- Handle to a display context (DC).
- lParam
- Handle to a child window (control).
处理这类消息需要传一个Brush句柄,并且应用程序需要自己来维护这个Brush(在不需要的时候销毁)
另外对于如果想用一张位图来作为窗口的背景的话,可以使用这样的方法——截获WM_ERASEBKGND消息:
BOOL OnEraseBkgnd( CDC* pDC )
{
CPaintDC dc(this);
CBitmap bmp;
CBitmap* pOldBmp;
BITMAP b;
CRect rect;
CDC memDC;
GetClientRect(rect);
memDC.CreateCompatibleDC(&dc);
bmp.LoadBitmap(IDB_BITMAP1);
bmp.GetBitmap(&b);
pOldBmp=(CBitmap*)memDC.SelectObject(&bmp);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,b.bmWidth,b.bmHeight,SRCCOPY);
memDC.SelectObject(pOldBmp);
return false;//如果前面什么都不写,只返回true或者false,那么对话框变成透明的。
}
以上这段转自
http://zhangstar.spaces.live.com/Blog/cns!82837E375AFF0BA9!531.entry