Win32: Comment créer un contrôle ListBox à l’aide de la fonction CreateWindowExW ()?

J’ai parcouru plusieurs sites, documents et didacticiels et ils disent tous la même chose, c’est-à-dire que tout contrôle n’est rien de plus qu’une fenêtre dans l’API de Win32; par conséquent, il est possible d’utiliser la CreateWindowExW() pour créer un contrôle ListBox / fenêtre sur la fenêtre principale de l’application.

Bien que les concepts de tous les contrôles soient des fenêtres avec dwStyle différent, j’ai du mal à trouver comment instancier, pour le dire, le contrôle ListBox .

J’ai rencontré un tutoriel dans lequel une boîte de dialog est écrite pour avoir un LISTBOX spécifié dans sa déclaration comme suit:

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

Et l’utiliser dans son programme C comme suit:

 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc); } 

Maintenant, je suis capable de faire et de bien comprendre les concepts. De plus, j’aimerais pouvoir créer et concevoir la fenêtre principale de l’application dans laquelle append un contrôle ListBox . Cet exemple de didacticiel n’utilise pas la CreateWindowExW() pour créer le contrôle. Il crée plutôt une boîte de dialog qui sera en réalité la fenêtre principale de l’application.

1 – Avez-vous un indice sur la manière d’append un contrôle ListBox à la fenêtre principale en code?

J’ai pensé à le créer tout en gérant le message WM_CREATE .

2 – Est-ce une bonne idée?

3 – Quelle est la meilleure pratique / approche dans ce scénario?

Pour créer dynamicment un contrôle dans Win32, vous avez besoin du code suivant:

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