`

WM_PAINT消息

    博客分类:
  • C++
阅读更多
原文地址:http://www.baidu.com/s?bs=mfc+%B0%EF%D6%FA%CE%C4%B5%B5&f=3&wd=wm_paint%CF%FB%CF%A2&oq=wm_pai&rsp=1


  WndProc处理的第二个消息为WM_PAINT。这个消息在Windows程序设计中是很重要的。当窗口显示区域的一部分显示内容或者全部变为 “无效”,以致于必须“更新画面”时,将由这个消息通知程序。
  显示区域的显示内容怎么会变得无效呢?在最初建立窗口的时候,整个显示区域都是无效的,因为程序还没有在窗口上画什么东西。第一条WM_PAINT消息(通常发生在WinMain中调用UpdateWindow时)指示窗口消息处理程序在显示区域上画一些东西。在用户改变HELLOWIN窗口的大小后,显示区域的显示内容重新变得无效。wndclass结构的style字段设定为标志 CS_HREDRAW和CS_VREDRAW,这样的格式设定指示Windows,在窗口大小改变后,就把整个窗口显示内容当成无效。然后,窗口消息处理程序将收到一条WM_PAINT消息。当用户将最小化,然后再次将窗口恢复为以前的大小时,Windows将不会保存显示区域的内容。在图形环境下,窗口显示区域涉及的数据量很大。因此,Windows令窗口无效,窗口消息处理程序接收一条WM_PAINT消息,并自动恢复其窗口的内容。在移动窗口以致其相互重迭时,Windows不保存一个窗口中被另一个窗口所遮盖的内容。在这一部分不再被遮盖之后,它就被标志为无效。窗口消息处理程序接收到一条 WM_PAINT消息,以更新窗口的内容。
  对WM_PAINT的处理几乎总是从一个BeginPaint调用开始:hdc = BeginPaint (hwnd, &ps) ;而以一个EndPaint调用结束:EndPaint (hwnd, &ps) ;
  在这两个调用中,第一个参数都是程序的窗口句柄,第二个参数是指向型态为 PAINTSTRUCT的结构指针。PAINTSTRUCT结构中包含一些窗口消息处理程序,可以用来更新显示区域的内容。我们将在下一章中讨论该结构的各个字段。现在我们只在BeginPaint和EndPaint函数中用到它。
  在BeginPaint调用中,如果显示区域的背景还未被删除,则由Windows来删除。它使用注册窗口类别的WNDCLASS结构的hbrBackground字段中指定的画刷来删除背景。一般, 这是一个白色备用画刷。这意味着,Windows将通过把窗口背景设定为白色来删除窗口背景。BeginPaint调用令整个显示区域有效,并传回一个 “设备上下文句柄”。设备上下文是指实体输出设备(如视频显示器)及其设备驱动程序。在窗口的显示区域显示文字和图形需要设备上下文句柄。但是从 BeginPaint传回的设备上下文句柄不能在显示区域之外绘图,读者可以试一试。EndPaint释放设备上下文句柄,使之不再有效。
  如果窗口消息处理程序不处理WM_PAINT消息(这是很少见的),它们必须被传送给 DefWindowProc。DefWindowProc只是依次调用BeginPaint和EndPaint,以使显示区域有效。调用完 BeginPaint之后,WndProc接着调用GetClientRect:
  GetClientRect (hwnd, &rect) ;
  第一个参数是程序窗口的句柄。第二个参数是一个指针,指向一个RECT型态的 rectangle结构。该结构有四个LONG字段,分别为left、top、right和bottom。GetClientRect将这四个字段设定为窗口显示区域的尺寸。left和top字段通常设定为0,right和bottom字段设定为显示区域的宽度和高度(像素点数)。WndProc除了将该 RECT结构指针作为DrawText的第四个参数传递外,不再对它做其它处理
分享到:
评论

相关推荐

    WM_PAINT 消息

    对 MSDN 上 WM_PAINT 消息的详细翻译。 隶属于 Platform SDK Windows GDI 绘图消息。 后续会更新别消息-对MSDN的翻译。

    Windows窗口程序发送消息WM_PAINT的时机的实验

    这是个MFC程序,检测Windows窗口程序发送消息WM_PAINT的时机,根据检测到WM_PAINT的次数绘制椭圆,从而确定发送消息WM_PAINT的时机。 经过实验,发送WM_PAINT的时机是窗口创建时、改变窗口大小时。 窗口的坐标系为...

    DUILIB 修改WM_PAINT来实现不规则窗体源码及示例

    DUILIB 修改WM_PAINT来实现不规则窗体源码及示例

    duilib半透明异形窗口_修改WM_PAINT

    UpdateLayeredWindow(...)这个...3.系统接管几乎所有WM_PANIT消息, 除了我们主动调用Invalidate()产生的WM_PAINT.(这点很重要) 4.BeginPaint与EndPaint的使用 有问题可到 http://www.yutent.com/article-68.html 留言.

    MFC统计窗口处理ON_PAINT消息次数以及鼠标左键按下时位置、键盘按下的按键并输出在窗口。

    为了按下鼠标左键时、键盘按下的按键输出在窗口,应设置在LButtonDown消息以及KeyDown消息处理中发送WM_PAINT给窗口。 CMainWindow类有数据成员px,py,key,分别是鼠标按下左键所在的位置(x,y)以及键盘按键。

    Invalidate函数及WM_PAINT总结

    Invalidate函数及WM_PAINT总结,想必学VC++的都知道这两个东东的作用了!

    MFC简易计算器程序

    ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1, OnButton1) ON_BN_CLICKED(IDC_BUTTON2, OnButton2) ON_BN_CLICKED(IDC_BUTTON3, OnButton3) ON_BN_CLICKED(IDC_BUTTON4, OnButton4) ON_BN...

    Window 消息大全

    WM_PAINT = $000F //要求一个窗口重画自己 WM_CLOSE = $0010 //当一个窗口或应用程序要关闭时发送一个信号 WM_QUERYENDSESSION= $0011 //当用户选择结束对话框或程序自己调用ExitWindows函数 WM_QUIT= $0012 //...

    Windows程序设计笔记

    3、掌握在WM_PAINT消息和在其他消息中得到DC的方法 4、掌握的常见的绘图函数的使用、画笔、画刷的使用 5、掌握WM_CREATE、WM_COMMAND、鼠标消息的处理方法 6、掌握菜单的使用(菜单消息处理) 7、掌握文件存储(设计...

    VC之美化界面篇本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础:

    WM_PAINT消息相信大家都很熟悉,一个窗口要重绘了,就会有一个WM_PAINT消息发送给窗口。 可以响应窗口的WM_PAINT,以更改它们的模样。WM_PAINT的映射函数原型如下: afx_msg void OnPaint(); 控件也是窗口,所以...

    在TreeCtrl控件中移动鼠标改变字体及颜色

    本人在学习制作Windows系统的资源管理器的过程中,加入了相似的功能,其基本思路是:在与TreeCtrl控件关联的类(CDirTreeCtrl)中重载鼠标移动消息函数,设置相关的文本的颜色参数,在WM_PAINT消息映射函数定义的设备环境中...

    MFC消息逆向分析 1

    MFC消息的逆向分析,可以包含各种WM_TIMER、WM_PAINT消息等

    MFCandGdiplusDemo

    这时候就需要拦截WM_PAINT消息进行反复绘制 但是对于一些对画面更新不是很频繁并且改动范围不大或绘制步骤太过于复杂,这就显得比较浪费时间和 CPU 资源 所以我就想把一个画面先绘制到一个画布上,再从画布复制到控件...

    MFCandGdiplusDemo全注释

    这时候就需要拦截WM_PAINT消息进行反复绘制 但是对于一些对画面更新不是很频繁并且改动范围不大或绘制步骤太过于复杂,这就显得比较浪费时间和 CPU 资源 所以我就想把一个画面先绘制到一个画布上,再从画布复制到控件...

    经验不足的Win32开发人员会询问建议/说明,以优化/改进WM_PAINT和WM_CTLCOLORSTATIC处理程序的代码

    简介和相关信息:我已经对主窗口的背景及其子静态控件进行了复杂的绘制。此图片的链接显示了它的外观:http://pbrd.co/1cx8DHd [^]静态控件具有SS_NOTIFY样式,值得一提的是...

    VC CString最全面的总结 常用数据类型使用转换详解等总结

    4 另一组窗口消息:WM_MOVE , WM_SIZE , WM_PAINT 2 5 焦点消息WM_SETFOCUS,WM_KILLFOCUS 3 6 定时器消息:WM_TIMER 3 MFC、ATL和STL 3 得到网关 4 CString最全面的总结 4 CString 拷贝 & 赋值 & "引用内存块" 什么...

    VC界面美化

    最近看的一篇文章,感觉对于学习VC界面设计跟美化都很... 3.3.1 WM_PAINT 3.3.2 WM_ERASEBKGND 3.3.3 WM_CTLCOLOR 3.3.4 WM_DRAWITEM 3.3.5 WM_MEASUREITEM 3.3.6 NM_CUSTOMDRAW 3.4 使用MFC类的虚函数机制

    使用win32 api的定时器自动改变窗口客户区的颜色

    使用win32 api 的SetTimer函数定义一个定时器,每隔10毫秒改变窗口客户区的颜色;窗口过程在处理WM_TIMER消息时,改变颜色的值;窗口过程在处理WM_PAINT消息时,使用设定好的颜色填充窗口客户区。

    超级列表框设置表头颜色-易语言

    WM_PAINT 消息,你会发现 这种重绘不好控制,比如拉宽表头 的某一列,颜色和文字就会消失 不见(这也是我失败的总结)。 正确的做法是: 我们要子类化超级列表框ListView (注意不是表头),在WM_DRAWITEM 消息下...

Global site tag (gtag.js) - Google Analytics