如何限制窗口位置及大小

如果需要在用户改变窗口大小时进行限制。比如限制窗口的最小尺寸/最大尺寸,应该处理窗口的WM_GETMINMAXINFO消息。具体的使用方法请参考MSDN。

如果在改变大小时要实现特殊的逻辑,比如像VIM编辑器,在改变窗口的高度时总是以行高为单位,以避免窗口会出现半行文字。这个可以处理窗口的WM_WINDOWPOSCHANGING消息。这个事件在真正改变窗口大小之前发送,修改其中LPWINDOWPOS中的cy和cx值就可以限制窗口大小。

上面的这些处理千万不要放在WM_SIZE中,虽然也可以实现但会导致窗口出现闪烁。

如果还需要知道用户是通过拖动窗口哪个边界来改变窗口的大小。比如说如果当前窗口只显示了一个大图的一小部分,如果用户拖动窗口上边框来改变窗口的大小,这时应保持窗口下部显示内容相对不变,同样如果用户拖动窗口的左边框来改变窗口的大小,应该保持窗口右边的显示区域不变。不过我发现大多数软件都没有处理这个逻辑,比如PhotoShop。它总是保持显示内容左上角的位置不变,这样如果中在显示大图的一部分时拖动窗口的左边框、上边框或是左上角,整个显示的内容会抖动很不爽。

在改变大小时要感知用户是拖动了窗口的哪个边框来改变大小的,可以处理窗口的WM_SIZING消息,该消息的wParam参数指明了窗口的哪一条边或哪一角的位置改变了。(注意:WM_SIZING只在用户交互式的改变窗口大小时才触发,一些间接的改变大小的行为:如窗口复原,平铺窗口,只会触发WM_WINDOWPOSCHANGING。)

2 Comments

  1. liuchun 说:

    发现了,顶一下

  2. DongKai 说:

    又学到一手,谢谢潘哥!

Leave a Reply