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

andymiaonuaa 2013-09-12 05:17:30
在窗口上创建了一个对话框子窗口,用鼠标拖动子窗口的时候会在父窗口上留下拖影,鼠标松开拖影就会消失,不松开拖影一直在。
在主窗口的wm_paint下面打了日志,发现拖动子窗口的时候主窗口确实收到了wm_paint消息。而松开鼠标的一瞬间并没有该消息产生,拖影反而消失了。请教各位这是什么原因?
...全文
1012 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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消息,为什么还会有拖影,而且为什么又在拖动完成,鼠标释放的瞬间父窗口完成重绘工作了呢? 先结贴吧!!
用九思维探索 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创建的
用九思维探索 2013-09-12
  • 打赏
  • 举报
回复
手机没电了,打字也慢,如果是createwindow,就不用试上面说得了,根据你主窗口的情况实现paint
用九思维探索 2013-09-12
  • 打赏
  • 举报
回复
你的主窗口有一个循环的线程吧,你尝试下在这个peekmessage,还有getmessage(我没在电脑旁,记不清函数名了),的线程里加个不停刷新背景的函数试试还有没有主窗口不重绘的现象
andymiaonuaa 2013-09-12
  • 打赏
  • 举报
回复
引用 6 楼 zpc38368330 的回复:
哦,子窗口是用CreateDialog加载的对话框,那么至少可以知道,这个对话框资源一定有自己的重绘的消息响应,你的主窗口是用的createwindow吧
嗯,对话框资源有自己的回调函数。主窗口正是用的createwindow创建的
andymiaonuaa 2013-09-12
  • 打赏
  • 举报
回复
引用 5 楼 zpc38368330 的回复:
会不会是你的子窗口一直在绘制着什么,而父窗口至少在子窗口移动的时间停止了绘制
看这个现象我也感觉是这样的,但是父窗口在子窗口拖动过程中确实是在不断的收到wm_paint消息。我理解是收到wm_paint消息就应该重绘的,是不是我的理解有误啊?
用九思维探索 2013-09-12
  • 打赏
  • 举报
回复
哦,子窗口是用CreateDialog加载的对话框,那么至少可以知道,这个对话框资源一定有自己的重绘的消息响应,你的主窗口是用的createwindow吧
用九思维探索 2013-09-12
  • 打赏
  • 举报
回复
会不会是你的子窗口一直在绘制着什么,而父窗口至少在子窗口移动的时间停止了绘制
andymiaonuaa 2013-09-12
  • 打赏
  • 举报
回复
引用 3 楼 zpc38368330 的回复:
鼠标松开了,子窗口不再移动,父窗口也就不再需要重绘了。 没见过这样的情况,如果父窗口不是你自绘的话,paint也没有重载过,有没有可能是系统的问题,我出过一次类似的问题,不过那是我的窗口重绘很慢闪屏,删了几个插件好了
程序是用windows api写的,没有用MFC。 另外,在其他子窗口上拖动没问题,就是主窗口不能在拖动的时候重绘。 子窗口都是通过CreateDialog加载对话框资源创建的,并且子窗口的回调函数中并没有对wm_paint消息进行处理,也没有return DefWindowProc,照样可以在拖动的时候及时重绘,这点我也不太能理解。
用九思维探索 2013-09-12
  • 打赏
  • 举报
回复
鼠标松开了,子窗口不再移动,父窗口也就不再需要重绘了。 没见过这样的情况,如果父窗口不是你自绘的话,paint也没有重载过,有没有可能是系统的问题,我出过一次类似的问题,不过那是我的窗口重绘很慢闪屏,删了几个插件好了
andymiaonuaa 2013-09-12
  • 打赏
  • 举报
回复
引用 1 楼 CometNet 的回复:
建议给父窗口和子窗口加入: WS_CLIPCHILDREN WS_CLIPSIBLINGS
按照您的方法试了下,还是不行。 有一点我比较奇怪,就是鼠标松开的瞬间父窗口并没有收到wm_paint消息,反而没有拖影了,是接收到了其他消息吗?
邓学彬 2013-09-12
  • 打赏
  • 举报
回复
建议给父窗口和子窗口加入: WS_CLIPCHILDREN WS_CLIPSIBLINGS
在CAD(计算机辅助设计)软件中,线性是构建采矿工程图的重要元素。"cad采矿用各种线性"指的是在CAD环境下,为了精确地表示采矿工程的地质结构、开采路径、巷道布局等,所使用的一系列特定线型。这些线型通常包括连续线、虚线、点划线以及定制的特殊线型,以便清晰地标识不同类型的地质特征、开采边界和安全区域。 线型在CAD中起到区分和标识不同对象的作用。例如,连续线可能用于表示巷道的实际走向,虚线可能用于表示规划中的巷道或尚未施工的部分,点划线则可能用于显示支撑结构或危险区域。通过选择合适的线型,工程师们可以更直观地理解采矿工程的设计和进度。 `.lin`文件是CAD中的线型文件,它包含了线型的定义。用户可以自定义线型,如设置线型的比例因、每个线段的长度和间隔,以及它们的组合方式。`.lin`文件可以被CAD软件读取,使得用户在绘图时能够选择并应用这些预定义的线型。 `.shp`和`.shx`文件则是与CAD中的形状文件相关的。`.shp`文件是一种存储地理空间数据的标准格式,通常包含几何对象(如点、线和多边形)的信息。在采矿领域,这些文件可能用于表示矿体的边界、巷道的位置或其他地质特征。`.shx`文件是`.shp`文件的索引,用于快速访问和处理数据,提高软件的性能。 结合这些文件,我们可以创建一个全面的采矿工程图,其中包括了各种定制的线性表示,使设计和分析工作更为准确高效。在实际操作中,工程师首先会根据需求定义或导入`.lin`文件,然后在绘制巷道、矿体和其他元素时选择相应的线型。同时,他们会利用`.shp`和`.shx`文件来加载和管理地理空间数据,以便在CAD环境中呈现采矿区域的三维视图和二维平面图。 通过熟练掌握CAD中的线性操作,采矿工程师能够更好地进行规划、模拟和沟通,确保采矿作业的安全性和经济性。此外,这些技术也可以应用于其他工程领域,如土木工程、地质调查等,因为线型的使用是通用的,旨在提供清晰的视觉表示和专业信息的传递。因此,深入理解和应用CAD中的线性是现代工程设计不可或缺的一部分。

15,980

社区成员

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

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