建立視窗
在本文中,您將瞭解如何建立和顯示視窗。
視窗類別
視窗類別會定義一組常見的視窗行為。 例如,在一組按鈕中,當使用者選取按鈕時,每個按鈕都有類似的行為。 當然,按鈕不完全相同。 每個按鈕都會顯示自己的文字字串,並有自己的螢幕座標。 每個視窗的唯一 資料稱為實例資料。
即使您的程式只建立該類別的一個實例,每個視窗都必須與視窗類別相關聯。 視窗類別不是 C++ 意義中的類別。 而是作業系統在內部使用的資料結構。 視窗類別會在執行時間向系統註冊。 若要註冊新的視窗類別,請填入 WNDCLASS 結構:
// Register the window class.
const wchar_t CLASS_NAME[] = L"Sample Window Class";
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
您必須設定下列結構成員:
- lpfnWndProc 是應用程式定義函數的指標,稱為 視窗程式 或 視窗程式。 視窗程式會定義視窗的大部分行為。 目前,這個值是函式的正向宣告。 如需詳細資訊,請參閱 撰寫視窗程式。
-
hInstance 是應用程式實例的控制碼。 從 的
wWinMain
hInstance參數取得此值。 - lpszClassName 是識別視窗類別的字串。
類別名稱是目前進程的本機名稱,因此名稱在進程內只需要是唯一的。 不過,標準 Windows 控制項也有類別。 如果您使用其中任何一個控制項,則必須挑選不會與控制項類別名稱衝突的類別名稱。 例如,按鈕控制項的視窗類別名為 Button。
WNDCLASS結構具有此處未顯示的其他成員。 您可以將它們設定為零,如本範例所示,或填入。 如需詳細資訊,請參閱 WNDCLASS。
接下來,將 WNDCLASS 結構的位址傳遞至 RegisterClass 函式。 此函式會向作業系統註冊視窗類別。
RegisterClass(&wc);
建立視窗
若要建立視窗的新實例,請呼叫 CreateWindowEx 函 式:
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
L"Learn to Program Windows", // Window text
WS_OVERLAPPEDWINDOW, // Window style
// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, // Parent window
NULL, // Menu
hInstance, // Instance handle
NULL // Additional application data
);
if (hwnd == NULL)
{
return 0;
}
如需詳細的參數描述,請參閱 CreateWindowEx。 以下是快速摘要:
- 第一個參數可讓您指定視窗的一些選擇性行為,例如透明視窗。 針對預設行為,將此參數設定為零。
-
CLASS_NAME
是視窗類別的名稱。 此名稱會定義要建立的視窗類型。 - 視窗文字會以不同類型視窗的不同方式使用。 如果視窗有標題列,文字會顯示在標題列中。
- 視窗樣式是一組旗標,可定義視窗的一些外觀和風格。 常數 WS_OVERLAPPEDWINDOW 實際上是數個與位
OR
結合的旗標。 這些旗標一起提供視窗標題列、框線、系統功能表,以及 [最小化 ] 和 [ 最大化 ] 按鈕。 這組旗標是最上層應用程式視窗最常見的樣式。 - 對於位置和大小,常數 CW_USEDEFAULT 表示使用預設值。
- 下一個參數會設定新視窗的父視窗或擁有者視窗。 如果要建立子視窗,請設定父視窗。 針對最上層視窗,請將此值設定為
NULL
。 - 針對應用程式視窗,下一個參數會定義視窗的功能表。 此範例不會使用功能表,因此值為
NULL
。 - hInstance 是先前所述的實例控制碼。 請參閱 WinMain:應用程式進入點。
- 最後一個參數是 類型
void*
任意資料的指標。 您可以使用此值,將資料結構傳遞至視窗程式。 如需使用此參數的其中一個可能方式,請參閱 管理應用程式狀態。
CreateWindowEx 會傳回新視窗的控制碼,如果函式失敗則傳回零。 若要顯示視窗,也就是讓視窗可見,請將視窗控制碼傳遞至 ShowWindow 函式:
ShowWindow(hwnd, nCmdShow);
hwnd參數是CreateWindowEx所傳回的視窗控制碼。 nCmdShow參數可用來最小化或最大化視窗。 作業系統會透過 wWinMain 函式將此值傳遞至程式。
以下是建立視窗的完整程式碼。 請記住 ,WindowProc 仍然是函式的正向宣告。
// Register the window class.
const wchar_t CLASS_NAME[] = L"Sample Window Class";
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
// Create the window.
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
L"Learn to Program Windows", // Window text
WS_OVERLAPPEDWINDOW, // Window style
// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, // Parent window
NULL, // Menu
hInstance, // Instance handle
NULL // Additional application data
);
if (hwnd == NULL)
{
return 0;
}
ShowWindow(hwnd, nCmdShow);
恭喜,您已建立視窗!
現在,視窗不包含任何內容或與使用者互動。 在實際的 GUI 應用程式中,視窗會回應使用者和作業系統的事件。 下一節說明視窗訊息如何提供這種互動性。
另請參閱
繼續進行 [視窗訊息 ] 以繼續此課程模組。