拖动子窗口,父窗口重绘有问题,产生拖影

andymiaonuaa 2013-09-12 05:17:30
在窗口上创建了一个对话框子窗口,用鼠标拖动子窗口的时候会在父窗口上留下拖影,鼠标松开拖影就会消失,不松开拖影一直在。
在主窗口的wm_paint下面打了日志,发现拖动子窗口的时候主窗口确实收到了wm_paint消息。而松开鼠标的一瞬间并没有该消息产生,拖影反而消失了。请教各位这是什么原因?
...全文
731 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
一线灵 2014-10-11
  • 打赏
  • 举报
回复
今天终于找出楼主问题的解决方案了, 父窗口设置个颜色画刷就行了,随便什么颜色都行 ::SetClassLongPtrW(hWndParent, GCL_HBRBACKGROUND, (LONG_PTR)::CreateSolidBrush(RGB(0, 0, 0));
chenkang_apple123 2014-01-15
  • 打赏
  • 举报
回复
当你拖动子窗口的时候,主窗口时卡死的,你解决下鼠标点击窗口边框,还能继续能收到消息,就可以l
andymiaonuaa 2013-09-17
  • 打赏
  • 举报
回复
引用 12 楼 zpc38368330 的回复:
其他窗口也都是主线程通过createwindow创建的 问题应该就在这,你创建一线程,然后用线程创建子窗口,问题一定会解决,我以前写过这样的程序,没出过楼主的问题, 至于为什么子窗口间拖动不会出现拖痕,这个我还真有点想不透,我先来大约猜下楼主的情况,当楼主拖动子窗口的时间,系统向主线程发送了WM_MOVE的消息,(因为子窗口也是在主进程里创建的,所以WM_MOVE发给主线程),因为主线程一直再处理WM_MOVE消息,所以PAINT消息一直在排队列,没有被处理。 再大约分析下,你的CreateDialog,VC里随便用个dlg.DoModal(),或者用非模态,都是在主进程内用的,但是绝不会发生子窗口拖动影响父窗口的问题,既然如此,那么是不是每一个DoModal都应该创建了一子窗口的线程,那么CreateDialog估计也会创建子窗口的线程,。。。。。 LZ别急,我也有点糊涂了,既然子窗口已经创建了线程,那么为什么父窗口还有拖痕,我猜这个CreateDialog创建子窗口的外部框架的相关消息是在主线程内执行?即WM_MOVE在主线程处理? 哪个DoModal的外部框架又是怎么回事@#@#!@¥ 只能解释DoModal创建的窗口一上来就是在线程里创建的。。。。。 额,解释的有点乱,我要出去跑跑长辈家,要过15了,心里有点急,想到哪说哪。。 楼主不放跟踪下DoModal看看有没有什么发现,我走了
新建一个线程,再CreateDialog问题完美解决。 但是实在是想不通为什么之前的方式会有问题。 而且按照之前的方法,有一点跟你猜想的不一样。在子窗口拖动过程中,父窗口确实是接收到了wm_paint消息了,并且做了处理(这个我在wm_paint的case中加了日志)。所以想不通既然处理了wm_paint消息,为什么还会有拖影,而且为什么又在拖动完成,鼠标释放的瞬间父窗口完成重绘工作了呢? 先结贴吧!!
zpc38368330 2013-09-15
  • 打赏
  • 举报
回复
其他窗口也都是主线程通过createwindow创建的 问题应该就在这,你创建一线程,然后用线程创建子窗口,问题一定会解决,我以前写过这样的程序,没出过楼主的问题, 至于为什么子窗口间拖动不会出现拖痕,这个我还真有点想不透,我先来大约猜下楼主的情况,当楼主拖动子窗口的时间,系统向主线程发送了WM_MOVE的消息,(因为子窗口也是在主进程里创建的,所以WM_MOVE发给主线程),因为主线程一直再处理WM_MOVE消息,所以PAINT消息一直在排队列,没有被处理。 再大约分析下,你的CreateDialog,VC里随便用个dlg.DoModal(),或者用非模态,都是在主进程内用的,但是绝不会发生子窗口拖动影响父窗口的问题,既然如此,那么是不是每一个DoModal都应该创建了一子窗口的线程,那么CreateDialog估计也会创建子窗口的线程,。。。。。 LZ别急,我也有点糊涂了,既然子窗口已经创建了线程,那么为什么父窗口还有拖痕,我猜这个CreateDialog创建子窗口的外部框架的相关消息是在主线程内执行?即WM_MOVE在主线程处理? 哪个DoModal的外部框架又是怎么回事@#@#!@¥ 只能解释DoModal创建的窗口一上来就是在线程里创建的。。。。。 额,解释的有点乱,我要出去跑跑长辈家,要过15了,心里有点急,想到哪说哪。。 楼主不放跟踪下DoModal看看有没有什么发现,我走了
andymiaonuaa 2013-09-13
  • 打赏
  • 举报
回复
引用 10 楼 zpc38368330 的回复:
手机没电了,打字也慢,如果是createwindow,就不用试上面说得了,根据你主窗口的情况实现paint
试了各种方法还是不行。 这个拖影问题只有子窗口在主窗口上拖动的时候会发生,其他软件的窗口在上面拖动则没有这个问题。 另外我的程序是有多个线程的,不过只有主窗口由主线程控制的,其他窗口也都是主线程通过createwindow创建的
zpc38368330 2013-09-12
  • 打赏
  • 举报
回复
手机没电了,打字也慢,如果是createwindow,就不用试上面说得了,根据你主窗口的情况实现paint
zpc38368330 2013-09-12
  • 打赏
  • 举报
回复
你的主窗口有一个循环的线程吧,你尝试下在这个peekmessage,还有getmessage(我没在电脑旁,记不清函数名了),的线程里加个不停刷新背景的函数试试还有没有主窗口不重绘的现象
andymiaonuaa 2013-09-12
  • 打赏
  • 举报
回复
引用 6 楼 zpc38368330 的回复:
哦,子窗口是用CreateDialog加载的对话框,那么至少可以知道,这个对话框资源一定有自己的重绘的消息响应,你的主窗口是用的createwindow吧
嗯,对话框资源有自己的回调函数。主窗口正是用的createwindow创建的
andymiaonuaa 2013-09-12
  • 打赏
  • 举报
回复
引用 5 楼 zpc38368330 的回复:
会不会是你的子窗口一直在绘制着什么,而父窗口至少在子窗口移动的时间停止了绘制
看这个现象我也感觉是这样的,但是父窗口在子窗口拖动过程中确实是在不断的收到wm_paint消息。我理解是收到wm_paint消息就应该重绘的,是不是我的理解有误啊?
zpc38368330 2013-09-12
  • 打赏
  • 举报
回复
哦,子窗口是用CreateDialog加载的对话框,那么至少可以知道,这个对话框资源一定有自己的重绘的消息响应,你的主窗口是用的createwindow吧
zpc38368330 2013-09-12
  • 打赏
  • 举报
回复
会不会是你的子窗口一直在绘制着什么,而父窗口至少在子窗口移动的时间停止了绘制
andymiaonuaa 2013-09-12
  • 打赏
  • 举报
回复
引用 3 楼 zpc38368330 的回复:
鼠标松开了,子窗口不再移动,父窗口也就不再需要重绘了。 没见过这样的情况,如果父窗口不是你自绘的话,paint也没有重载过,有没有可能是系统的问题,我出过一次类似的问题,不过那是我的窗口重绘很慢闪屏,删了几个插件好了
程序是用windows api写的,没有用MFC。 另外,在其他子窗口上拖动没问题,就是主窗口不能在拖动的时候重绘。 子窗口都是通过CreateDialog加载对话框资源创建的,并且子窗口的回调函数中并没有对wm_paint消息进行处理,也没有return DefWindowProc,照样可以在拖动的时候及时重绘,这点我也不太能理解。
zpc38368330 2013-09-12
  • 打赏
  • 举报
回复
鼠标松开了,子窗口不再移动,父窗口也就不再需要重绘了。 没见过这样的情况,如果父窗口不是你自绘的话,paint也没有重载过,有没有可能是系统的问题,我出过一次类似的问题,不过那是我的窗口重绘很慢闪屏,删了几个插件好了
andymiaonuaa 2013-09-12
  • 打赏
  • 举报
回复
引用 1 楼 CometNet 的回复:
建议给父窗口和子窗口加入: WS_CLIPCHILDREN WS_CLIPSIBLINGS
按照您的方法试了下,还是不行。 有一点我比较奇怪,就是鼠标松开的瞬间父窗口并没有收到wm_paint消息,反而没有拖影了,是接收到了其他消息吗?
邓学彬 2013-09-12
  • 打赏
  • 举报
回复
建议给父窗口和子窗口加入: WS_CLIPCHILDREN WS_CLIPSIBLINGS

15,980

社区成员

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

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