深入了解WM_SIZE

在窗口大小发生改变时,系统往窗口发送WM_SIZE消息,WPARAM指出窗口新的状态,LPARAM给出窗口新的大小。窗口的状态有三种:SIZE_MINIMIZE,SIZE_MAXIMIZE,SIZE_RESTORED。系统根据当前窗口的状态,在产生WM_SIZE消息时指定不同的WPARAM。然而,系统如何知道窗口当前的状态。很显然,系统必须用一些内存保存窗口当前的状态。保存在哪里呢?

        用spy++观察一个窗口,很快就可以发现在窗口最大化、最小化、正常状态下,style的值是不同的。在最小化时,会多出WS_MINIMIZE,在最大化时会多出WS_MAXIMIZE,在正常状态下则没有这两个值。所以,可断定窗口大小的状态是保存在GWL_STYLE对应的窗口数据结构中。

        通过ShowWindow可以改变窗口状态值,通过SetWindowLong也可以达到相同效果。需要注意的是,MoveWindow,SetWindowPos等函数并不会改变这些状态值。只要这些状态值没变,怎么改变窗口的大小都不会影响窗口右上角的系统按钮的显示(即根据不同状态显示最大化按钮还是显示还原按钮)。读者可以做一个小实验,在收到WPARAM为SIZE_RESTORED的WM_SIZE消息时调用SetWindowPos将窗口大小设置为屏幕大小,窗口右上角显示的应该是还原按钮。

        说了这么多,只想表达以下两个观点:

        1、窗口的最小化、最大化状态是保存在GWL_STYLE对应的内存中,一个窗口当前处于哪个状态是根据GWL_STYLE的值判断的,与窗口的实际大小无关;

        2、SetWindowPos, MoveWindow, SetWindowPlacement等函数不会改变窗口的最大化、最小化等状态。

        PS:如果调用SetWindowPos, MoveWindow等函数的前后,窗口大小没有发生变化,这些系统调用不会产生WM_SIZE消息。


你可能感兴趣的:(数据结构)