【问题标题】:How to handle drag event on a maximized window如何处理最大化窗口上的拖动事件
【发布时间】:2023-03-30 08:33:01
【问题描述】:

我有一个在 Win7 中运行的 MFC 应用程序,没有标题栏(即我的标题栏是自制的,带有用于恢复、最大化和关闭的自定义按钮)。在 Win7 中,当用户将窗口拖到屏幕顶部时,它会响应 Win 7 API 生成的最大化事件。但是,一旦最大化,我就无法捕获用户将窗口拖离顶部时发生的恢复事件。

我在双击时处理恢复,我在单击恢复按钮时处理恢复,但我无法检测到拖动。

我想它看起来类似于:

if (message == WM_WINDOWPOSCHANGING)
{
    // DETECT RESTORE MSG HERE.
}

但这似乎没有抓住它。就好像我在某个地方禁止在窗口最大化时移动它。

有没有办法让我阻止 WM_RESIZE?如何处理拖动事件以启用自动调整大小?

【问题讨论】:

    标签: winapi visual-c++ windows-7


    【解决方案1】:

    您是否尝试过在鼠标悬停在自定义标题栏上时处理返回 HTCAPTION(标题栏)的 WM_NCHITTEST 消息,从而允许正常的窗口处理而无需进一步自定义?

    【讨论】:

    • 这行不通,因为我们的虚假标题栏实际上是一条丝带(来自 CWnd)。当我捕获命中测试并返回它是 HTCaption 时,功能区会在主框架周围拖动并在窗口边缘剪裁。 :(
    • 这很不幸。我唯一的另一个想法是更改 UI 以允许从主窗口显示“拖动区域” - 然后 WM_NCHITTEST 将起作用 - 可能类似于 Chrome 的工作方式。
    • 是的,我想知道 Chrome 是如何设法获得拖放恢复功能的。
    • 看起来 Google 已经创建了自己的 WS_CAPTION 样式。
    • 查看codeguru.com/cpp/frameworks/advancedui/article.php/c3215 - 特别是(imo)CMultiLineCaption - 实际上你想要反过来我怀疑制作一个更小的标题......
    【解决方案2】:

    我发现由于应用程序没有标题栏,win7 不处理窗口拖动,因此根本不发送 WM_SYSCOMMAND。换句话说,应用程序阻止了标题栏的拖动,因为没有没有标题栏可以拖动。

    解决方案部分是为了检测我们模拟的标题栏上的拖拽。之后,窗口必须仅恢复为 SIZE,而不是恢复原位。位置需要对光标是动态的,就像 Win7 那样。想法,人们?

    【讨论】:

      猜你喜欢
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      相关资源
      最近更新 更多