After reading the article written by Robert Cremer , I realized that his version doesn't correctly draw the blue selection rectangle around the selected item within the combo box. Therefore, I took a different tack in the designing of my version of a class that allows you to programmatically switch a combo box between "drop-list" and "drop-down" mode.
To do this, I create an edit control that simulates the child edit of a real drop-down combo box. The included files have one CComboBox derived class with overrides on OnDropDown and OnCloseUp, and one CEdit derived class that takes care of the up/down arrows used no navigate in the combobox.
The only (let's say) tricky parts are:
- Making the edit selectable by mouse. I used ::SetWindowPos to put in in the front of the combo in the Z-order
- Making the combo selectable/not selectable by TAB. ModifyStyle(WS_TABSTOP,0) to remove, ModifyStyle(0,WS_TABSTOP) to add the combo to the tab order list.
UsageIn order to use this class, simply follow these steps:
- In your dialog, add a drop-list combobox
- Add a member variable to the dialog of the type CComboBox
- Modify the dialog's header file so that instead of the newly created combo box variable being declared as a CComboBox, it is declared as a CFineCombo.
- Now, update your dialog's code to include calls to SwitchToDrop(TRUE) (switches to drop-down) or SwitchToDrop(FALSE) (switches to drop-list) where appropriate.
- Delete the ClassWizard (.clw) file.
- Rebuild the ClassWizard file so that it contains the newly added CFineCombo class.
DownloadsDownload demo project - 20 Kb
Download source - 3 Kb