参考文章:白乔原创:VC之美化界面篇
Windows在窗口的具体绘制之前,会发送WM_ERASEBKGND消息通知该窗口檫除背景。默认情况下,会以窗口的默认背景色清除窗口。
消息响应函数为:afx_msg BOOL OnEraseBkgnd(CDC* pDC)。
以下Demo为对话框加载了一副位图背景。
1、首先导入一副位图。
2、
BOOL CMy123Dlg::OnInitDialog()
{
......
m_bitmap.LoadBitmap(IDB_BITMAP1);
......
}
3、BOOL CMy123Dlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CDC dc;
dc.CreateCompatibleDC(pDC);
dc.SelectObject(&m_bitmap);
//获取BITMAP对象信息
BITMAP hb;
m_bitmap.GetBitmap(&hb);
//获取窗口客户区大小
CRect rt;
GetClientRect(&rt);
//显示位图
pDC->StretchBlt(0, 0, rt.Width(), rt.Height(),
&dc, 0, 0, hb.bmWidth, hb.bmHeight, SRCCOPY);
return TRUE;
}
4、同时得响应OnCtlColor,设置对话框上所有控件画刷为HOLLOW_BRUSH,绘制文字时为TRANSPARENT模式。这样,控件就是透明的。HBRUSH CMy123Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
//设置透明背景模式
pDC->SetBkMode(TRANSPARENT);
//设置背景画刷为空
return (HBRUSH)::GetStockObject(HOLLOW_BRUSH);
}
当然,也可以为控件响应OnEraseBkgnd来加载位图背景。如下图所示:为ListBox控件加载了和对话框一样的位图背景。
正如上一篇文章WM_CTLCOLOR消息中讲到的,对PushButton控件响应OnEraseBkgnd来加载位图背景,是不起作用的。