COMBOBOX woes
I'm trying to create a combo box. This is how I want it to behave.
It is a drop down box that lists the current selection when the window
becomes visible. When the down arrow is pressed the list of sections comes
up where the user can select one, which becomes the item selected.
It seems simple enough, but for some reason I can't do it. The problem
seems to be I can only get the list to show up if one of the options for the
combo box is WS_CHILD. If I don't select WS_CHILD when the user presses
down arrow they only see their current selection which is highlighted. The
user can press the up or down arrow which selects a different item. This
works the way I want to except that the other items they can select are not
visible.
This is my attempt:
// Resolution Dropdown Listbox //
HWND hwndSettingsResolution = CreateWindow(
"COMBOBOX",
"",
WS_VISIBLE | CBS_DROPDOWNLIST, // | WS_TABSTOP, //| WS_CHILD,
20, 30, 100, 150,
hwndSettings, //parent window
(HMENU) CONTROL_SETTINGS_RES,
hThisInstance,
NULL);
ShowWindow(hwndSettingsResolution, SW_SHOW);
SendMessage(hwndSettingsResolution, WM_SETFONT,
(WPARAM)GetStockObject(DEFAULT_GUI_FONT), FALSE);
SendMessage(hwndSettingsResolution, CB_ADDSTRING, 0, (LPARAM) "640x480");
SendMessage(hwndSettingsResolution, CB_ADDSTRING, 0, (LPARAM) "1024x786");
SendMessage(hwndSettingsResolution, CB_SETCURSEL, Options.ScreenRez ? 1 : 0,
0);
This method will do as shown above, when the window is becomes visible their
selected item is shown in the combo box, but the full dropdown isn't there.
If I add the WS_CHILD then the full list is shown, but the selected item
isn't shown when the window becomes visible.
So what I try then is to manually select what the selected item is when the
window is displayed. I change the options to WS_VISIBLE | CBS_DROPDOWNLIST
| WS_CHILD.
This is what I'm trying when I display the window:
ShowWindow( FindWindowEx( NULL, NULL, ClassName, "Abyssal Settings" ),
SW_SHOW );
HWND SettingsWindow = FindWindowEx( NULL, NULL, ClassName, "Abyssal
Settings" );
if ( SettingsWindow != NULL )
{
HWND ResWindow = GetDlgItem( SettingsWindow, CONTROL_SETTINGS_RES);
if ( ResWindow != NULL )
SendMessage(ResWindow, CB_SETCURSEL, Options.ScreenRez ? 1 : 0, 0);
}
But this fails becomes ResWindow is NULL. The SettingsWindow is not NULL
however, which is the parent of the window seen as hwndSettings. I don't
know why it's not working, because I do something almost exactly the same to
set an edit box text:
SetWindowText(GetDlgItem(hwnd, CONTROL_EDIT), "GetExitCodeThread didn't
work");
which does work.
Any help is appreciated.