【问题标题】:Problems with refreshing a draggable MFC window刷新可拖动 MFC 窗口的问题
【发布时间】:2010-12-20 09:16:10
【问题描述】:

您好。

我必须制作一个可拖动的 MFC 对话框窗口,它有一个背景 - 使用的是:http://www.codeproject.com/KB/graphics/picturewindow.aspx - 并且有几个图片框控件。我尝试了两种方法,虽然它们确实有效,但它们存在一些问题。

第一种方法是“手动”- 在 LBUTTONDOWN 消息上,我检查它是否位于窗口的干净区域,并设置一个标志变量。在 MOUSEMOVE 上,检查标志,如果设置,则调用 MoveWindow 函数,然后调用 Invalidate(1)。在 LBUTTONUP 上,未设置标志。 这种方法可以正常工作并根据需要重新绘制,但不知何故非常慢 - 如果我将光标移动得太快,则窗口会掉落并且不会被拖动,因为光标不再位于窗口上方。

第二种方法是“自动”——我只是调用

DefWindowProc(WM_SYSCOMMAND, SC_MOVE+2,MAKELPARAM(point.x,point.y));

在 LBUTTONDOWN 上,它会处理其余部分,它很快而且从不落后,但是当我将它拖到屏幕边缘时(这样窗口的某些部分变得不可见),当我将它拖回来时,所有控件都变得不可见并且没有刷新,背景还可以。我想这是因为 Invalidate() 在移动过程中没有被调用,因为我实际上是在调用 DefWindowProc() 之后调用它,所以当我按下按钮时,一切都会正确刷新。

我应该如何改进这两种解决方案?我需要它既快速又正确。我可能没有提供一些必需的信息,如果需要,我会补充。

提前致谢。

【问题讨论】:

    标签: visual-c++ mfc window drag flicker


    【解决方案1】:

    通过修改第二种方式解决了问题。我在 OnPaint() 中添加了一个完全重绘,为了消除闪烁,我只在拖动过程中使用标志变量重绘。

    【讨论】:

      猜你喜欢
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多