共用方式為


關於 Windows

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

概觀包含下列主題。

桌面視窗

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

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

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

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

應用程式視窗

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

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

應用程式視窗包含項目,例如標題列、功能表列、視窗功能表(先前稱為系統功能表)、最小化按鈕、最大化按鈕、還原視窗按鈕、關閉按鈕、調整大小框線、工作區、水平滾動條以及垂直滾動條。 應用程式的主視窗通常包含所有這些元件。 下圖顯示一般主視窗中的這些元件。

一般視窗

客戶區域

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

非客戶區域

標題列、功能表欄、視窗功能表、最小化和最大化按鈕、重設大小框線和滾動條,統稱為視窗的 非客戶區域。 系統會管理非工作區的大部分層面;應用程式會管理其工作區的外觀和行為。

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

大部分的應用程式都包含 功能表列,其中列出應用程式支援的命令。 選單列中的項目代表命令的主要類別。 點擊選單列上的項目通常會開啟下拉式選單,其中的選項對應於特定類別中的任務。 藉由按下命令,使用者會指示應用程式執行工作。

視窗功能表 是由系統建立和管理。 它包含一組標準功能表項,用戶選取時會自動設定視窗的大小或位置、關閉應用程式或執行其他操作。 如需詳細資訊,請參閱 選單

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

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

水平滾動條垂直滾動條 將滑鼠或鍵盤輸入轉換成應用程式用來水平或垂直移動客戶區內容的值。 例如,顯示冗長檔的文字處理應用程式通常會提供垂直滾動條,讓使用者上下瀏覽檔。

控件和對話框

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

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

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

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

窗口屬性

建立視窗時,應用程式必須提供下列資訊。 (除了 Window Handle之外,建立函式會傳回此函式以唯一識別新視窗。

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

類別名稱

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

視窗名稱

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

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

窗口樣式

每個視窗都有一或多個窗口樣式。 窗口樣式是一個具名常數,定義窗口外觀和視窗類別未指定的行為層面。 應用程式通常會在建立視窗時設定窗口樣式。 它也可以使用 setWindowLong函式建立窗口之後設定樣式。

在某種程度上,系統和 類別的視窗程式會解譯窗口樣式。

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

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

擴展窗口樣式

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

如需詳細資訊,請參閱 CreateWindowEx

位置

視窗的位置定義為其左上角的座標。 這些座標有時稱為視窗座標,總是相對於螢幕左上角,或對於子視窗來說,是相對於父視窗客戶區的左上角。 例如,具有座標 (10,10) 的最上層視窗會在畫面左上角的右邊放置 10 圖元,並從其向下放置 10 圖元。 具有座標(10,10)的子視窗被放置在其父視窗客戶區左上角向右 10 像素及向下 10 像素的位置。

WindowFromPoint 函式會擷取佔用螢幕上特定點之視窗的句柄。 同樣地,ChildWindowFromPointChildWindowFromPointEx 函式會擷取佔用父視窗客戶區中某一特定點的子視窗控制代碼。 雖然 ChildWindowFromPointEx 可以忽略隱藏、停用和透明的子視窗,ChildWindowFromPoint 無法。

大小

視窗的大小(寬度和高度)是以像素為單位來指定。 視窗可以有零寬度或高度。 如果應用程式將視窗的寬度和高度設定為零,系統會將大小設定為預設的最小視窗大小。 若要探索預設的最小視窗大小,應用程式會使用 GetSystemMetrics 函式搭配 SM_CXMINSM_CYMIN 旗標。

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

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

父視窗句柄或擁有者視窗句柄

視窗可以有父視窗。 有父視窗的視窗稱為 子視窗父視窗 提供用於定位子視窗的座標系統。 擁有父視窗會影響視窗外觀的某些方面,例如,子視窗會被限制,因此子視窗的一部分無法超出其父視窗的邊界。

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

最上層視窗可以擁有或由另一個窗口擁有。 擁有的視窗 一律會出現在其擁有者視窗前面,當其擁有者視窗最小化時會隱藏,並在其擁有者視窗關閉時被關閉。 如需詳細資訊,請參閱 持有的 Windows

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

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

應用程式實例控制碼

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

創建資料

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

視窗控制元件

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

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

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

視窗建立

若要建立應用程式視窗,請使用 CreateWindowCreateWindowEx 函式。 您必須提供定義視窗屬性所需的資訊。 CreateWindowEx 具有參數,dwExStyleCreateWindow 沒有:否則,函式會相同。 事實上,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 函式。