共用方式為


什麼是視窗?

什麼是視窗?

很明顯地,視窗是 Windows 的核心。 它們很重要,因此在作業系統之後命名為作業系統。 但什麼是視窗? 當您考慮視窗時,您可能會想出類似這樣的內容:

應用程式視窗的螢幕擷取畫面

這種類型的視窗稱為 應用程式視窗主視窗。 它通常具有標題列、 最小化最大化 按鈕和其他標準 UI 元素的框架。 此框架稱為視窗 的非工作區 ,因此稱為 ,因為作業系統會管理該部分的視窗。 框架內的區域是 工作區。 這是程式所管理視窗的一部分。

以下是另一種類型的視窗:

控制項視窗的螢幕擷取畫面

如果您不熟悉 Windows 程式設計,可能會讓您意外看到 UI 控制項,例如按鈕和編輯方塊本身是視窗。 UI 控制項與應用程式視窗之間的主要差異在於控制項本身不存在。 相反地,控制項會置於相對於應用程式視窗的位置。 當您拖曳應用程式視窗時,控制項會隨著預期移動。 此外,控制項和應用程式視窗也可以彼此通訊。 (例如,應用程式視窗會從 button.) 接收按一下通知

因此,當您認為 視窗時,不只考慮 應用程式視窗。 相反地,請將視窗視為程式設計建構::

  • 佔用畫面的特定部分。
  • 可能或可能不會在指定時間看到。
  • 知道如何繪製本身。
  • 回應使用者或作業系統的事件。

父視窗和擁有者 Windows

在 UI 控制項的情況下,控制項視窗稱為應用程式視窗的 系。 應用程式視窗是控制項視窗的 代。 父視窗提供用來定位子視窗的座標系統。 擁有父視窗會影響視窗外觀的外觀;例如,會裁剪子視窗,讓子視窗的一部分無法出現在其父視窗的框線之外。

另一個關聯性是應用程式視窗與強制回應對話方塊視窗之間的關聯性。 當應用程式顯示強制回應對話方塊時,應用程式視窗是 擁有者 視窗,而對話方塊是 擁有 的視窗。 擁有的視窗一律會出現在其擁有者視窗前面。 當擁有者最小化且與擁有者同時終結時,它就會隱藏。

下圖顯示顯示具有兩個按鈕之對話方塊的應用程式:

具有對話方塊的應用程式螢幕擷取畫面

應用程式視窗擁有對話方塊視窗,而對話方塊視窗是這兩個按鈕視窗的父代。 下圖顯示這些關聯:

顯示父系/子系和擁有者/擁有關聯性圖例

視窗控點

Windows 是物件,它們同時具有程式碼和資料,但它們不是 C++ 類別。 相反地,程式會使用稱為 控制碼的值來參考視窗。 控制碼是不透明的類型。 基本上,只是作業系統用來識別物件的數位。 您可以將 Windows 視為具有已建立之所有視窗的大型資料表。 它會使用此資料表依控制碼查閱視窗。 (這是否完全是內部運作方式並不重要。) 視窗控制碼的資料類型是HWND,通常是「aitch-wind」。視窗控制碼是由建立視窗的函式所傳回:CreateWindow 和 CreateWindowEx

若要在視窗上執行作業,您通常會呼叫一些以 HWND 值作為參數的函式。 例如,若要重新置放螢幕上的視窗,請呼叫 MoveWindow 函式:

BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint);

第一個參數是您要移動之視窗的控制碼。 其他參數會指定視窗的新位置,以及是否應該重新繪製視窗。

請記住,控制碼不是指標。 如果 hwnd 是包含控制碼的變數,則嘗試藉由寫入 *hwnd 來取值控制碼是錯誤。

螢幕和視窗座標

座標會以裝置無關的圖元來測量。 當我們討論圖形時,我們將有更多關於裝置獨立圖元的裝置獨立部分。

視您的工作而定,您可能會測量相對於畫面的座標、相對於視窗 (包括框架) ,或相對於視窗的工作區。 例如,您會使用螢幕座標在畫面上放置視窗,但您會使用用戶端座標在視窗內繪製。 在每個案例中,來源 (0,0) 一律是區域的左上角。

顯示幕幕、視窗和用戶端座標的圖例

下一個

WinMain:應用程式進入點