Кнопки с независимой фиксацией 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Кнопки с независимой фиксацией



Эти кнопки (флажки) создаются со стилем BS_CHECKBOX, BS_AUTOCHECKBOX, BS_3STATE или BS_AUTO3STATE. Кнопки стилей BS_CHECKBOX и BS_AUTOCHECKBOX имеют два состояния: флажок установлен или нет. Состояния кнопки изменяется функцией CButton::SetCheck:

m_wndCheckBox.SetCheck(BST_CHECKED); // Установить флажок m_wndCheckBox.SetCheck(BST_UNCHECKED); // Снять флажок

Для проверки текущего состояния кнопки служит функция CButton::GetCheck. Возвращаемое значение равно BST_CHECKED или BST_UNCHECKED.

Как и нажимаемые кнопки, флажки при нажатии посылают родительским окнами уведомления 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);

Кнопка в неопределенном состоянии выглядит как флажок на сером фоне. Это может обозначать в программе, что что-то "включено не полностью" или "выключено не полностью". Например, в текстовом редакторе неопределенное состояние флажка "полужирный шрифт" может означать, что в выделенном фрагменте текста есть как обычный, так и полужирный шрифт.

 

Кнопки с зависимой фиксацией

Кнопки с зависимой фиксацией (радиокнопки) имеют стиль BS_RADIOBUTTON или BS_AUTORADIOBUTTON. Обычно они используются в виде групп кнопок, когда каждая кнопка обозначает один из нескольких взаимно исключающих параметров. При нажатии кнопка BS_AUTORADIOBUTTON включает свою пометку, и отключает пометку у другой кнопки в группе. При использовании кнопки со стилем BS_RADIOBUTTON включать/выключать пометку придется программно с помощью CButton::SetCheck.

Радиокнопки, как и другие кнопки, посылают уведомления BN_CLICKED. Для кнопок со стилем BS_AUTORADIOBUTTON обработка этих уведомлений необязательна, они автоматически меняют свое состояние.

 

Групповые блоки

Групповой блок – это ЭУ "кнопка" со стилем BS_GROUPBOX. В отличие от кнопок других типов, групповой блок никогда не получает фокуса ввода и не посылает уведомлений родительскому окну.

Его единственная функция – визуально отделять группы ЭУ друг от друга. Заключив группу ЭУ внутрь группового блока, можно ясно показать пользователю, что эти ЭУ имеют некоторое общее назначение. На логическое группирование ЭУ блоки не влияют, поэтому недостаточно просто поместить набор ЭУ внутрь блока, надо обеспечить и соответствующую программную обработку для них.

 

1.2 Списки: класс CListBox

Элемент "список" предназначен для отображения списка текстовых строк, называемых элементами списка. У списка есть возможности сортировки элементов и прокрутки, если они не помещаются в области списка на экране.

Списки полезны для представления пользователю информации и для выбора одного или нескольких элементов из них. При щелчке или двойном щелчке на элементе список (если у него установлен стиль LBS_NOTIFY) посылает родительскому окну уведомление в виде сообщения WM_COMMAND.

Обычно список выводит элементы в виде вертикального столбца и позволяет выбрать только один из них. Выбранный (выделенный) элемент подсвечивается системным цветом COLOR_HIGHLIGHT. В Windows есть разновидности списка: список с выбором нескольких элементов, многоколоночных список, список с собственным отображением.

 

Создание списка

Обычный список с одиночным выбором можно создать следующим образом:

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); // Разрешение рисования

 

Добавление и удаление элементов

Добавление элементов в список выполняется функциями 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*, то потребуется явное преобразование указателя к нужному типу.

 

Поиск и извлечение элементов списка

В 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);

 

Уведомления, посылаемые списком

В 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

Статические ЭУ бывают трех видов: текст, прямоугольные рамки и изображения. Текстовые статические ЭУ часто используются в качестве меток для других ЭУ. Например, создать текстовую метку Имя можно так:

m_wndStatic.Create("Имя", WS_CHILD ¦ WS_VISIBLE ¦ SS_LEFT, rect, this, IDC_STATIC);

При использовании статических ЭУ для рисования прямоугольных рамок возможны около 10-ти различных вариантов прямоугольников. Они определяются различными стилями SS_, например, прямоугольник с "выдавленными" границами имеет стиль SS_ETCHEDFRAME (его можно использовать вместо группового блока):

m_wndStatic.Create("", WS_CHILD ¦ WS_VISIBLE ¦ SS_ETCHEDFRAME, rect, this, IDC_STATIC);

При выводе изображений (например, изображение дисковода в программе ScanDisk) статическому ЭУ можно передать дескриптор растрового изображения, указателя мыши, пиктограммы или метафайла GDI. Эти возможности ЭУ задаются стилями: SS_BITMAP, SS_ICON или SS_ENHMETAFILE. Пример ЭУ для вывода пиктограммы:

m_wndStatic.Create("", WS_CHILD ¦ WS_VISIBLE ¦ SS_ICON, rect, this, IDC_STATIC); m_wndStatic.SetIcon(hIcon);

По умолчанию статические ЭУ уведомлений не посылают, но если создать их со стилем SS_NOTIFY, то возможны 4 типа уведомлений, приведенных в табл. 7.4.

Таблица 7.4. Уведомления статических элементов управления

Код уведомления Когда посылается Макрос карты сообщений
STN_CLICKED Щелчок мышью на элементе ON_STN_CLICKED
STN_DBLCLK Двойной щелчок на элементе ON_STN_DBLCLK
STN_DISABLE ЭУ выключен (запрещен) ON_STN_DISABLE
STN_ENABLE ЭУ включен ON_STN_ENABLE

 

1.4 Элементы редактирования: класс CEdit

Элементы редактирования в MFC представлены классом CEdit. Можно выделить два вида элементов редактирования: однострочные и многострочные. На рис. 7.2 показано диалоговое окно с двумя однострочными элементами редактирования (строками ввода). Многострочный элемент редактирования можно увидеть, запустив программу Блокнот из группы стандартных программ Windows. Клиентская область Блокнота – это как раз один многострочный элемент редактирования.

Рис. 7.2. Диалоговое окно с двумя строками ввода.

Объем данных в этом ЭУ ограничен примерно 60 кб, что не является ограничением строк ввода, но существенно для многострочных элементов. Тогда можно воспользоваться другим ЭУ – элементом редактирования сложного текста (он входит в набор ЭУ Windows 95). Он применяется в программе WordPad.

В классе CEdit есть набор функций-членов для работы с элементами редактирования. В MFC есть набор макросов для обработки уведомлений от этих ЭУ. Наиболее часто используются строки ввода, и две функции для получения или задания строки в этом ЭУ: SetWindowText и GetWindowText. Они унаследованы классом CEdit от CWnd.

 

1.5 Комбинированные списки: класс CComboBox

Комбинированный список объединяет строку ввода и список в один ЭУ. Есть три разновидности: "простой", "выпадающий" и "выпадающий список".

Простые комбинированные списки используются реже всего – они всегда изображаются в открытом состоянии. Когда пользователь выбирает в списке элемент, он автоматически копируется в строку ввода. Пользователь может также напечатать текст непосредственно в строке ввода. Если введенный пользователем элемент совпадает с некоторым элементом списка, этот элемент автоматически выделяется.

Выпадающий комбинированный список отличается тем, что список выводится на экран только по требованию пользователя. Остальные возможности ручного ввода в строку списка остаются. Третий вид списка не позволяет вводить текст вручную, можно только выбирать элементы из списка.

Функции-члены CComboBox похожи на функции-члены CEdit и CListBox. Например, элементы добавляются в список функциями CComboBox::AddString и CComboBox::InsertString. Максимальное количество символов для строки ввода задается функцией CComboBox::LimitText. Функции GetWindowText и SetWindowText, унаследованные от CWnd, считывают или устанавливают текст строки редактирования. Есть и функции, уникальные для комбинированного списка, например, ShowDropDown для скрытия или показа выпадающего списка, или GetDroppedState для получения текущего состояния выпадающего списка – открыт он или нет.

 

1.6 Полосы прокрутки: класс CScrollBar

Класс CScrollBar является оболочкой для полос прокрутки. Полосы прокрутки аналогичны тем, которые добавляются в главное окно приложения при использовании оконных стилей WS_VSCROLL и WS_HSCROLL. ЭУ "Полоса прокрутки" создается вызовом CScrollBar::Create. Ее можно поместить в любое место родительского окна и сделать ее любого размера.

В отличие от других ЭУ, полоса прокрутки не посылает сообщений WM_COMMAND, а посылает сообщения WM_VSCROLL и WM_HSCROLL. В MFC-приложениях эти сообщения обрабатываются функциями-членами OnVScroll и OnHScroll, как описывалось в предыдущих лекциях.

Класс CScrollBar содержит набор функций для работы с полосами прокрутки, большинство из которых похожи на функции-члены CWnd для работы с полосами прокрутки окна верхнего уровня. CScrollBar::GetScrollPos и CScrollBar::SetScrollPos возвращают и устанавливают позицию ползунка полосы прокрутки, GetScrollRange и SetScrollRange возвращает или задает диапазон полосы. Все параметры полосы прокрутки можно установить одним вызовом CScrollBar::SetScrollInfo.

 



Поделиться:


Последнее изменение этой страницы: 2016-08-01; просмотров: 671; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.38.117 (0.018 с.)