用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消息。