深入了解WM SIZE

2021-06-16 08:48:13 字數 859 閱讀 2014

在視窗大小發生改變時,系統往視窗傳送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訊息。

深入了解A

一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...

深入了解A

一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...

深入了解Dojo Data

譯自http www.sitepen.com blog 2010 10 13 dive into dojo data 使用dojo data有助於快速建立web應用的介面,且易於嵌入各種資料來源。它在使用者介面與底層資料之間提供了一層抽象層,使得使用者介面開發人員能夠專注於ui的開發,而無需擔心資料...