Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Как и нажимаемые кнопки, флажки при нажатии посылают родительским окнами уведомления BN_CLICKED. Кнопки со стилем BS_AUTOCHECKBOX изменяют состояния при щелчке мышью автоматически, а со стилем BS_CHECKBOX – нет. Поэтому для кнопок со стилем BS_CHECKBOX требуется обработчик BN_CLICKED, который будет управлять состоянием кнопки, например:
void CMainWindow::OnCheckBoxClicked() { m_wndCheckBox. SetCheck( m_wndCheckBox. GetCheck() == BST_CHECKED? BST_UNCHECKED : BST_CHECKED ); } |
Кнопки со стилем BS_3STATE или BS_AUTO3STATE имеют не два, а три состояние. Добавочное состояние – "неопределенное", обозначается константой BST_INDETERMINATE:
m_wndCheckBox. SetCheck( BST_INDETERMINATE ); |
Кнопка в неопределенном состоянии выглядит как флажок на сером фоне. Это может обозначать в программе, что что-то "включено не полностью" или "выключено не полностью". Например, в текстовом редакторе неопределенное состояние флажка "полужирный шрифт" может означать, что в выделенном фрагменте текста есть как обычный, так и полужирный шрифт.
1.1.3 Кнопки с зависимой фиксацией
Кнопки с зависимой фиксацией (радиокнопки) имеют стиль BS_RADIOBUTTON или BS_AUTORADIOBUTTON. Обычно они используются в виде групп кнопок, когда каждая кнопка обозначает один из нескольких взаимно исключающих параметров. При нажатии кнопка BS_AUTORADIOBUTTON включает свою пометку, и отключает пометку у другой кнопки в группе. При использовании кнопки со стилем BS_RADIOBUTTON включать/выключать пометку придется программно с помощью CButton::SetCheck.
Радиокнопки, как и другие кнопки, посылают уведомления BN_CLICKED. Для кнопок со стилем BS_AUTORADIOBUTTON обработка этих уведомлений необязательна, они автоматически меняют свое состояние.
1.1.4 Групповые блоки
Групповой блок – это ЭУ "кнопка" со стилем BS_GROUPBOX. В отличие от кнопок других типов, групповой блок никогда не получает фокуса ввода и не посылает уведомлений родительскому окну.
Его единственная функция – визуально отделять группы ЭУ друг от друга. Заключив группу ЭУ внутрь группового блока, можно ясно показать пользователю, что эти ЭУ имеют некоторое общее назначение. На логическое группирование ЭУ блоки не влияют, поэтому недостаточно просто поместить набор ЭУ внутрь блока, надо обеспечить и соответствующую программную обработку для них.
1.2 Списки: класс CListBox
Элемент "список" предназначен для отображения списка текстовых строк, называемых элементами списка. У списка есть возможности сортировки элементов и прокрутки, если они не помещаются в области списка на экране.
Списки полезны для представления пользователю информации и для выбора одного или нескольких элементов из них. При щелчке или двойном щелчке на элементе список (если у него установлен стиль LBS_NOTIFY) посылает родительскому окну уведомление в виде сообщения WM_COMMAND.
Обычно список выводит элементы в виде вертикального столбца и позволяет выбрать только один из них. Выбранный (выделенный) элемент подсвечивается системным цветом COLOR_HIGHLIGHT. В Windows есть разновидности списка: список с выбором нескольких элементов, многоколоночных список, список с собственным отображением.
1.2.1 Создание списка
Обычный список с одиночным выбором можно создать следующим образом:
CListBox m_wndListBox; m_wndListBox. Create( WS_CHILD ¦ WS_VISIBLE ¦ LBS_STANDARD, rect, this, IDC_LISTBOX ); |
Стиль LBS_STANDARD является объединением стилей WS_BORDER, WS_VSCROLL, LBS_NOTIFY и LBS_SORT. Т. е. у списка будет рамка, вертикальная полоса прокрутки, он будет посылать уведомления родительскому окну при смене выделения или при двойном щелчке на элементе, и он будет сортировать элементы по алфавиту. По умолчанию полоса прокрутки включается, только если элементы не умещаются в области списка.
По умолчанию список перерисовывает себя при добавлении или удалении элемента. Если добавляется несколько сотен элементов, это может замедлять работу программы и приводить к мерцанию списка на экране. Перед добавлением большого количества элементов можно запретить рисование списка, а затем снова разрешить:
m_wndListBox. SendMessage(WM_SETREDRAW, FALSE,0); // Запрещение рисования ... m_wndListBox. SendMessage(WM_SETREDRAW, TRUE,0); // Разрешение рисования |
1.2.2 Добавление и удаление элементов
Добавление элементов в список выполняется функциями CListBox::AddString и CListBox::InsertString (при вставке строки указывается индекс элемента, начиная с 0):
m_wndListBox. AddString( string ); m_wndListBox. InsertString( 3, string ); // Вставка 4-го элемента |
Текущее количество элементов в списке возвращает функция CListBox::GetCount.
CListBox::DeleteString удаляет из списка элемент с заданным индексом. Она возвращает количество элементов, оставшихся в списке. Очистить список полностью может функция CListBox::ResetContent.
Бывают полезными функции CListBox::SetItemDataPtr и CListBox::SetItemData, позволяющие сопоставить каждому элементу списка указатель на значение типа DWORD. Этот указатель, связанный с заданным элементом списка, можно получить функцией CListBox::GetItemDataPtr или CListBox::GetItemData. Эта возможность полезна для связи элемента списка с некоторыми дополнительными данными. Например, вы можете поместить в список имена людей, и хранить в элементах списка указатели на структуры, содержащие адреса и телефоны этих людей. Т. к. GetItemDataPtr возвращает указатель типа void*, то потребуется явное преобразование указателя к нужному типу.
1.2.3 Поиск и извлечение элементов списка
В CListBox есть функции-члены для получения и изменения текущей позиции выделения, для поиска и извлечения элементов списка. Перечень этих наиболее часто используемых функций (применительно к списку с одиночным выделением) приведены в табл. 7.2.
Таблица 7.2. Некоторые функции-члены CListBox для работы с элементами списка
Функция CListBox | Назначение |
GetCurSel | Возвращает индекс (начиная с 0) текущего выделенного элемента или LB_ERR, если ни один элемент не выделен. |
SetCurSel | Выделение элемента по индексу (или -1 для снятия выделения) |
GetSel | Проверка, выделен ли элемент с заданным индексом |
SelectString | Поиск и выделение элемента, начинающегося с заданной строки |
FindString | Определение индекса элемента, начинающегося с заданной строки |
FindStringExact | Определение индекса элемента, совпадающего с заданной строкой |
GetText | Получение строки элемента с заданным индексом |
GetTextLen | Определение длины строки элемента с заданным индексом |
Например, чтобы найти с начала списка и выделить элемент, начинающийся со слова Times (вроде "Times New Roman" или "Times Roman"), можно выполнить следующие вызовы:
m_wndListBox. SelectString( -1, "Times" ); |
Получить строку текущего выделенного элемента можно так:
CString string; int nIndex = m_wndListBox. GetCurSel(); if ( nIndex!= LB_ERR ) m_wndListBox. GetText( nIndex, string ); |
1.2.4 Уведомления, посылаемые списком
В MFC-приложениях уведомления от списка можно обрабатывать в функциях-членах класса, зарегистрированных в карте сообщений с помощью макросов ON_LBN_... (табл. 7.3).
Таблица 7.3. Уведомления списка
Код уведомления | Когда посылается | Макрос карты сообщений | Необходим ли у списка стиль LBS_NOTIFY? |
LBN_SETFOCUS | Список получил фокус ввода | ON_LBN_SETFOCUS | Нет |
LBN_KILLFOCUS | Список потерял фокус ввода | ON_LBN_KILLFOCUS | Нет |
LBN_ERRSPACE | Операция отменена из-за нехватки памяти | ON_LBN_ERRSPACE | Нет |
LBN_DBLCLK | Двойной щелчок на элементе | ON_LBN_DBLCLK | Да |
LBN_SELCHANGE | В списке изменено выделение | ON_LBN_SELCHANGE | Да |
LBN_SELCANCEL | Выделение снято | ON_LBN_SELCANCEL | Да |
Из перечисленных уведомлений чаще всего приложения обрабатывают LBN_DBLCLK и LBN_SELCHANGE. Ниже приведен пример обработчика LBN_DBLCLK, в котором выполняется вывод выделенного элемента в информационном окне:
// Фрагмент карты сообщений CMainWindow ON_LBN_DBLCLK( IDC_LISTBOX, OnItemDoubleClicked ) ... void CMainWindow::OnItemDoubleClicked() { CString string; int nIndex = m_wndListBox. GetCurSel(); m_wndListBox. GetText( nIndex, string ); MessageBox( string ); } |
1.3 Статические элементы: класс CStatic
Статические ЭУ бывают трех видов: текст, прямоугольные рамки и изображения. Текстовые статические ЭУ часто используются в качестве меток для других ЭУ. Например, создать текстовую метку Имя можно так:
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |


