Win32: как создать элемент управления ListBox с помощью функции CreateWindowExW ()?
Я просмотрел несколько сайтов, документов и учебников, и все они говорят одно и то же, то есть любой элемент управления-это не более чем окно в API Win32, поэтому можно использовать функцию CreateWindowExW() для создания ListBox элемента управления/окна над главным окном приложения.
Хотя я понимаю, что все элементы управления являются окнами с различным стилемdwStyle , Мне трудно понять, как создать экземпляр, скажем так, элемента управления
ListBox.Я столкнулся с учебником где диалог записывается, чтобы иметь LISTBOX, указанный в его объявлении следующим образом:
// 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
И использует его в своей программе на языке Си следующим образом:
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 - какова наилучшая практика/подход в этом сценарии?
2 ответов:
Для динамического создания элемента управления в Win32 вам потребуется следующий код:
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 ... }
Comments