<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Windows API 中的一個窗口 > 原文: [http://zetcode.com/gui/winapi/window/](http://zetcode.com/gui/winapi/window/) 窗口是應用顯示輸出并從用戶接收輸入的屏幕矩形區域。 一切都是 Windows 中的一個窗口。 至少從程序員的角度來看。 一個主窗口,一個按鈕,一個靜態文本甚至一個圖標; 都是窗口。 靜態文本只是窗口的一種特殊類型,桌面區域也是如此。 ## `wWinMain()`函數 每個 Windows UI 應用必須至少具有兩個函數:`WinMain`函數和窗口過程。`WinMain`函數是 Windows UI 應用的入口點。 它初始化應用,在屏幕上顯示應用窗口,然后進入主循環。 在我們的示例中,我們使用`wWinMain()`函數原型,該原型用于創建 Unicode UI 程序。 ```c int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow); ``` `hInstance`是實例的句柄。 它是一個 32 位數字,用于標識我們在 OS 環境中的程序實例。 Windows 在程序開始執行時給出此數字。 `hPrevInstance`參數始終為`NULL`; 它是 16 位 Windows 的傳統。 Windows 程序也可以從命令行啟動。 給定的參數存儲在`pCmdLine`參數中。 `nCmdShow`值指定窗口的顯示方式:最小化,最大化或隱藏。 `wWinMain()`函數在收到`WM_QUIT`消息時終止。 ## 注冊窗口類 在創建窗口之前,我們必須在 Windows 中注冊其類。 許多控件的窗口類已經注冊。 因此,當我們創建按鈕或靜態文本時,我們不需要為其注冊窗口類。 要注冊窗口類,我們必須創建并填充`WNDCLASS`結構。 我們設置窗口樣式,額外的分配字節,窗口類名稱,程序實例的句柄,背景畫筆,可選菜單名稱,窗口過程,光標的句柄和圖標。 然后調用`RegisterClassW()`函數。 ## 創建一個窗口 通過調用`CreateWindowW()`函數創建窗口。 ```c HWND CreateWindowW(LPCWSTR lpClassName, LPCWSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); ``` `lpClassName`唯一標識窗口。 它是我們注冊窗口的名稱。 `lpWindowName`是窗口名稱。 它的效果取決于上下文-它可以是父窗口中的窗口標題,也可以是子窗口中的標簽(如按鈕或靜態文本)。 可以使用多種樣式創建 Windows。 為此,我們有`dwStyle`參數。 `x`和`y`指定窗口的初始水平和垂直位置。 `nWidth`和`nHeight`指定窗口的寬度和高度。 `hWndParent`是父窗口的句柄。 對于沒有父級的窗口,我們使用`NULL`。 對于父窗口,`hMenu`是菜單的可選句柄,對于子窗口,`hMenu`是控件標識符。 `hInstance`是程序實例的句柄。 `lpParam`是最后一個參數,它是在`WM_CREATE`消息期間傳遞到窗口的可選值。 `CreateWindowW()`函數將句柄返回到新創建的窗口。 ## 消息內容 `WinMain()`函數創建一個消息循環。 在應用的生命周期中,這是一個無休止的循環。 消息循環是一種程序結構,它等待并分派程序中的事件或消息。 Windows 使用消息進行通信。消息是一個整數值,用于標識特定事件-單擊按鈕,調整窗口大小或關閉應用。 一次可以創建多個消息。 不能同時處理所有消息。 因此,它們存儲在消息隊列中。 消息進入消息隊列并等待直到被處理。 `GetMessage()`函數從消息隊列中檢索消息。 `DispatchMessage()`函數將消息調度到窗口過程。 如果應用獲得了字符輸入,則在循環中包含`TranslateMessage()`函數。 ## 窗口過程 ```c LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); ``` 每個窗口都有一個關聯的窗口過程。 它是接收消息的函數。 `hwnd`是要接收消息的窗口的句柄。 `uMsg`是消息。 `wParam`和`lParam`參數提供其他消息信息。 這些參數的值取決于消息類型。 消息來自用戶或操作系統。 我們對消息做出反應,或者我們調用默認的窗口過程來提供默認的處理。 大多數消息發送到默認的窗口過程。 默認的窗口過程稱為`DefWindowProcW()`。 使用與常規窗口過程相同的參數來調用它。 ## 一個簡單的窗口 以下示例顯示了骨架 Windows 應用。 `simplewindow.c` ```c #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) { MSG msg; HWND hwnd; WNDCLASSW wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.lpszClassName = L"Window"; wc.hInstance = hInstance; wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); wc.lpszMenuName = NULL; wc.lpfnWndProc = WndProc; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); RegisterClassW(&wc); hwnd = CreateWindowW(wc.lpszClassName, L"Window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 350, 250, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { DispatchMessage(&msg); } return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProcW(hwnd, msg, wParam, lParam); } ``` 我們將逐步解釋示例代碼。 ```c #include <windows.h> ``` 這是 C 編程語言的頭文件。 它包含 API 中的所有函數聲明,所有公共宏和所有數據類型。 通過鏈接必要的庫`kernel32.lib`,`user32.lib`和`gdi32.lib`并包含`<windows.h>`頭文件,將 Windows API 添加到 C 編程項目中。 ```c wc.style = CS_HREDRAW | CS_VREDRAW; ``` 我們在這里設置窗口樣式。 `CS_HREDRAW`和`CS_VREDRAW`標志意味著只要對窗口的高度或寬度進行移動或大小調整,就會重新繪制整個窗口。 ```c wc.cbClsExtra = 0; wc.cbWndExtra = 0; ``` 在我們的示例中,我們不使用其他字節。 因此,我們將成員設置為零。 這兩個屬性最常見的用法是窗口子類化。 ```c wc.lpszClassName = L"Window"; ``` Window 是此特定窗口類型的類名。 創建窗口時,我們將使用此類名稱。 `L`字符在寬字符串之前。 ```c wc.hInstance = hInstance; ``` 我們設置程序的實例。 ```c wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); ``` 在這里,我們設置背景畫筆。 它是用來繪制窗口客戶區域的顏色。 ```c wc.lpszMenuName = NULL; ``` 在我們的示例中,我們不創建菜單。 ```c wc.lpfnWndProc = WndProc; ``` 我們為窗口類提供了窗口過程。 ```c wc.hCursor = LoadCursor(NULL, IDC_ARROW); ``` 我們為應用設置光標。 我們使用`LoadCursor()`函數從系統資源中加載光標。 `IDC_ARROW`是標準箭頭光標的值。 ```c wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); ``` 我們為應用設置圖標。 使用`LoadIcon()`函數從系統資源中檢索圖標。 `IDI_APPLICATION`是默認應用圖標的值。 ```c RegisterClassW(&wc); ``` 我們向系統注冊窗口類。 ```c ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); ``` 這兩行顯示了屏幕上的窗口。 `nCmdShow`指定我們如何在屏幕上顯示窗口。 ```c while (GetMessage(&msg, NULL, 0, 0)) { DispatchMessage(&msg); } ``` 這是消息循環。 我們使用`GetMessage()`函數從消息隊列中接收消息,并使用`DispatchMessage()`函數將它們分發到窗口過程。 ```c return (int) msg.wParam; ``` 在應用結束時,退出代碼將返回到系統。 ```c switch(msg) { case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProcW(hwnd, msg, wParam, lParam); ``` 在窗口過程中,我們對`WM_DESTROY`消息作出反應。 `PostQuitMessage()`將`WM_QUIT`消息發送到消息隊列。 使用`DefWindowProcW()`函數將所有其他消息發送到默認處理。 ![A window](https://img.kancloud.cn/51/9a/519a4fe7f13788b9152684181fd17351_350x250.jpg) 圖:窗口 在 Windows API 教程的這一部分中,我們創建了一個基本窗口。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看