建立視窗

在本文中,您將瞭解如何建立和顯示視窗。

視窗類別

視窗類別會定義一組常見的視窗行為。 例如,在一組按鈕中,當使用者選取按鈕時,每個按鈕都有類似的行為。 當然,按鈕不完全相同。 每個按鈕都會顯示自己的文字字串,並有自己的螢幕座標。 每個視窗的唯一 資料稱為實例資料

即使您的程式只建立該類別的一個實例,每個視窗都必須與視窗類別相關聯。 視窗類別不是 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 是應用程式實例的控制碼。 從 的 wWinMainhInstance參數取得此值。
  • 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 應用程式中,視窗會回應使用者和作業系統的事件。 下一節說明視窗訊息如何提供這種互動性。

另請參閱

繼續進行 [視窗訊息 ] 以繼續此課程模組。