怎样只是画父窗口

eduyu 2009-05-31 06:56:51
invalidateRect等一系列的函数会使得该窗口重画,系统且会发送消息(wm_paint)到该区域的该窗口的子窗口,怎样避免之,只画该父窗口.
...全文
159 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
eduyu 2009-06-10
  • 打赏
  • 举报
回复
解决了,父子一起重画,但是父通过subclass子窗口,hook在子的wm_paint上,这样父可以画在子之后,这样就形成了一种附加显示的效果。就像浏览器里画红色的鼠标手势那种感觉。

谢谢各位,这个设计也是第一次这么想,最后能实现,证明还是可用的。
cnzdgs 2009-06-02
  • 打赏
  • 举报
回复
这种思路不大对,父窗口不应覆盖子窗口,如果坚持要按这思路来做,可以直接获取子窗口DC来绘制,不经过Invalidate和WM_PAINT消息来处理。
eduyu 2009-06-01
  • 打赏
  • 举报
回复
WS_CLIPCHILDREN会去除掉子窗口的区域,问题是我想让父窗口画这个区域。
我的问题是这样的,子父窗口一样大,子窗口重画的时候,父窗口侦听子窗口,并跟着重画。
但是显然,这时父窗口不能再发消息给子窗口了,因为重画是子窗口发起,这就会无限循环。
但是Invalidate会发WM_PAINT到子窗口,这就形成了循环。

所以,我不知道该怎么擦除父窗口才好,Invalidate肯定不行。
Eleven 2009-06-01
  • 打赏
  • 举报
回复
学习
spring203 2009-06-01
  • 打赏
  • 举报
回复
::RedrawWindow(hParent, rcInvalidate, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_NOCHILDREN);
应该可以一试, 细节实现,具体可以看看msdn说明,RDW_NOCHILDREN既是不绘制子窗口风格;当然实在没办法楼主只能更改实现方式了。
bofrobber 2009-06-01
  • 打赏
  • 举报
回复
你这个思路本来就有问题,
父窗口和子窗口一样大,由于子窗口会在父窗口上层,所有你的父窗口重画没有任何意义,
除非你父窗口重画的时候把子窗口隐藏(不过,这样你子窗口永远都显示不出来了)
cnzdgs 2009-05-31
  • 打赏
  • 举报
回复
同上,窗口加上WS_CLIPCHILDREN风格。
mynamelj 2009-05-31
  • 打赏
  • 举报
回复
1.使用WS_CLIPCHILDREN样式,使父窗口在重绘的时候剪切掉所有子窗口.

2.如果你自已处理WM_PAINT消息时你在驱动这个消息之前应该用InvalidateRect来刷新指定矩形区,在画的时候获得这个需要刷新的区域可以很准确的去画某块区域.
「已注销」 2009-05-31
  • 打赏
  • 举报
回复
invalidateRect的第一个参数是HWND,获取HWND即可
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 biweilun 的回复:]
得到父窗体指针
pWnd->Invalidate();
[/Quote]

up
zhanghaaaa 2009-05-31
  • 打赏
  • 举报
回复
pWnd->Invalidate();
yes!
biweilun 2009-05-31
  • 打赏
  • 举报
回复
得到父窗体指针
pWnd->Invalidate();

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧