【问题标题】:WINAPI / c++: Moving borderless windowWINAPI / c++:移动无边框窗口
【发布时间】:2013-07-06 10:05:47
【问题描述】:

我使用这些样式创建了一个无边框窗口:WS_VISIBLE | WS_POPUP | WS_OVERLAPPED

问题是窗口不能移动。我知道我可以做一些事情,比如获取鼠标点击位置,然后计算每次出现WM_MOUSEMOVE 时窗口的最终位置。

但是这个解决方案并不稳定,因为当我移动鼠标太快时,它会跳出窗口,然后它就没有反应了。我不想设置一个钩子,因为它们太慢了。我已经搜索了互联网,但什么都没有出现。

理想情况下,我想要创建一个窗口,可以在没有边框或标题的情况下移动,我不需要自己跟踪鼠标,但 Windows 会为我做这件事,就像制作整个窗口标题。

【问题讨论】:

  • 为什么表单需要响应您故意快速移动它?
  • @AustinBrunkhorst 因为这就是人们期望 Windows 的行为方式。如果你开始拖动一个窗口,窗口应该在你拖动结束的地方结束,而不是在鼠标光标碰巧超过窗口之间的某个点。
  • @HansPassant:也许吧,没看到。但无论如何,谢谢你的回答,jamesdlin。

标签: c++ winapi


【解决方案1】:

我知道我可以做一些事情,比如获取鼠标点击位置,然后计算每次出现WM_MOUSEMOVE 时窗口的最终位置。但是这个解决方案并不稳定,因为当我移动鼠标太快时,它会跳出窗口,然后它就没有反应了。

您可以通过在收到鼠标点击时调用SetCapture 来解决此问题。即使鼠标光标离开您的窗口,您也会继续收到WM_MOUSEMOVE。当用户完成拖动并释放鼠标光标后,您应该调用ReleaseCapture

理想情况下,我想要创建一个窗口,可以在没有边框或标题的情况下移动,我不需要自己跟踪鼠标,但 Windows 会为我做这件事,就像制作整个窗口标题。

如果你真的想这样做,你可以回复WM_NCHITTEST消息并返回HTCAPTION

【讨论】:

  • 如果整个窗口都应该是可拖动的,那么第二个选项就是赢家。这是解决拖动无边框窗口问题的标准方法,您会在整个网络上找到建议/解决方案。请确保您还处理了WM_SETCURSOR,以便为您的窗口的可拖动性提供正确的视觉提示。
  • 谢谢,第二个解决方案非常完美——正是我想要的。
  • 哦,我想给你+1,但我没有足够的声誉,因为这是我的第一个问题。 :(
  • @CodyGray 如果您不希望整个窗口可拖动,WM_NCHITTEST 处理程序只需要在返回 HTCAPTION 时更具选择性。
  • @jamesdin - 顺便说一句,我的老 htspy 直观而详细地介绍了该主题:files.rsdn.ru/42164/htspy.zip
【解决方案2】:

WM_LBUTTONDOWN 上尝试PostMessage(hwnd,WM_SYSCOMMAND,SC_SIZE+9,0)

【讨论】:

  • SC_SIZE+9 应该是什么?你的意思是SC_MOVE
  • SC_SIZE+9 = SC_DRAG,无证,试一试:-)
  • -1 用于推荐违反程序员合同的未记录功能,尤其是当有更好的、记录在案的解决问题的方法时
  • 即使它没有记录,+1 表示准确表达意图的 1-liner 解决方案(解决方案 NCHITTEST -> HTCAPTION 是一个谎言,谁知道单击标题会如何起作用未来?)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多