| MFC-класс | Тип и описание элемента управления |
| CAnimateCtrl | Анимация |
| CButton | Кнопки, флажки, переключатели, рамки |
| CBitmapButton | Кнопки, отображающие растровые рисунки |
| CComboBox | Поле со списком |
| CComboBoxEx | Расширенное поле со списком |
| CDateTimeCtrl | Элемент Дата/Время |
| CEdit | Поле |
| CHeaderCtrl | Заголовок — окно, размещаемое над столбцами таблицы и содержащее заголовки столбцов с настраиваемой шириной |
| CHotKeyCtrl | Горячая клавиша |
| CIPAddressControl | IP-адрес |
| CListBox | Список |
| CCheckListBox | Список с флажками. Каждый пункт содержит флажок. Например, программа Setup в Visual C++ использует списки с флажками для предоставления пользователю возможности выбора инсталлируемых компонентов |
| CDragListBox | Перемещаемый список. Позволяет пользователю перемещать отдельные пункты списка для их переупорядочения |
| CListCtrl | Окно списка |
| CMonthCalCtrl | Календарь по месяцам |
| COleControl | Элементы управления ActiveX — многократно используемые компоненты программного обеспечения. |
| ProgressCtrl | Индикатор |
| CReBarCtrl | Переключаемая панель. |
| CRichEditCtrl | Расширенное поле |
| CScrollBar | Полосы прокрутки: вертикальная или горизонтальная |
| CSliderCtrl | Регулятор |
| CSpinButtonCtrl | Счетчик |
| CStatic | Надписи, рисунки и рамки |
| CStatusBarCtrl | Строка состояния. Использование класса CStatusBarCtrl — альтернатива способу создания строк состояния |
| CTabCtrl | Набор вкладок. Использование класса CTabCtrl — альтернатива способу создания диалоговых окон с вкладками в программах MFC (далее в этой главе) |
Окончание табл. 6.3
| MFC-класс | Тип и описание элемента управления |
| CToolbarCtrl | Панель инструментов. Использование класса CToolbarCtrl — альтернатива способу создания панелей инструментов в программах MFC |
| CTooltipCtrl | Всплывающая подсказка. При создании панели инструментов MFC автоматически реализует всплывающие подсказки |
| CTreeCtrl | Дерево |
Функции-члены этих классов можно применять для получения информации или выполнения операций над элементом управления в диалоговом окне. Так как каждый из классов управления порождается прямо или косвенно от класса CWnd, то в число вызываемых функций-членов входят также функции, определенные в классе CWnd. В табл. 6.4 приведены функции, которые можно использовать для манипулирования элементами управления.
Т а б л и ц а 6.4
Функции класса CWnd для манипулирования
элементами управления диалогового окна
| Функция | Назначение |
| CheckDlgButton() | Выбирает или отменяет выбор флажка или переключателя |
| CheckRadioButton() | Выбирает указанный переключатель и отменяет выбор остальных переключателей в указанном наборе |
| DlgDirList() | Добавляет имена файлов, каталогов или дисков в список |
| DlgDirListComboBox() | Добавляет имена файлов, каталогов или дисков в поле со списком |
| DlgDirSelect() | Получает имя текущего, выбранного в списке, файла, каталога или диска |
| DlgDirSelectComboBox() | Получает имя текущего, выбранного в поле со списком, файла, каталога или диска |
| GetCheckedRadioButton() | Возвращает идентификатор выбранного переключателя в указанном наборе переключателей |
| GetDlgItem() | Возвращает указатель на временный объект для заданного элемента управления |
| GetDlgItemInt() | Возвращает числовое значение, представленное в текстовом виде в указанном элементе управления |
| GetDlgItemText() | Получает текст, отображаемый внутри элемента управления |
Окончание табл. 6.4
| Функция | Назначение |
| GetNextDlgGroupItem() | Возвращает указатель на временный объект для следующего (или предыдущего) элемента управления внутри группы |
| GetNextDlgTabItem() | Возвращает указатель на временный объект для следующего элемента управления (в порядке обхода), которому задано свойство Tabstop |
| IsDlgButtonChecked() | Возвращает статус отметки флажка или переключателя |
| SendDlgItemMessage() | Посылает сообщение элементу управления |
| SetDlgItemInt() | Преобразовывает целое число в текст и передает его элементу управления |
| SetDlgItemText() | Задает текст, отображаемый элементом управления |
| EnableWindow() | Разрешает или блокирует доступ к элементу |
Вызов функции, инкапсулируемой в классе элемента управления диалогового окна, выполняется через объект класса элемента управления, связанный с элементом управления. Создать объект класса элемента управления можно такими способами.
Первый способ использует диалоговое окно Add Member Variable Wizard, в котором надо установить флажок Control variable, в списке Category выбрать значение Control. Мастер создаст соответствующий объект для элемента управления, например, объект класса CEdit для поля. При отображении диалогового окна MFC автоматически свяжет элемент управления с объектом класса так, чтобы можно было вызывать функции класса элемента управления для работы с ним. Функции можно вызывать только тогда, когда диалоговое окно отображено, иначе подобная связь не поддерживается.
Второй способ использует функцию CWnd::GetDlgItem()для объекта диалогового окна, чтобы получить указатель на временный объект элемента управления внутри диалогового окна. Например, вместо создания постоянного объекта класса элемента управления можно из функции CFormatDlg::OnInitDialog() инициализации диалогового окна вызвать функцию CWnd::GetDlgItem(), чтобы получить указатель на временный объект, для которого затем вызываются функции класса объекта управления. Прототип функции CWnd::GetDlg-Item() такой
CWnd* CWnd::GetDlgItem(int nID) const;
Параметр nID определяет идентификатор элемента управления, указатель на который требуется получить. Так как функция CWnd::GetDlgItem() возвращает указатель класса CWnd, то его необходимо преобразовать в указатель на соответствующий класс элемента управления. Так как указатель временный, он используется только во время обработки текущего сообщения и в дальнейшем не сохраняется.
Приведем пример определения указателя на объект класса CEdit, который связан с элементом управления, имеющим идентификатор IDC_SPACING.
CEdit *p_Edit = (CEdit *)GetDlgItem (IDC_SPACING);
При работе с флажками и переключателями необходимо определять их состояние. Эти элементы управления могут быть выбраны (установлены) или не выбраны (сброшены). Функция CWnd::IsDlgButtonChecked()вызывается для того, чтобы убедиться, что переключатель выбран или флажок установлен. Параметр определяет идентификатор элемента управления. Прототип функции такой.
UINT CWnd::IsDlgButtonChecked(int nIDButton) const;
Если в процессе работы с элементами управления необходимо сделать недоступным переключатель или запретить его отметку, то необходимо получить объект класса CButtonи связать его с переключателем, имеющим заданный идентификатор. Чтобы выбрать переключатель или отменить его выбор, вызовите функцию CButton::SetCheck(), прототип которой показан ниже. Параметр функции задает состояние переключателя (1 — выбран, 0 — не выбран, 2 — неопределенное).
void CButton::SetCheck(int nCheck);
Для разрешения или блокирования доступа к переключателю используют функцию CWnd::EnableWindow()с аргументом, равным TRUE, если элемент доступен, и FALSE, если он заблокирован. Прототип функции приводится ниже.
BOOL CWnd::EnableWindow(BOOL bEnable = TRUE);
Объекты класса CEdit, которые связаны с текстовым полем диалогового окна, можно использовать для ограничения количества вводимых символов. Для этого вызывают функцию CEdit::LimitText(), предварительно определив указатель на элемент управления.
((CEdit *)GetDlgItem (IDC_SPACING))->LimitText (1);
Хотя элементы управления обычно связаны с диалоговыми окнами, их можно отображать внутри любого окна программы. Например, можно отобразить один или несколько элементов управления прямо внутри окна представления. В этом случае необходимо добавить код для явного создания, размещения и отображения элемента управления. Для этого объявите объект соответствующего MFC-класса элемента управления (можно сделать его членом класса главного окна). Вызовите функцию-член класса элемента управления Create(), чтобы отобразить его, задав требуемый размер, позицию и другие атрибуты. Обратите внимание: элемент управления является дочерним по отношению к окну, в котором он отображается. Если окно представления в основном содержит лишь набор элементов управления, лучше всего породить класс представления от класса CFormViewи использовать шаблон диалогового окна вместо создания элементов управления по отдельности.