Win32: How to create a ListBox control using the CreateWindowExW() function?
我已经浏览过多个站点,文档和教程,而且都说相同,也就是说,任何控件不过是Win32 API中的一个窗口,因此可以使用
尽管我得到的所有控件都是带有不同dwStyle的窗口的概念,但我很难找出如何实例化
我遇到了一个教程,其中编写了一个对话框,在其声明中指定了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | // resource.h #define IDD_MAIN 101 #define IDC_TEXT 1000 #define IDC_NUMBER 1001 #define IDC_LIST 1002 #define IDC_ADD 1003 #define IDC_CLEAR 1004 #define IDC_REMOVE 1005 #define IDC_SHOWCOUNT 1006 // .rc resource file IDD_MAIN DIALOG DISCARDABLE 0, 0, 207, 156 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION"Controls One" FONT 8,"MS Sans Serif" BEGIN LTEXT "Add",IDC_STATIC,7,10,14,8 EDITTEXT IDC_TEXT,25,7,120,14,ES_AUTOHSCROLL EDITTEXT IDC_NUMBER,150,7,21,14,ES_NUMBER LTEXT "times.",IDC_STATIC,177,10,23,8 LISTBOX IDC_LIST,7,25,138,106,LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Add",IDC_ADD,150,30,50,14 PUSHBUTTON "&Remove",IDC_REMOVE,150,47,50,14 PUSHBUTTON "&Clear",IDC_CLEAR,150,63,50,14 LTEXT "This item was added",IDC_STATIC,7,141,66,8 CTEXT "-",IDC_SHOWCOUNT,77,141,32,8 LTEXT "times",IDC_STATIC,114,141,17,8 END |
并在他的C程序中使用它,如下所示:
1 2 3 | int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc); } |
现在,我能够做到并完全理解这些概念。另外,我希望能够创建和设计主应用程序窗口以向其中添加
1-关于如何在代码中向主窗口添加
我考虑过在处理WM_CREATE消息时创建它。
2-这是个好主意吗?
3-在这种情况下,最佳实践/方法是什么?
为了在Win32中动态创建控件,您需要以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | HWND hBtn , hLabel , hListbox , hTextBox; void InitializeComponent(HWND hWnd) { HINSTANCE hInstance = GetModuleHandle(NULL); // Adding a Button. hBtn = CreateWindowExW(WS_EX_APPWINDOW , L"BUTTON", NULL , WS_CHILD | WS_VISIBLE , 327, 7, 70, 21 , hWnd, NULL, hInstance, NULL); SetWindowTextW(hBtn, L"&Button"); // Adding a Label. hLabel = CreateWindowExW(WS_EX_CLIENTEDGE , L"STATIC", NULL , WS_CHILD | WS_VISIBLE , 7, 7, 50, 21 , hWnd, NULL, hInstance, NULL); SetWindowTextW(hLabel, L"Label:"); // Adding a ListBox. hListBox = CreateWindowExW(WS_EX_CLIENTEDGE , L"LISTBOX", NULL , WS_CHILD | WS_VISIBLE | ES_VSCROLL | ES_AUTOVSCROLL , 7, 35, 300, 200 , hWnd, NULL, hInstance, NULL); // Adding a TextBox. hTextBox = CreateWindowExW(WS_EX_CLIENTEDGE , L"EDIT", NULL , WS_CHILD | WS_VISIBLE | ES_AUTOVSCROLL , 62, 7, 245, 21 , hWnd, NULL, hInstance, NULL); SetWindowTextW(hTextBox, L"Input text here..."); } LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { switch (Msg) { case WM_CREATE: InitializeComponent(hWnd); break; default: return DefWindowProcW(hWnd, Msg, wParam, lParam); } } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { // Declaring, defining, registering and creating window here... // Note that each Window/Control has to have its own Message handling function. } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | HWND hListBox; // Handle for list box control hListBox = CreateWindowEx( WS_EX_CLIENTEDGE, // extended window styles "LISTBOX", // list box window class name NULL, WS_CHILD | WS_VISIBLE, // window styles 7, // horizontal position 35, // vertical position 300, // width 200, // height hWnd, NULL, hInstance, NULL ); if (!hListBox){ // failed to create list box window - take actions ... } |