none
自制窗口边框如何支持Win7的边缘停靠? RRS feed

  • 问题

  • 情况是这样的,为了实现窗口边框的自绘,我们把WinForm的边框设为了None,并且在窗体四周手动绘制了自制的边框。同时,还自己处理了窗口的系统按钮绘制、移动、缩放等功能,而且到目前为止效果还是挺满意的,缩放重绘时也不像用Hook闪烁的那么厉害。

    一切都很不错,直到遇到了现在的这个问题:在Win7下不支持屏幕边缘停靠时的自动拉伸。因为窗口已经没有了本来的标题栏,所以这个行为也就消失了。

    考虑到QQ在Win7下推出的初期,曾经和Win7的这个停靠功能有冲突,即当主面板移到屏幕顶部时,窗口会自动最大化而不是缩进去。后来QQ解决了这个问题,因此我们觉得Windows Api里应该是有这么一个消息,但是在网上找了半天也没有找到。

    不知道论坛里的各位前辈们有没有碰到过这个问题?真心求教处理方法!谢谢!!


    Improving myself without stop.
    2010年11月18日 10:32

答案

  • 您需要实现对 Windows 7 侧边停靠窗口自动调整的支持还是屏蔽该默认行为?

    如果需要支持该功能,可以在 WM_MOUSEMOVE 的时候检测是否窗体已经靠近屏幕;如果靠近,则利用 SetWindowLong 把 WS_RESIZE 加到窗口基本样式中 (GetWindowLong(hWnd, GWL_STYLE)),反之,把 WM_RESIZE 干掉。

    自己觉得 Tencent 应该是参考这个而实现的。


    Mark Zhou
    2010年11月19日 6:28

全部回复

  • 发现只有当FormBorderStyle设置为Sizable或者xxxSizable的时候才有可能实现停靠缩放的功能,不知道可否用什么办法来为窗体设置一个标记,骗过Windows的消息处理?
    Improving myself without stop.
    2010年11月18日 17:26
  • 您需要实现对 Windows 7 侧边停靠窗口自动调整的支持还是屏蔽该默认行为?

    如果需要支持该功能,可以在 WM_MOUSEMOVE 的时候检测是否窗体已经靠近屏幕;如果靠近,则利用 SetWindowLong 把 WS_RESIZE 加到窗口基本样式中 (GetWindowLong(hWnd, GWL_STYLE)),反之,把 WM_RESIZE 干掉。

    自己觉得 Tencent 应该是参考这个而实现的。


    Mark Zhou
    2010年11月19日 6:28
  • 根本就没有  WS_RESIZE 样式,只有  WS_SIZEBOX,但是添加了个样式,窗口会出现系统的边框
    2014年2月19日 10:51