现在的位置: 首页 > 综合 > 正文

最近搜集的文章列表

2013年01月23日 ⁄ 综合 ⁄ 共 1916字 ⁄ 字号 评论关闭

思路:在定时器里面调用GetDlgItem(IDC_STATIC)->SetWindowTextW(strTemp1)不停改变static控件显示的内容,结果导致OnCtlColor函数不停的被响应(因为static控件不停的向父窗口发送WM_CTLCOLOR发送消息,)

OnCtlColor
85
OnCtlColor
86
OnCtlColor
87
OnCtlColor
88
OnCtlColor
89
OnCtlColor
90
OnCtlColor
91

HBRUSH CTest1Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO:  在此更改 DC 的任何特性
TRACE("OnCtlColor\n");
if(nCtlColor ==  CTLCOLOR_STATIC)
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(0,0,0));//黑色
return HBRUSH(GetStockObject(HOLLOW_BRUSH)); 
}
// TODO:  如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}

OnCtlColor为了透明显示,返回了一个空画刷HOLLOW_BRUSH,造成前面的文字没有被擦除,导致文字的重叠现象。

那为什么如果将对话框隐藏起来然后再显示出来,则又正常?是以为引发wm_paint消息,所有窗口都被重绘。

一 、WM_CTLCOLOR消息

http://blog.csdn.net/hisinwang/article/details/8070393

在每个控件开始绘制之前,都会向其父窗口发送WM_CTLCOLOR通告消息,在该消息的处理函数中,可以设置控件显示文本的前景色、背景色以及字体。该消息处理函数还要求返回一个画刷的句柄,用于在控件具体的绘制之前擦除其客户区。

OnCtlColor中的nCtlColor可为:
    CTLCOLOR_BTN       Button control
    CTLCOLOR_DLG       Dialog box
    CTLCOLOR_EDIT      Edit control
    CTLCOLOR_LISTBOX    List-box control
    CTLCOLOR_MSGBOX     Message box
    CTLCOLOR_SCROLLBAR  Scroll-bar control
    CTLCOLOR_STATIC     Static control

        可见,WM_CTLCOLOR可作用于按钮控件CButton、编辑框控件CEdit、ListBox控件、Static控件、滚动条控件,也可作用于对话框本身。
        注意:前面讲WM_CTLCOLOR为通告消息,也即是子控件发送给父窗口的,但对于对话框本身,它能收到nCtlColor为CTLCOLOR_DLG的WM_CTLCOLOR消息,这是自身发给自身的,显然,这时不是通告消息。

二、WM_CTLCOLOR消息

WM_CTLCOLOR消息用来完成对EDIT, STATIC, BUTTON等控件设置背景和字体颜色, 其用法如下:

http://www.cnblogs.com/Caiqinghua/archive/2008/12/25/1362411.html

三、给对话框加背景色

http://www.cnblogs.com/iceqq/archive/2009/05/30/1492430.html

给对话框加背景色

当Windows系统需要重画某个窗口客户区的背景的时候,就会向该窗口发送WM_ERASEBKGND 消息,窗口的处理过程响应这个消息重新画窗口的背景。改变对话框的背景颜色的原理很简单,就是响应这个消息,用自定义的颜色填充对话框的客户区背景,代替对话框窗口默认的背景填充动作。


给控件加背景色

这里要该响应WM_CTLCOLOR消息了.同时涉及到一个"消息反射"的概念.

WM_CTLCOLOR是Windows的控件向其父窗口发送最频繁的通知消息之一,例如,许多控件发送WM_CTLCOLOR消息给父窗口,让父窗口提供画刷来画自己的背景.MFC的窗口类对这个通知消息特殊对待.如果父窗口没有处理这个通知消息,MFC的窗口类就根据WM_CTLCOLOR通知消息的来源将这个WM_CTLCOLOR消息发送回控件,让控件自己处理,这就是所谓的"消息反射".不仅是WM_CTLCOLOR,MFC对很多通知消息都做了反射.

因此我们只要在收到控件的WM_CTLCOLOR消息时准备好相应的画刷返回了就可以了. 

抱歉!评论已关闭.