Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 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