I've been through multiple sites, documents and tutorials and they all say the same, that is, any control is nothing more than a window in Win32's API, hence one is able to use the CreateWindowExW()
function to create a ListBox
control/window over the main application window.
Though I get the concepts of all controls being windows with different dwStyle, I have a hard time finding out how to instantiate, to say so, the ListBox
control.
I encountered a tutorial where a dialog is written to have a LISTBOX
specified in its declaration as follows:
// 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
And using it in his C program like so:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc);
}
Now, this I am able to do and fully understand the concepts. Aside, I would like to be able to create and design my main application window to add a ListBox
control to. This tutorial example doesn't use the CreateWindowExW()
function to create the control, instead, it creates a dialog that will actually be the main application window.
1 - Any clue on how to add a ListBox
control to the main window in code?
I thought about creating it while handling the WM_CREATE message.
2 - Is this a good idea?
3 - What is the best practice/approach in this scenario?
A list box is a graphical control element that allows the user to select one or more items from a list contained within a static, multiple line text box. The user clicks inside the box on an item to select it, sometimes in combination with the ⇧ Shift or Ctrl in order to make multiple selections.
The types of forms: Simple forms, each representing a subset of the application's data. Composite forms, composed of several simple forms. Ad hoc grids, in which you aren't confined by the form's design.
The winuser. h header defines CreateWindowEx as an alias which automatically selects the ANSI or Unicode version of this function based on the definition of the UNICODE preprocessor constant.
The second parameter is the window title, of type std::string.
In order to dynamically create a control in Win32's you need the following code:
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 | WS_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.
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With