导航
  • 主页
  • VC/MVC基础类
  • .NET 技术
  • VC/MFC界面
  • VC/MFC 进程
  • VC/MFC 数据库
  • VC/MFC&Web
  • MFC Plus
  • VC++技术资源

ShowWindow(hwnd, iCmdShow)与WM_PAINT 的关系

polyimide 2010-07-29 09:39:51
关于ShowWindow(hwnd, iCmdShow)与WM_PAINT的关系有些地方不太明白:
1.书上说使用CreateWindow()之后,用ShowWindow()来显示Window,用UpdateWindow()发送一个WM_PAINT的消息来显示Client Area里的内容.
2.当我把UpdateWindow()删除后重新编译,程序可以正常运行,Client Area里的内容也能正常显示。
3.用VC调试如下代码
..............
ShowWindow();
UpdateWindow();
.............
发现ShowWindow()不产生WM_PAINT,只有UpdateWindow()会产生WM_PAINT
4.把UpdateWindow()删除
..............
ShowWindow();
.............
发现ShowWindow()也会产生WM_PAINT

请问以上现象何解?还望指点,谢谢!
...全文
105 点赞 收藏 5
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
arong1234 2010-07-29
1. 你的书说错了,UpdateWindow不会产生WM_PAINT,它只是让WM_PAINT(如果有的话)立刻执行。WM_PAINT只有窗口需要显示(ShowWindow当然迫使窗口需要被显示)或者更新(一般是Invalidate/InvalidateRect迫使,或者窗口尺寸变化、被别的窗口遮住又显露出来等)才会被触发
2. 如果明白第一点,第二点不用说
至于3/4,要明白WM_PAINT是在你系统空闲时才产生的(UpdateWindow迫使它立刻执行,不等待空闲时间),而你在ShowWindow和UpdateWindow系统不空闲,所以3、4的区别很容易解释
实际上,无论你有没有UpdateWindow,这个消息都会产生,只不过你如果设个断点在这里并检查WM_PAINT,你就看不到,因为只要你不释放断点,系统永远不是“空闲”状态,也不产生WM_PAINT
[Quote=引用楼主 polyimide 的回复:]
关于ShowWindow(hwnd, iCmdShow)与WM_PAINT的关系有些地方不太明白:
1.书上说使用CreateWindow()之后,用ShowWindow()来显示Window,用UpdateWindow()发送一个WM_PAINT的消息来显示Client Area里的内容.
2.当我把UpdateWindow()删除后重新编译,程序可以正常运行,Client Area里的内容……
[/Quote]
回复
stjay 2010-07-29
ShowWindow显示窗口后,发现窗口区域无效,就会产生WM_PAINT
UpdateWindow是绕过消息队列直接发送WM_PAINT,也即是强制立即绘制窗口

这样的目的,因为是第一次显示,所以要立即绘制窗口,减少无谓的检测
回复
xxd_qd 2010-07-29
WM_PAINT仅仅在你的窗口需要重画、并且你的消息队列为空的时候发送。也就是说:如果你的代码里面有连续的几个语句,每个都会导致窗口的内容(部分或者全部)需要重画,那么系统仅仅是默默地把你的要求记下来,然后等你彻底空闲了的时候,再一并发给你一个WM_PAINT。
回复
scvegetable 2010-07-29
你怎样知道WM_PAINT是UpdateWindow产生的而不是ShowWindow产生的
回复
wltg2001 2010-07-29
产不产生WM_PAINT的关键是程序窗口上有没有无效区,如果有的话,那么就会产生WM_PAINT,如果没有那么就不发送。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……