關於 Windows

本主題描述應用程式用來建立和使用視窗的程式設計專案;管理視窗之間的關聯性;和 大小、移動和顯示視窗。

概觀包含下列主題。

桌面視窗

當您啟動系統時,會自動建立桌面視窗。 桌面視窗是系統定義的視窗,可繪製螢幕的背景,並做為所有應用程式所顯示之所有視窗的基底。

桌面視窗會使用點陣圖繪製螢幕背景。 點陣圖所建立的圖樣稱為 桌面桌布。 根據預設,桌面視窗會使用登錄中所指定.bmp檔案中的點陣圖做為桌面桌布。

GetDesktopWindow函式會傳回桌面視窗的控制碼。

系統組態應用程式,例如主控台專案,會使用SystemParametersInfo函式,將wAction參數設定為SPI_SETDESKWALLPAPER,以及指定點陣圖檔案名的 lpvParam參數,來變更桌面桌布。 SystemParametersInfo 接著會從指定的檔案載入點陣圖、使用點陣圖繪製畫面的背景,然後在登錄中輸入新的檔案名。

應用程式視窗

每個圖形化 Windows 應用程式都會建立至少一個視窗,稱為 主視窗,做為使用者與應用程式之間的主要介面。 大部分的應用程式也會直接或間接建立其他視窗,以執行與主視窗相關的工作。 每個視窗在顯示輸出和接收來自使用者的輸入時扮演一部分。

當您啟動應用程式時,系統也會將工作列按鈕與應用程式產生關聯。 工作列按鈕包含程式圖示和標題。 當應用程式處於作用中狀態時,其工作列按鈕會以推送狀態顯示。

應用程式視窗包含標題列、功能表列、視窗功能表 (先前稱為系統功能表) 、最小化按鈕、最大化按鈕、還原按鈕、關閉按鈕、調整大小框線、用戶端應用程式、水準捲軸和垂直捲動條等元素。 應用程式的主視窗通常包含所有這些元件。 下圖顯示一般主視窗中的這些元件。

一般視窗

工作區

工作區是應用程式顯示輸出的視窗部分,例如文字或圖形。 例如,傳統型發佈應用程式會在工作區中顯示檔的目前頁面。 應用程式必須提供稱為視窗程式的函式,才能處理視窗的輸入,並在工作區中顯示輸出。 如需詳細資訊,請參閱 Window 程序

非用戶端區域

標題列、功能表列、視窗功能表、最小化和最大化按鈕、調整大小框線和捲軸統稱為視窗 的非工作區。 系統會管理非用戶端區域的大部分層面;應用程式會管理其工作區的外觀和行為。

標題列會顯示應用程式定義的圖示和文字行;一般而言,文字會指定應用程式的名稱,或指出視窗的用途。 應用程式會在建立視窗時指定圖示和文字。 標題列也可讓使用者使用滑鼠或其他指向裝置移動視窗。

大部分的應用程式都包含 一個功能表列 ,其中列出應用程式支援的命令。 功能表列中的專案代表命令的主要類別。 按一下功能表列上的專案通常會開啟快顯視窗,其專案會對應至指定類別內的工作。 按一下命令,使用者就會指示應用程式執行工作。

視窗功能表是由系統建立和管理。 它包含一組標準功能表項目,當使用者選擇時,請設定視窗的大小或位置、關閉應用程式或執行工作。 如需詳細資訊,請參閱 功能表

右上角的按鈕會影響視窗的大小和位置。 當您按一下 最大化按鈕時,系統會將視窗放大到螢幕大小並放置視窗,因此它會涵蓋整個桌面,減去工作列。 同時,系統會將最大化按鈕取代為還原按鈕。 當您按一下 [還原] 按鈕時,系統會將視窗還原為其先前的大小和位置。 當您按一下 最小化按鈕時,系統會將視窗縮減為其工作列按鈕的大小、將視窗置於工作列按鈕上方,並顯示工作列按鈕處於正常狀態。 若要將應用程式還原至先前的大小和位置,請按一下其工作列按鈕。 當您按一下 [關閉] 按鈕時,應用程式就會結束。

調整大小框線是視窗周邊周圍的區域,可讓使用者使用滑鼠或其他指向裝置調整視窗大小。

水準捲軸垂直捲動條會將滑鼠或鍵盤輸入轉換成應用程式用來水準或垂直移轉工作區內容的值。 例如,顯示冗長檔的文字處理應用程式通常會提供垂直捲動條,讓使用者可透過檔向上和向下頁面。

控制項和對話方塊

除了主視窗之外,應用程式還可以建立數種類型的視窗,包括控制項和對話方塊。

控制項是應用程式用來從使用者取得特定資訊片段的視窗,例如開啟的檔案名或文字選取範圍所需的點大小。 應用程式也會使用控制項來取得控制應用程式特定功能所需的資訊。 例如,文字處理應用程式通常會提供控制項,讓使用者開啟和關閉換行。 如需詳細資訊,請參閱 Windows 控制項

控制項一律會與另一個視窗搭配使用,通常是對話方塊。 對話方塊是包含一或多個控制項的視窗。 應用程式會使用對話方塊來提示使用者輸入完成命令所需的輸入。 例如,包含開啟檔案之命令的應用程式會顯示對話方塊,其中包含使用者指定路徑和檔案名的控制項。 對話方塊通常不會使用與主視窗相同的視窗元件集。 大部分都有標題列、視窗功能表、框線 (非調整大小) 和工作區,但通常沒有功能表列、最小化和最大化按鈕或捲軸。 如需詳細資訊,請參閱 對話方塊

訊息方塊是特殊的對話方塊,可向使用者顯示附注、警告或警告。 例如,訊息方塊可以通知使用者執行工作時應用程式遇到的問題。 如需詳細資訊,請參閱 訊息方塊

視窗屬性

建立視窗時,應用程式必須提供下列資訊。 (除了 視窗控制碼之外,建立函式會傳回以唯一識別新的 window.)

下列各節將說明這些視窗屬性。

類別名稱

每個視窗都屬於視窗類別。 應用程式必須先註冊視窗類別,才能建立該類別的任何視窗。 視窗類別會定義視窗外觀和行為的大部分層面。 視窗類別的主要元件是 視窗程式,此函式會接收並處理傳送至視窗的所有輸入和要求。 系統會以 訊息形式提供輸入和要求。 如需詳細資訊,請參閱視窗類別視窗程式和訊息佇列

視窗名稱

視窗名稱是一個文字字串,可識別使用者的視窗。 如果存在,主視窗、對話方塊或訊息方塊通常會在其標題列中顯示其視窗名稱。 控制項可能會根據控制項的 類別顯示其視窗名稱。 例如,按鈕、編輯控制項和靜態控制項會在控制項所佔用的矩形內顯示其視窗名稱。 不過,清單方塊和下拉式方塊等控制項不會顯示其視窗名稱。

若要在建立視窗之後變更視窗名稱,請使用 SetWindowText 函式 。 此函式會使用 GetWindowTextLengthGetWindowText 函式,從視窗中擷取目前的視窗名稱字串。

視窗樣式

每個視窗都有一或多個視窗樣式。 視窗樣式是一個具名常數,定義視窗外觀和行為的外觀和行為,該外觀和行為不是由視窗類別所指定。 應用程式通常會在建立視窗時設定視窗樣式。 您也可以使用 SetWindowLong 函式在建立視窗之後設定樣式。

系統,而且在某個範圍內,類別的視窗程式會解譯視窗樣式。

某些視窗樣式適用于所有視窗,但大部分適用于特定視窗類別的視窗。 一般視窗樣式是由開頭為 WS_ 前置詞的常數表示;它們可以與 OR 運算子結合,以形成不同類型的視窗,包括主視窗、對話方塊和子視窗。 類別特定的視窗樣式會定義屬於預先定義控制項類別的視窗外觀和行為。 例如, SCROLLBAR 類別會指定捲軸控制項,但 SBS_HORZSBS_VERT 樣式會決定是否建立水準或垂直捲動條控制項。

如需視窗可使用的樣式清單,請參閱下列主題:

延伸視窗樣式

每個視窗可以選擇性地擁有一或多個延伸視窗樣式。 擴充視窗樣式是一個具名常數,可定義視窗的外觀和行為,而視窗類別或其他視窗樣式未指定的行為。 應用程式通常會在建立視窗時設定延伸視窗樣式。 您也可以使用 SetWindowLong 函式在建立視窗之後設定樣式。

如需詳細資訊,請參閱 CreateWindowEx

Position

視窗的位置定義為其左上角的座標。 這些座標有時稱為視窗座標,一律相對於畫面的左上角,或父視窗工作區左上角的子視窗。 例如,具有座標 (10,10) 的最上層視窗會放置在畫面左上角的 10 圖元,並從中向下放置 10 圖元。 具有座標 (10,10) 的子視窗會放置在其父視窗工作區左上角右上角的 10 圖元,並從中向下放置 10 圖元。

WindowFromPoint函式會擷取畫面上佔用特定點之視窗的控制碼。 同樣地,ChildWindowFromPoint 和 ChildWindowFromPointEx函式會擷取子視窗的控制碼,而該子視窗佔用父視窗工作區中的特定點。 雖然 ChildWindowFromPointEx 可以忽略不可見、停用和透明子視窗, 但 ChildWindowFromPoint 無法。

大小

視窗的大小 (寬度和高度) 以圖元表示。 視窗可以有零寬度或高度。 如果應用程式將視窗的寬度和高度設定為零,則系統會將大小設定為預設的最小視窗大小。 若要探索預設的視窗大小下限,應用程式會使用 GetSystemMetrics 函式搭配 SM_CXMINSM_CYMIN 旗標。

應用程式可能需要建立具有特定大小的工作區的視窗。 AdjustWindowRect 和 AdjustWindowRectEx式會根據所需的工作區大小來計算視窗所需的大小。 應用程式可以將產生的大小值傳遞至 CreateWindowEx 函式。

應用程式可以調整視窗大小,使其非常大;不過,它不應該調整視窗的大小,使其大於螢幕。 在設定視窗的大小之前,應用程式應該使用 GetSystemMetrics 搭配 SM_CXSCREENSM_CYSCREEN 旗標來檢查畫面的寬度和高度。

父視窗或擁有者視窗控制碼

視窗可以有父視窗。 具有父視窗的 視窗稱為子視窗父視窗提供用來定位子視窗的座標系統。 擁有父視窗會影響視窗外觀的外觀;例如,會裁剪子視窗,讓子視窗的一部分無法出現在其父視窗的框線之外。

沒有父視窗或父視窗是桌面視窗的視窗稱為 最上層視窗。 應用程式可以使用 EnumWindows 函式來取得畫面上每個最上層視窗的控制碼。 EnumWindows 會將控制碼傳遞至每個最上層視窗,然後傳遞至應用程式定義的回呼函式 EnumWindowsProc

最上層視窗可以擁有或由另一個視窗擁有。 擁有的視窗一律會出現在其擁有者視窗前面、在擁有者視窗最小化時隱藏,並在其擁有者視窗終結時遭到終結。 如需詳細資訊,請參閱 擁有的 Windows

子視窗可以有 子視窗 識別碼、與子視窗相關聯的唯一應用程式定義值。 子視窗識別碼在建立多個子視窗的應用程式中特別有用。 建立子視窗時,應用程式會指定子視窗的識別碼。 建立視窗之後,應用程式可以使用 SetWindowLong 函式來變更視窗的識別碼,或使用 GetWindowLong 函式來擷取識別碼。

除了子視窗以外,每個視窗都可以有功能表。 應用程式可以藉由在註冊視窗的類別或建立視窗時提供功能表控制碼來包含功能表。

應用程式實例控制碼

每個應用程式都有與其相關聯的實例控制碼。 系統會在應用程式啟動時提供應用程式的實例控制碼。 由於它可以執行相同應用程式的多個複本,因此系統會在內部使用 實例來區分應用程式的一個實例與另一個實例。 應用程式必須在許多不同的視窗中指定實例控制碼,包括建立視窗的控制碼。

建立資料

每個視窗都可以有與其相關聯的應用程式定義建立資料。 第一次建立視窗時,系統會將指標傳遞給所建立視窗的視窗程式。 視窗程式會使用資料來初始化應用程式定義的變數。

視窗控制代碼

建立視窗之後,建立函式會傳回可唯一識別 視窗的視窗控制碼 。 視窗控制碼具有 HWND 資料類型;當宣告保存視窗控制碼的變數時,應用程式必須使用這個類型。 應用程式會在其他函式中使用這個控制碼,將其動作導向視窗。

應用程式可以使用 FindWindow 函式來探索具有指定類別名稱或視窗名稱的視窗是否存在於系統中。 如果這類視窗存在, FindWindow 會傳回視窗的控制碼。 若要將搜尋限制為特定應用程式的子視窗,請使用 FindWindowEx 函式。

IsWindow函式會判斷視窗控制碼是否識別有效的現有視窗。 有特殊常數可以取代特定函式中的視窗控制碼。 例如,應用程式可以在SendMessageSendMessageTimeout函式中使用HWND_BROADCAST,或在MapWindowPoints函式中使用HWND_DESKTOP

視窗建立

若要建立應用程式視窗,請使用 CreateWindowCreateWindowEx 函 式。 您必須提供定義視窗屬性所需的資訊。 CreateWindowEx具有CreateWindow沒有的參數dwExStyle;否則,函式完全相同。 事實上, CreateWindow 只會呼叫 CreateWindowEx並將 dwExStyle 參數設定為零。 基於這個理由,本概觀的其餘部分只是指 CreateWindowEx

本節包含下列主題:

注意

還有其他函式可用來建立特殊用途視窗,例如對話方塊和訊息方塊。 如需詳細資訊,請參閱 DialogBoxCreateDialogMessageBox

 

主視窗建立

每個以 Windows 為基礎的應用程式都必須有 WinMain 做為其進入點函式。 WinMain 會執行一些工作,包括註冊主視窗的視窗類別,以及建立主視窗。 WinMain 會藉由呼叫 RegisterClass 函式來註冊主視窗類別,並藉由呼叫 CreateWindowEx 函 式來建立主視窗。

您的 WinMain 函式也可以將您的應用程式限制為單一實例。 使用 CreateMutex 函式建立具名 Mutex。 如果 GetLastError 傳回 ERROR_ALREADY_EXISTS,則應用程式的另一個實例存在, (它建立了 mutex) ,您應該結束 WinMain

系統在建立後不會自動顯示主視窗;相反地,應用程式必須使用 ShowWindow 函式來顯示主視窗。 建立主視窗之後,應用程式的 WinMain 函式會呼叫 ShowWindow,並傳遞兩個參數:主視窗的控制碼,以及指定第一次顯示主視窗時應該最小化或最大化的旗標。 一般而言,旗標可以設定為開頭為 SW_ 前置詞的任何常數。 不過,呼叫 ShowWindow 以顯示應用程式主視窗時,旗標必須設定為 SW_SHOWDEFAULT。 此旗標會指示系統顯示由啟動應用程式之程式所指示的視窗。

如果視窗類別已向 Unicode 版本的 RegisterClass註冊,則視窗只會接收 Unicode 訊息。 若要判斷視窗是否使用 Unicode 字元集,請呼叫 IsWindowUnicode

Window-Creation訊息

建立任何視窗時,系統會將訊息傳送至視窗的視窗程式。 系統會在建立視窗的非工作區之後傳送 WM_NCCREATE 訊息,並在建立工作區之後傳送 WM_CREATE 訊息。 視窗程式會在系統顯示視窗之前收到這兩則訊息。 這兩則訊息都包含 CREATESTRUCT 結構的指標,其中包含 CreateWindowEx 函 式中指定的所有資訊。 一般而言,視窗程式會在接收這些訊息時執行初始化工作。

建立子視窗時,系統會在傳送WM_NCCREATEWM_CREATE訊息之後,將WM_PARENTNOTIFY訊息傳送至父視窗。 它也會在建立視窗時傳送其他訊息。 這些訊息的數目和順序取決於視窗類別和樣式,以及用來建立視窗的函式。 這些訊息會在此說明檔的其他主題中說明。

多執行緒應用程式

以 Windows 為基礎的應用程式可以有多個執行緒執行,而且每個執行緒都可以建立視窗。 建立視窗的執行緒必須包含其視窗程式碼。

應用程式可以使用 EnumThreadWindows 函式來列舉特定執行緒所建立的視窗。 此函式會接著將控制碼傳遞給每個執行緒視窗,以傳遞至應用程式定義的回呼函式 EnumThreadWndProc

GetWindowThreadProcessId函式會傳回建立特定視窗之執行緒的識別碼。

若要設定另一個執行緒所建立視窗的顯示狀態,請使用 ShowWindowAsync 函式。