wawa 发表于 2013-4-25 14:15:48

Win32汇编关于WM_PAINT消息处理问题

在罗云斌WIN32汇编第200页有段内容不理解:“BeginPaint函数的返回值就是需要刷新区域的hDC.要注意的是:BeginPaint返回的hDC对应的尺寸仅是无效区域,无法用它绘画到这个区域以外的地方去”

书上例子代码:.if        eax ==        WM_PAINT && ecx == hWin1
                        invoke        BeginPaint,hWnd,addr @stPs
                        mov        @hDc,eax
                        invoke        GetClientRect,hWnd,addr @stRect
                        invoke        DrawText,@hDc,addr szText,-1,\
                                addr @stRect,\
                                DT_SINGLELINE or DT_CENTER or DT_VCENTER
                        invoke        EndPaint,hWnd,addr @stPs
照书上的说法,这段代码只能在无效区域进行绘制,第一次收到WM_PAINT消息的无效区域是整个窗口(由UpdateWindow函数引发),以后收到的WM_PAINT就是窗口被覆盖后,无效区域就是覆盖的区域,照上面那段话理解后,窗口中的一段字符串,会被覆盖的区域抹掉后不会再出现,可实际出现的情况是字符串被覆盖离开后重新出现。

我的理解是书上第194页最下面一段“Windows不会同时将两条WM_PAINT消息放入消息循环,当Windows要放入一条WM_PAINT消息的时候,如果发现已经存在一个无效区域了,那么它只需要把新旧两个无效区域合并计算出一个新的无效区域就可以了。”
所以覆盖窗口每动一次,只发送一个WM_PAINT消息,无效区域选择最大的区域。
不知道理解的对不对,请各位鱼友指点迷津

染指为红颜丶 发表于 2013-4-25 16:13:45

不会但是帮你顶

感悟随记 发表于 2013-4-25 17:06:09

我还没看到那一页呢,我才看到第五章

小名明SIU 发表于 2013-4-28 00:00:34

你说的有点乱,WM_PAINT是窗口需要重绘是由windows发送的消息,为什么窗口被覆盖然后还原后又恢复了,原因是又发送了WM_PAINT消息。当消息队列已经有WM_PAINT了,就不在插入了,只是把无效区域进行合并成一个大的区域

一站幸福 发表于 2013-5-9 13:45:33

激动人心,无法言表!
页: [1]
查看完整版本: Win32汇编关于WM_PAINT消息处理问题