关于C#:Win32:如何使用CreateWindowExW()函数创建ListBox控件?

Win32: How to create a ListBox control using the CreateWindowExW() function?

我已经浏览过多个站点,文档和教程,而且都说相同,也就是说,任何控件不过是Win32 API中的一个窗口,因此可以使用CreateWindowExW()函数在主应用程序窗口上创建ListBox控件/窗口。

尽管我得到的所有控件都是带有不同dwStyle的窗口的概念,但我很难找出如何实例化ListBox控件。

我遇到了一个教程,其中编写了一个对话框,在其声明中指定了ListBox,如下所示:

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);
}

现在,我能够做到并完全理解这些概念。另外,我希望能够创建和设计主应用程序窗口以向其中添加ListBox控件。本教程示例未使用CreateWindowExW()函数创建控件,而是创建了一个实际上将成为应用程序主窗口的对话框。

1-关于如何在代码中向主窗口添加ListBox控件的任何线索?

我考虑过在处理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 ...
}