<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # Windows API 中的高級控件 > 原文: [http://zetcode.com/gui/winapi/advancedcontrols/](http://zetcode.com/gui/winapi/advancedcontrols/) 在 Windows API 教程的這一部分中,我們將詳細討論兩個高級 Windows 控件:選項卡控件和列表框控件。 ## `Label`控件 選項卡控件將具有相應選項卡的多個窗口合并在一起。 `tabcontrol.c` ```c #include <windows.h> #include <commctrl.h> #include <wchar.h> #define ID_TABCTRL 1 #define ID_EDIT 2 #define BTN_ADD 3 #define BTN_DEL 4 #define BTN_CLR 5 #define MAX_TAB_LEN 15 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HWND hTab, hEdit; int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) { MSG msg ; WNDCLASSW wc = {0}; wc.lpszClassName = L"Tab control"; wc.hInstance = hInstance; wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); wc.lpfnWndProc = WndProc; wc.hCursor = LoadCursor(0, IDC_ARROW); RegisterClassW(&wc); CreateWindowW(wc.lpszClassName, L"Tab control", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 380, 230, 0, 0, hInstance, 0); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { TCITEMW tie; wchar_t text[4]; LRESULT count, id; INITCOMMONCONTROLSEX icex; switch(msg) { case WM_CREATE: icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwICC = ICC_TAB_CLASSES; InitCommonControlsEx(&icex); hTab = CreateWindowW(WC_TABCONTROLW, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 200, 150, hwnd,(HMENU) ID_TABCTRL, NULL, NULL); hEdit = CreateWindowW(WC_EDITW, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 250, 20, 100, 25, hwnd, (HMENU) ID_EDIT, NULL, NULL); SendMessage(hEdit, EM_SETLIMITTEXT, MAX_TAB_LEN, 0); CreateWindowW(WC_BUTTONW, L"Add", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 250, 50, 100, 25, hwnd, (HMENU) BTN_ADD, NULL, NULL); CreateWindowW(WC_BUTTONW, L"Delete", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 250, 80, 100, 25, hwnd, (HMENU) BTN_DEL, NULL, NULL); CreateWindowW(WC_BUTTONW, L"Clear", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 250, 110, 100, 25, hwnd, (HMENU) BTN_CLR, NULL, NULL); break; case WM_COMMAND: switch(LOWORD(wParam)) { case BTN_ADD: GetWindowTextW(hEdit, text, 250); if (lstrlenW(text) != 0 ) { tie.mask = TCIF_TEXT; tie.pszText = text; count = SendMessageW(hTab, TCM_GETITEMCOUNT, 0, 0); SendMessageW(hTab, TCM_INSERTITEMW, count, (LPARAM) (LPTCITEM) &tie); } break; case BTN_DEL: id = SendMessageW(hTab, TCM_GETCURSEL, 0, 0); if (id != -1) { SendMessageW(hTab, TCM_DELETEITEM, 0, id); } break; case BTN_CLR: SendMessageW(hTab, TCM_DELETEALLITEMS, 0, 0); break; } break; case WM_DESTROY: PostQuitMessage(0); break; } return(DefWindowProcW(hwnd, msg, wParam, lParam)); } ``` 在我們的例子中,我們使用一個標簽控件,一個編輯控件,以及三個按鈕。 我們將在選項卡控件上動態創建和刪除選項卡。 ```c hTab = CreateWindowW(WC_TABCONTROLW, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 200, 150, hwnd,(HMENU) ID_TABCTRL, NULL, NULL); ``` 我們使用`WC_TABCONTROL`窗口類創建一個選項卡控件。 ```c hEdit = CreateWindowW(WC_EDITW, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 250, 20, 100, 25, hwnd, (HMENU) ID_EDIT, NULL, NULL); SendMessage(hEdit, EM_SETLIMITTEXT, MAX_TAB_LEN, 0); ``` 我們創建一個編輯控件,并通過`EM_SETLIMITTEXT`消息設置其最大大小。 ```c if (lstrlenW(text) != 0 ) { tie.mask = TCIF_TEXT; tie.pszText = text; count = SendMessageW(hTab, TCM_GETITEMCOUNT, 0, 0); SendMessageW(hTab, TCM_INSERTITEMW, count, (LPARAM) (LPTCITEM) &tie); } ``` 要添加新標簽,我們填充`TCITEMW`結構。 我們提供要設置的數據類型(在我們的示例中為`TCIF_TEXT`)和實際文本。 然后,我們發送兩條消息。 `TCM_GETITEMCOUNT`消息獲取選項卡的數量。 它將在第二條消息中使用。 `TCM_INSERTITEMW`消息使用`count`變量和`TCITEMW`結構在控件中插入新標簽。 ```c id = SendMessageW(hTab, TCM_GETCURSEL, 0, 0); if (id != -1) { SendMessageW(hTab, TCM_DELETEITEM, 0, id); } ``` 要刪除特定標簽,我們需要當前選擇的標簽。 我們通過將`TCM_GETCURSEL`消息發送到選項卡控件來解決。 要刪除選項卡,我們發送`TCM_DELETEITEM`消息,并在`wParam`參數中指定要刪除的項目。 ```c SendMessageW(hTab, TCM_DELETEALLITEMS, 0, 0); ``` 要從標簽控件中刪除所有標簽,我們發送`TCM_DELETEALLITEMS`消息。 ![Tab control](https://img.kancloud.cn/83/33/8333b4f07c18641e036dc2f76aa3ecd0_380x230.jpg) 圖:標簽控件 ## 列表框 `List Box`包含一個簡單的列表,用戶通常可以從中選擇一個或多個項目。 所選項目被標記。 `listbox.c` ```c #include <windows.h> #include <commctrl.h> #include <strsafe.h> #define IDC_LIST 1 #define IDC_STATIC 2 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); typedef struct { wchar_t name[30]; wchar_t job[20]; int age; } Friends; Friends friends[] = { {L"Lucy", L"waitress", 18}, {L"Thomas", L"programmer", 25}, {L"George", L"police officer", 26}, {L"Michael", L"producer", 38}, {L"Jane", L"steward", 28}, }; int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) { MSG msg ; WNDCLASSW wc = {0}; wc.lpszClassName = L"MyListBox"; wc.hInstance = hInstance; wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); wc.lpfnWndProc = WndProc; wc.hCursor = LoadCursor(0, IDC_ARROW); RegisterClassW(&wc); CreateWindowW(wc.lpszClassName, L"List Box", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 340, 200, 0, 0, hInstance, 0); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static HWND hwndList, hwndStatic; wchar_t buf[128]; switch(msg) { case WM_CREATE: hwndList = CreateWindowW(WC_LISTBOXW , NULL, WS_CHILD | WS_VISIBLE | LBS_NOTIFY, 10, 10, 150, 120, hwnd, (HMENU) IDC_LIST, NULL, NULL); hwndStatic = CreateWindowW(WC_STATICW , NULL, WS_CHILD | WS_VISIBLE, 200, 10, 120, 45, hwnd, (HMENU) IDC_STATIC, NULL, NULL); for (int i = 0; i < ARRAYSIZE(friends); i++) { SendMessageW(hwndList, LB_ADDSTRING, 0, (LPARAM) friends[i].name); } break; case WM_COMMAND: if (LOWORD(wParam) == IDC_LIST) { if (HIWORD(wParam) == LBN_SELCHANGE) { int sel = (int) SendMessageW(hwndList, LB_GETCURSEL, 0, 0); StringCbPrintfW(buf, ARRAYSIZE(buf), L"Job: %ls\nAge: %d", friends[sel].job, friends[sel].age); SetWindowTextW(hwndStatic, buf); } } break; case WM_DESTROY: PostQuitMessage(0); break; } return (DefWindowProcW(hwnd, msg, wParam, lParam)); } ``` 在此示例中,我們顯示一個列表框控件和一個靜態文本控件。 通過從列表框中選擇一個人,我們可以在靜態控件中顯示他的工作和年齡。 ```c hwndList = CreateWindowW(WC_LISTBOXW , NULL, WS_CHILD | WS_VISIBLE | LBS_NOTIFY, 10, 10, 150, 120, hwnd, (HMENU) IDC_LIST, g_hinst, NULL); ``` `WC_LISTBOXW`窗口類用于創建列表框控件。 每當用戶單擊列表框項目(`LBN_SELCHANGE`),雙擊項目(`LBN_DBLCLK`)或取消選擇(`LBN_SELCANCEL`時,`LBS_NOTIFY`標志都會使列表框將通知代碼發送到父窗口 ])。 ```c for (int i = 0; i < ARRAYSIZE(friends); i++) { SendMessageW(hwndList, LB_ADDSTRING, 0, (LPARAM) friends[i].name); } ``` 通過發送多個`LB_ADDSTRING`消息,列表框中填充了數據。 ```c if (HIWORD(wParam) == LBN_SELCHANGE) { int sel = (int) SendMessageW(hwndList, LB_GETCURSEL, 0, 0); StringCbPrintfW(buf, ARRAYSIZE(buf), L"Job: %ls\nAge: %d", friends[sel].job, friends[sel].age); SetWindowTextW(hwndStatic, buf); } ``` 如果我們從列表框中選擇一個項目,則窗口過程會收到`LBN_SELCHANGE`消息。 首先,我們通過向列表框中發送`LB_GETCURSEL`消息來確定當前選擇的項目。 然后,我們將工作名稱和年齡從好友結構復制到`buf`數組中。 最后,我們通過`SetWindowTextW()`函數調用來設置靜態文本。 ![list box](https://img.kancloud.cn/53/ef/53effb681e1ba7ad521f9fc4046250da_340x200.jpg) 圖:列表框 在 Windows API 教程的這一部分中,我們介紹了兩個更高級的 Windows 控件。
                  <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>

                              哎呀哎呀视频在线观看