Итак, немного улучшим этот класс в плане, что список будет формироваться из элементов ComboBox. Для этого создадим массив, в котором будет храниться элементы ComboBox.
class CListComboBox : public CListBox { ...... //}}AFX_MSG CStringArray cArray; CComboBox cb; CRect rect; DECLARE_MESSAGE_MAP() };
Создадим функцию с помощью которой можно помещать элементы в массив.
void CListComboBox::AddCombo(CString csElement) { cArray.Add(csElement); }
При создании ComboBox будем брать список из массива.
void CListComboBox::OnSelchange() { ...... if (!cb) // если не создан { cb.Create(CBS_DROPDOWNLIST | CBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_CHILD | WS_BORDER,CRect(rect),this,IDC_BOX_LIST); cb.SetFont(GetFont()); // установить шрифт одинаковый со списком // новых элементы в ComboBox for (int x=0;x<cArray.GetSize();x++) cb.AddString(cArray.GetAt(x)); } ...... }
Теперь при инициализации этот список нужно создавать.
BOOL CTestBoxDlg::OnInitDialog() { ...... SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon m_List.AddCombo("VB"); m_List.AddCombo("JAVA"); m_List.AddCombo("VC++"); // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control }
Так как список может быть пустой при получении фокуса нужно создать хотя бы один элемент.
void CListComboBox::OnSetfocus() { if (GetCount()==0) AddString(""); // При получении фокуса если нет элемента создать один }
Ну и изменить окончания выбора ComboBox для отражения результат выбора в CListBox.
void CListComboBox::OnCanselSelectComboBox() { cb.ShowWindow(SW_HIDE); // спрятать CString str; if ((GetCurSel()+1)==GetCount()) AddString(""); // нумерация с нуля. cb.GetLBText(cb.GetCurSel(),str); // получить выбранный текст из списка int i= InsertString(GetCurSel(),str); // вставить в ту же самую позицию DeleteString(GetCurSel()); // удалить старую }
Лучше убрать сортировку в ListBox иначе все будет перемещаться, а это не очень хорошо и вставляемый элемент будет всегда впереди, так как пустая строка.
Теперь при пустом списке надо щелкнуть по первому элементу, потом еще раз для выбора. Дальше проще щелкаете первый раз на пустом внизу, и сразу появляется список. В проекте находится класс CListComboBox упакованный для использования в Component Gallery как ogx файл.