window消息中的ON_WM_ERASEBKGND,WM_PAINT,ON_WM_CTLCOLOR_REFLECT怎么用啊?
自定义一个编辑框控件,被这些消息搞晕了,看MSDN无果。有几个问题想问一下,希望大家指教。假设自定义的一个编辑框控件,并且控件捕获了这些消息,那么在下列事件下各触发什么事...
自定义一个编辑框控件,被这些消息搞晕了,看MSDN无果。有几个问题想问一下,希望大家指教。
假设自定义的一个编辑框控件,并且控件捕获了这些消息,那么在下列事件下各触发什么事件,顺序怎么样的?
1。移动对话框,但控件未超出屏幕范围。
2。。。。。。。。。。超出。。。。。。
3。对话框从最小状态下恢复。
这三个消息都是控件的外观需要重新表现触发的,所以想问下它们所处理的事件能否交叉,比如在ON_WM_ERASEBKGND处理时把WM_PAINT的事情也一并处理(比如说画一条线)。
望高手赐教,不胜感激。
1L的我测试了一下,移动窗口未超出范围时都不触发,
而超出范围只触发WM_PAINT 和WM_ERASEBKGND,最
小化恢复时三个都触发了,而且顺序是WM_CTLCOLOR,WM_PAINT,WM_ERASEBKGND,
点击编辑框时只触发了WM_CTLCOLOR.
我是在DEBUG时用TRACE语句输出测试的,不知道为什么会是这种顺序,移动对话框即使没超出范围,控件也在重画也要触发WM_PAINT,为什么没有呢?
但我知道如果在MDI或SDI中移动窗口是要触发WM_PAINT的,难道控件和视图窗口的重画机制不一样?
郁闷了。。。
1L我再问个问题啊。如果在一个按钮处理过程中调用如下代码pDC->SetBkColor()设置了前影颜色那么pDC是一个指针,是否这个设置在程序结束前永久保存。 展开
假设自定义的一个编辑框控件,并且控件捕获了这些消息,那么在下列事件下各触发什么事件,顺序怎么样的?
1。移动对话框,但控件未超出屏幕范围。
2。。。。。。。。。。超出。。。。。。
3。对话框从最小状态下恢复。
这三个消息都是控件的外观需要重新表现触发的,所以想问下它们所处理的事件能否交叉,比如在ON_WM_ERASEBKGND处理时把WM_PAINT的事情也一并处理(比如说画一条线)。
望高手赐教,不胜感激。
1L的我测试了一下,移动窗口未超出范围时都不触发,
而超出范围只触发WM_PAINT 和WM_ERASEBKGND,最
小化恢复时三个都触发了,而且顺序是WM_CTLCOLOR,WM_PAINT,WM_ERASEBKGND,
点击编辑框时只触发了WM_CTLCOLOR.
我是在DEBUG时用TRACE语句输出测试的,不知道为什么会是这种顺序,移动对话框即使没超出范围,控件也在重画也要触发WM_PAINT,为什么没有呢?
但我知道如果在MDI或SDI中移动窗口是要触发WM_PAINT的,难道控件和视图窗口的重画机制不一样?
郁闷了。。。
1L我再问个问题啊。如果在一个按钮处理过程中调用如下代码pDC->SetBkColor()设置了前影颜色那么pDC是一个指针,是否这个设置在程序结束前永久保存。 展开
1个回答
展开全部
WM_ERASEBKGND 绘制背景
WM_PAINT 绘制前景,就是一般的绘图
WM_CTLCOLOR 确切的说对于edit 其实是 WM_CTLCOLOREDIT ,反射消息,表示子控件绘制之前通知父窗口“我要绘制了,告诉我要绘制什么颜色,否则我就用默认的”。
1.2.3 没分别,都要调用 这3个消息。因为这3个消息是关联的默认的 MoveWindow,RedrawWindow 都会触发 WM_ERASEBKGND,WM_PAINT,消息,而WM_PAINT又触发了WM_CTLCOLOR消息。
补:窗口移动直接触发消息是 WM_MOVE ,是在MoveWindow 或 SetWindowPos 里面决定是否触发WM_PAINT/WM_EREASEBKGND,如果窗口未被别的窗口覆盖,且size没变化,可以不重绘,而是由显卡内部移动当前窗口的显示数据,同时向下层窗口发送重绘消息。 如果超出屏幕再移回部分,那就有部分被遮盖需要重绘了,当然触发重绘消息.
WM_CTLCOLOR 消息不用去管它,这个很多控件是在自绘模式下才支持的,编辑控件也是在可编辑状态下才响应的。规律我也摸不准,不过我从来不用它。属于鸡肋性质的消息。如果要调整背景颜色等信息,可以直接使用控件函数来设置,再不行就自绘完成了,工作量也不是太大。
WM_PAINT 绘制前景,就是一般的绘图
WM_CTLCOLOR 确切的说对于edit 其实是 WM_CTLCOLOREDIT ,反射消息,表示子控件绘制之前通知父窗口“我要绘制了,告诉我要绘制什么颜色,否则我就用默认的”。
1.2.3 没分别,都要调用 这3个消息。因为这3个消息是关联的默认的 MoveWindow,RedrawWindow 都会触发 WM_ERASEBKGND,WM_PAINT,消息,而WM_PAINT又触发了WM_CTLCOLOR消息。
补:窗口移动直接触发消息是 WM_MOVE ,是在MoveWindow 或 SetWindowPos 里面决定是否触发WM_PAINT/WM_EREASEBKGND,如果窗口未被别的窗口覆盖,且size没变化,可以不重绘,而是由显卡内部移动当前窗口的显示数据,同时向下层窗口发送重绘消息。 如果超出屏幕再移回部分,那就有部分被遮盖需要重绘了,当然触发重绘消息.
WM_CTLCOLOR 消息不用去管它,这个很多控件是在自绘模式下才支持的,编辑控件也是在可编辑状态下才响应的。规律我也摸不准,不过我从来不用它。属于鸡肋性质的消息。如果要调整背景颜色等信息,可以直接使用控件函数来设置,再不行就自绘完成了,工作量也不是太大。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询