Связывание методов класса диалогового окна с элементами управления




Каждый раз, когда элемент управления активизируется пользователем, он посылает сообщение WM_COMMAND своему окну-владельцу, т.е. диалоговому окну. С этим сообщением ассоциируется идентификатор выбранного элемента. Чтобы выполнить функцию элемента управления, процедура диалогового окна отвечает на сообщение WM_COMMAND идентификацией этого элемента управления и выполнением соответствующего действия. Для обработки сообщений каждое диалоговое окно имеет свою очередь сообщений, которую надо описать в соответствующей карте сообщений. Для этого в интерфейсе класса диалогового окна MFC Application Wizard объявляет карту сообщений. В файле реализации класса диалогового окна дается определение карты сообщений. Параметрами макроса определения карты сообщений являются классы диалогового окна и базовый класс CDialog:

 

BEGIN_MESSAGE_MAP(CMyDialog,CDialog)
………………………
END_MESSAGE_MAP()

 

Макросы, включаемые в карту сообщений, определяют обработчики сообщений, которые генерируются элементами управления диалогового окна. Элемент управления общается с родительским окном или окном-владельцем, посылая ему особые уведомляющие сообщения WM_COMMAND с параметрами, включающими код уведомления, идентификатор элемента управления и его дескриптор. Значение кода уведомлениязависит от конкретного элемента управления. Родительское окно интерпретирует этот код с учетом того, что ему известно о данном элементе управления. В качестве кодов уведомления используются идентификаторы сообщений с префиксами, значения которых приводятся в табл. А5 приложения А. Некоторые коды уведомлений приведены ниже. Например, код уведомления BN_CLICKED генерируется при установке или сбросе флажков и выборе переключателя. Код уведомления EN_CHANGE посылается при работе с текстовым полем, код LBN_DBLCLK вызван двойным щелчком на строке списка, код уведомления CBN_SELCHANGE посылается при изменении текущего выбора в комбинированном списке, LBN_SELCHANGE — при изменении текущего выбора в списке List Box и т.д. Для каждого сообщения существует его обработчик. Для перечисленных кодов уведомлений мастер создания обработчиков сообщений генерирует такие макросы:

 

ON_BN_CLICKED (id, memberFxn)
ON_EN_CHANGE (id, memberFxn)
ON_CBN_SELCHANGE(id, memberFxn)
ON_LBN_DBLCLK (id, memberFxn)
ON_LBN_SELCHANGE(id, memberFxn)

Аргументами макросов являются идентификаторы элементов управления (id), посылающие окну-владельцу сообщения, и функции-члены класса диалогового окна (memberFxn), реализующие обработку соответствующего сообщения.

Полный перечень обработчиков уведомляющих сообщений приведен в табл.А6 приложения А.

Для обработки сообщения, посылаемых диалоговому окну, в класс диалогового окна необходимо добавить обработчики этих сообщений. Для программы FontDemo необходимы обработчики сообщений, посылаемых при первом открытии диалогового окна, его перерисовке, щелчке на флажке или переключателе.

Для перерисовки окна Windows посылает сообщение WM_PAINT. Окно приложения получает сообщение WM_PAINT сразу после запуска программы для того, чтобы отобразить данные, соответствующие исходному состоянию приложения. Необходимость перерисовки главного окна вызывается также изменением его размеров, перекрытием его другими окнами, в случае явного объявления его или какой-то его части недействительной. В ответ на сообщение WM_PAINT, посылаемое окну, MFC вызывает его обработчик. При этом в карту сообщений класса окна, которое будет обновляться, включается макрос ON_WM_PAINT(). Этому макросу соответствует функция-обработчик имеющая следующий прототип.

afx_msg void CWnd::OnPaint();

В нашей программе FontDemo в результате установки значений элементов управления в диалоговом окне возникает необходимость его перерисовки. Чтобы сгенерировать сообщение WM_PAINT, обрабатывающееся функцией OnPaint(), необходимо явно вызвать функцию CWnd::UpdateWindow(), если область обновления не пуста. В противном случае сообщение WM_PAINT не посылается. Это сообщение поступает прямо оконной процедуре, минуя очередь сообщений приложения. В нашем случае сообщение WM_PAINT будет поступать процедуре диалогового окна. Прототип функции обновления окна такой:

void CWnd::UpdateWindow();

В процессе обработки сообщений от элементов управления возникает необходимость перерисовать часть области диалогового окна. В программе FontDemo в диалоговом окне отображается образец форматирования текста. В этом случае необходимо определять размеры области перерисовки, которые обычно сохраняются в структуре типа RECT или в объекте класса CRect. Напомним состав полей структуры типа RECT:

typedef struct tagRECT {
LONG left; //х-координата левого верхнего угла прямоугольника
LONG top; //y-координата левого верхнего угла прямоугольника
LONG right; //х-координата правого нижнего угла прямоугольника
LONG bottom;//y-координата правого нижнего угла прямоугольника
} RECT;

Прототип функции, определяющей размеры требуемой прямоугольной области, показан ниже. Параметром является указатель на объект CRect или структуру RECT

void CWnd::GetWindowRect(LPRECT lpRect);

Функции, определяющие размеры оконных областей, возвращают координаты устройства, которые задаются относительно левого верхнего угла экрана дисплея. В эту область включаются заголовок окна, линейки прокрутки, строка меню. Для выполнения операций перерисовки эти координаты устройства необходимо конвертировать в координаты клиентской области окна, в которую входит только рабочая область окна без заголовка окна и строки меню. Прототипы функции, реализующей преобразования из координат устройства в координаты клиентской области, такие:

void CWnd::ScreenToClient(LPPOINT lpPoint) const;
void CWnd::ScreenToClient(LPRECT lpRect) const;

Параметр lpPoint определяет указатель на объект CPointили структуру POINT, которые содержат координаты устройства, требующие преобразования, lpRect — указатель на объект CRect или структуру RECT. Напомним состав полей структуры POINT:

typedef struct tagPOINT {
LONG x; //х-координата точки
LONG y; //y-координата точки
} POINT;



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-04-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: