WM_ERASEBKGND消息

参考文章:白乔原创: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来加载位图背景,是不起作用的。

你可能感兴趣的:(windows)