Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
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.
2. Неочевидные аспекты программирования элементов управления
Одно из преимуществ MFC при программировании ЭУ – простота изменения поведения ЭУ путем создания подкласса от одного из готовых классов ЭУ. Например, легко создать строку ввода для ввода только чисел или список для отображения изображений вместо текста. Вы также можете разрабатывать повторно используемые, самодостаточные классы ЭУ, которые сами обрабатывают свои сообщения с уведомлениями.
2.1 Строка ввода для приема числовых значений
MFC-классы для ЭУ полезны как объектно-ориентированный интерфейс для доступа к ЭУ. Но они также дают возможность создания подклассов, модифицирующих поведение стандартных ЭУ посредством добавления новых обработчиков сообщений или перегрузки имеющихся обработчиков.
В качестве примера рассмотрим числовую строку ввода. Обычная строка ввода позволяет вводить любые символы, а эта должна принимать только цифры (например, для ввода телефонов, серийных номеров и т. п.).
Унаследуем класс от CEdit и модифицируем обработчик OnChar для приема только цифровых символов:
class CNumEdit : public CEdit { protected: afx_msg void OnChar( UINT nChar, UINT nRepCnt, UINT nFlags ); DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP( CNumEdit, CEdit ) ON_WM_CHAR() END_MESSAGE_MAP() void CNumEdit::OnChar( UINT nChar, UINT nRepCnt, UINT nFlags ) { if ( (( nChar >= `0' ) && ( nChar <= `9' )) ¦¦ ( nChar == VK_BACK ) ) CEdit::OnChar( nChar, nRepCnt, nFlags ); } |
Клавиша с кодом VK_BACK в CNumEdit тоже принимается, чтобы пользователь мог удалять символы в строке клавишей Backspace. Проверять коды других клавиш редактирования (например, Home и Del) не надо, т. к. они не генерируют сообщений WM_CHAR.
2.3 Отражение сообщений
В MFC 4.0 появился набор макросов карты сообщений (табл. 7.5), предназначенных для передачи сообщений с уведомлениями обратно в элементы управления, пославшие эти сообщения – для "отражения сообщений". Отражение сообщений – важный прием для разработки классов повторно используемых ЭУ, т. к. он позволяет реализовать поведение ЭУ независимо от поведения окна-владельца.
С помощью макросов отражения сообщений можно сделать так, чтобы уведомление от ЭУ обрабатывалось функцией-членом класса ЭУ.
Таблица 7.5. Макросы карты сообщений для отражения сообщений ЭУ
Макрос | Какие сообщения отражаются |
ON_CONTROL_REFLECT | Отражение уведомлений, посылаемых в виде сообщений WM_COMMAND |
ON_NOTIFY_REFLECT | Отражение уведомлений, посылаемых в виде сообщений WM_NOTIFY |
ON_UPDATE_COMMAND_UI_REFLECT | Отражение уведомлений обновления панелей инструментов, строк состояния и других ЭУ |
ON_WM_CTLCOLOR_REFLECT | Отражение сообщений WM_CTLCOLOR |
ON_WM_DRAWITEM_REFLECT | WM_DRAWITEM от ЭУ с собственным отображением |
ON_WM_MEASUREITEM_REFLECT | WM_MEASUREITEM от ЭУ с собственным отображением |
ON_WM_COMPAREITEM_REFLECT | WM_COMPAREITEM от ЭУ с собственным отображением |
ON_WM_DELETEITEM_REFLECT | WM_DELETEITEM от ЭУ с собственным отображением |
ON_WM_CHARTOITEM_REFLECT | WM_CHARTOITEM от списков |
ON_WM_VKEYTOITEM_REFLECT | WM_VKEYTOITEM от списков |
ON_WM_HSCROLL_REFLECT | WM_HSCROLL от полос прокрутки |
ON_WM_VSCROLL_REFLECT | WM_VSCROLL от полос прокрутки |
ON_WM_PARENTNOTIFY_REFLECT | Отражение сообщений WM_PARENTNOTIFY |
Предположим, что требуется разработать класс списка, самостоятельно обрабатывающий собственное уведомление LBN_DBLCLK для вывода информационного окна с текстом элемента, на котором был двойной щелчок. Ниже приведено описание подкласса CListBox с использованием отраженного сообщения:
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


