Шаг 361 - Элемент управления ComboBox в ListBox дальше

Итак, немного улучшим этот класс в плане, что список будет формироваться из элементов 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 иначе все будет перемещаться, а это не очень хорошо и вставляемый элемент будет всегда впереди, так как пустая строка.

361_1.gif (2437 b)

Теперь при пустом списке надо щелкнуть по первому элементу, потом еще раз для выбора. Дальше проще щелкаете первый раз на пустом внизу, и сразу появляется список. В проекте находится класс CListComboBox упакованный для использования в Component Gallery как ogx файл.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.