最近搜集的文章列表

思路:在定时器里面调用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消息时准备好相应的画刷返回了就可以了. 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值