了,关键代码是最后返回 TRUE,而不是默认的调用基类函数,返回 TRUE 意在告诉 Windows:“我已经画 过背景了,你不要再画了”。现在来看看运行的效果:
图.3 重画背景的效果 使用位图作为对话框的背景也不难,就是在整个客户区画一个位图背景, 第二步:改变控件的颜色 看起来不如刚才效果好,控件文字的颜色和背景色都没有改变,这是因为我 们还没有处理 WM_CTLCOLOR 消息。WM_CTLCOLOR 是 Windows 的控件向其父窗口发 送最频繁的通知消息之一,例如,许多控件发送 WM_CTLCOLOR 消息给父窗口,让 父窗口提供画刷来画自己的背景。MFC 的窗口类对这个通知消息特殊对待,如果
在线代理 dailiav/提供部分资料
本资料由-校园大学生创业网-提供 chuangyw/
父窗口没有处理这个通知消息,MFC 的窗口类就根据 WM_CTLCOLOR 通知消息的来 源将这个 WM_CTLCOLOR 消息发送回控件,让控件自己处理,这就是所谓的“消息 反射”,不仅是 WM_CTLCOLOR,MFC 对很多通知消息都做了反射,不过我们今天 的例子没有使用“消息反射”,我们在控件的父窗口,也就是对话框窗口处理这 个通知消息。还有一点需要说明的是,WM_CTLCOLOR 消息是 16 位的 Windows 平 台的消息,在 32 位的 Windows 平台上取而代之的是一系列更明确的通知消息: WM_CTLCOLORBTN 按钮控件 WM_CTLCOLORDLG 对话框 WM_CTLCOLOREDIT 编辑控件 WM_CTLCOLORLISTBOX
列表框控件 WM_CTLCOLORSCROLL
BAR 滚动条控件 WM_CTLCOLORSTATIC 静态文本控件 MFC 为了兼容性考虑,仍旧使用 OnCtlColor 响应这些消息,但是通过参数 nCtlColor 来具体的区分他们。在这个函数中,我们可以通过改变 pDC 参数的属 性来改变控件的绘制,并返回相应的画刷句柄给控件,控件使用这个画刷画自己 的背景。下面是我们修改后的 OnCtlColor 函数: HBRUSH CCustDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); pDC->SetTextColor(m_clrText); pDC->SetBkMode(TRANSPARENT); return (HBRUSH)m_brBkgnd; //因为 CBrush 类实现了 HBRUSH 类型转换操作 符 //return hbr; } 图.4 就是这段代码的效果,在这里我们不分“青红皂白”,向所有的控件 返回我们自己的画刷,看起来不错,Edit 控件的文字颜色也改了,但是好像多 行 Edit 控件有了麻烦,看来需要对多行 Edit 控件特殊对待。
在线代理 dailiav/提供部分资料
本资料由-校园大学生创业网-提供 chuangyw/
图.4 重载 OnCtlColor 之后的效果 对于多行 Edit 控件特殊处理,如下所示,上面的
问题解决了: HBRUSH CCustDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if(pWnd->GetDlgCtrlID() == IDC_EDIT_MULTI_LINE) //IDC_EDIT_MULTI_LINE 是多行 Edir 控件的 ID { pDC->SetTextColor(m_clrText); return hbr; } else { pDC->SetTextColor(m_clrText);
在线代理 dailiav/提供部分资料
本资料由-校园大学生
创业网-提供 chuangyw/
pDC->SetBkMode(TRANSPARENT); return (HBRUSH)m_brBkgnd; } } 上面的代码解决了 IDC_EDIT_MULTI_LINE 的问题,但是对每个多行 Edit 控 件都要判断 ID,下面的方法可以一劳永逸地解决多行编辑控件的问题: HBRUSH CCustDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); TCHAR szClassName[64]; ::GetClassName(pWnd->GetSafeHwnd(),szClassName,64); if(lstrcmpi(szClassName,_T("Edit")) == 0) //是 Edit 控件 { DWORD dwStyle = pWnd->GetStyle(); if((dwStyle &; ES_MULTILINE) == ES_MULTILINE) //多行 edit 控件 { pDC->SetTextColor(m_clrText); return hbr; } else { pDC->SetTextColor(m_clrText); pDC->SetBkMode(TRA