Комбинированные списки (класс CCombobox)
Этот класс является комбинацией списка и однострочного редактора, поэтому для комбинированного списка используются стили, коды извещения и сообщения, аналогичные списку ”CListbox”, а также некоторые сообщения, специфические для редактора текста класса “CEdit”.
При создании списка “CCombobox” указываются специальные стили комбинированного списка, символические имена которых имеют префикс CBS_.
Рассмотрим базовые стили комбинированного списка
Среди всех стилей комбинированного списка можно выделить три базовых:
Рассмотрим стили Combo box, которые задаются при его создании в меню PROPERTIES
Style |
When is list box visible? |
Static or edit control? |
Simple |
Always |
Edit |
Drop-down |
When dropped down |
Edit |
Drop-list |
When dropped down |
Static |
По умолчанию предлагается Simple. В этом случае список постоянно отображен на экране. В поле ввода, располагающемся сверху, можно вводить любые данные. С помощью мыши можно выделять элемент в прикрепленном окне списка и он будет попадать в поле редактирования. Кроме того, если в поле редактирования набрать символы, совпадающие с начальными символами некоторых элементов списка, эти элементы станут первыми в списке.
Стиль Dropdown (раскрывающийся). В поле ввода (edit control), можно вводить любые данные, а щелкнув на стрелку – раскрыть окно списка и выбрать в нем любой элемент. Отмеченный элемент отображается в поле редактирования. Если в поле редактирования набрать символы, совпадающие с начальными символами некоторых элементов списка, эти элементы станут первыми в списке.
Стиль Droplist (раскрывающийся). В этом комбинированном списке пользователь сможет выбирать элементы только из раскрывающегося списка. Для этого он, щелкнув стрелку, укажет нужную строку или введет первую букву из выделенной строки.
Combo box можно инициализировать в окне Properties. На вкладке Data есть окно Enter Listbox Items. Каждую строку в нем следует заканчивать Ctrl+Enter.
List box можно инициализировать только когда начинается диалог, в функции OnInitDialog, которая увязана с сообщением WM_INITDIALOG, класса CSDIDialog.
Рассмотрим сообщения от комбинированного списка, посылаемые родительскому окну
Коды извещения для комбинированного списка имеют символические имена с префиксом CBN_.
Рассмотрим сообщения, посылаемые родительским окном комбинированным спискам
Для управления списком “combobox” используется набор сообщений, аналогичный набору сообщений для списка “CListbox” и редактора текста “CEdit”.
В файле windows.h определены сообщения, специально предназначенные для работы со списком “combobox”. Символические имена этих сообщений имеют префикс CB_.
Многие методы Combo box и List box совпадают. В Combo box нет методов, связанных с множественным выбором.
Дополнительные методы, связанные с полем редактирования.
DWORD GetEditSel( ) const;
Получает начальную и конечную позиции в текущей отметке строки в поле редактирования.
Возвращает двойное слово. Начальная позиция (номер символа) содержится в младшем (low-order) слове, конечная позиция (первый невыделенный символ) - в старшем (high-order) слове. Если Combo box используется без поля редактирования, выдается CB_ERR.
Пример:
DWORD dwCurSel = m_combobox.GetEditSel();
WORD dStart = LOWORD(dwCurSel);
WORD dEnd = HIWORD(dwCurSel);
BOOL SetEditSel( int nStartChar, int nEndChar );
Отмечает символы в поле редактирования. Чтобы выбрать первую позицию, вы должны указать начальную позицию (nStartChar) 0. Чтобы отметить до четвертой позиции включительно, вы должны указать номер первой позиции, следующей за отмеченной nEndChar=4.
nStartChar – означает начальную позицию отметки (счет с нуля). Если она равна –1, удалить существующую отметку.
nEndChar – означает конечную позицию (номер первого символа за отмеченным). Если она равна –1, Помечается весь текст.
Возвращает CB_ERR, если ComboBox имеет стиль DROPDOWNLIST.
Пример:
if (dwCurSel != CB_ERR)
m_combobox.SetEditSel(dStart, dEnd);
CWnd::GetWindowText
int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const;
void GetWindowText( CString& rString ) const;
Копирует заголовок окна в буфер (lpszStringBuf) или строку (rString). Если окно является control (в нашем случае полем редактирования), копирует текст из поля редактирования.
Возвращает длину строки в байтах, не включая символ конца. Возвращает 0, если нет текста.
nMaxCount означает максимальное количество символов, которое может быть скопировано в буфер. Если строка длиннее, она обрезается.
CString str;
GetWindowText(str);
int nLength = str.GetLength();
void SetWindowText( LPCTSTR lpszString );
Копирует строку (lpszString) в заголовок окна. Если окно является control (в нашем случае полем редактирования), копирует строку в поле редактирования.
lpszString – указатель на строку.
SetWindowText(str);
int GetLBText( int nIndex, LPTSTR lpszText ) const;
void GetLBText( int nIndex, CString& rString ) const;
Получает строку из Listbox.
nIndex означает индекс строки, если индекс меньше нуля, или больше предельного значения возвращается CB_ERR.
lpszText означает указатель на буфер, который должен получить строку. Буфер должен иметь достаточно места и иметь символ конца строки. Размер строки должен быть определен заранее с помощью метода GetTextLen.
rString - Ссылка на объект класса CString.
Возвращает длину строки в байтах включая символ конца строки. Возвращает ошибку LB_ERR, если возникает ошибка в индексе.
int SetItemData( int nIndex, DWORD dwItemData );
устанавливает 32-разрядное значение связанное с выбранным элементом
nIndex означает индекс элемента, который должен быть установлен,
dwItemData означает новое значение элемента.
DWORD GetItemData( int nIndex ) const;
Извлекает 32-разрядное значение связанное с выбранным элементом nIndex означает индекс элемента в списке.
Список может получать:
ON_WM_CHARTOITEM - Обработчик сообщения для списков не имеющих строковых элементов получает сообщение WM_CHAR.
ON_WM_VKEYTOITEM - Уведомление о нажатии кнопки
VK_SHIFT, VK_CONTROL, VK_ ALT и т.д.
VK_DOWN)
VK_UP, VK_RIGHT, VK_LEFT, VK_ESCAPE, VK_RETURN,
VK_SPACE VK_DELETE , VK_BACK