Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 семестр, WinAPI, MFC.pdf
Скачиваний:
370
Добавлен:
15.06.2014
Размер:
6.17 Mб
Скачать

Кроме представленных членов у класса имеются 5 функций:

virtual void CCmdlll::Enable(BOOL bOn = TRUE) -

блокирует (bOn = FALSE) или разблокирует (ЬОп = TRUE) элемент интерфейса пользователя, ассоциированныйсэтойкомандой.

virtual void CCmdUI::SetCheck(int nCheck = 1) -

устанавливает элемент интерфейса пользователя в одно из возможных состояний в зависимости от значения передаваемого параметра: 0 — непомеченное, 1 — помеченное, 2 — неопределенное. Последнее состояние применимо только ккнопкампанелейинструментов.

virtual void CCmdUI::SetRadio(BOOL bOn = TRUE) -

блокирует (bOn = FALSE) или разблокирует (ЬОп = TRUE) группу переключателей.

virtual void CCmdUI::SetText(LPCTSTR IpszText) -

устанавливаеттекстдляданногоэлементаинтерфейсапользователя.

void CCmdUI::ContinueRouting() —

позволяет направить команду на обработку дальше по маршруту. Эта функция действует совместно с обработчиком команды ON_COMMAND_EX, который возвращает FALSE.

Практические аспекты использования перечисленных здесь возможностей будут рассмотрены при обсуждении вопросов организации интерфейса пользователя.

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

Функции для работы с сообщениями

Понимание работы с сообщениями крайне важно для написания правильных и эффективных программ для Windows. Поэтому рассмотрим те основные функции, которые вы можете (и должны) широко использовать:

static const MSG* CWnd::GetCurrentMessage() -

возвращает указатель на структуру MSG, которая содержит информацию о текущем сообщении. Может бытьвызванатолькоизобработчика, заданногомакросом ON_MESSAGE.

LRESULT CWnd::Default() -

служитдлявызоваоконнойпроцедуры, выполняемойпоумолчанию.

virtual BOOL CWnd::PreTranslateMessage(MSG *pMsg) -

используется классом CWinApp для фильтрации оконных сообщений до того, как они будут распределены функциями Windows TranslateMessage и DispatchMessage.

LRESULT CWnd::SendMessage( UlNTmsg,

WPARAM wPrm = 0,

LPARAM IPrm = 0) -

посылает сообщение в объект CWnd, непосредственно вызывая оконную процедуру, и не выходит из нее, пока танеобработаетсообщение.

BOOL CWnd::PostMessage( UINT msg,

WPARAM wPrm = 0,

LPARAM IPrm = 0) -

помещает сообщение в очередь приложения и заканчивает работу без ожидания его обработки. Из очереди сообщения извлекаются функциями Windows GetMessage или PeekMessage.

BOOL CWnd::SendNotifyMessage( UINT msg,

WPARAM wPrm = 0,

LPARAM IPrm = 0) -

посылает в окно определенное извещение. Если окно было создано текущим потоком, то функция для обработки извещения вызывает оконную процедуру и не завершается, пока оно не будет обработано. Если же окно было созданодругим потоком, то послав извещение в оконную процедуру, функция завершает своюработу.

UINT ::RegisterWindowMessage(LPCTSTR IpString) -

позволяет получить идентификатор (в диапазоне от ОхСООО до OxFFFF) нового уникального сообщения,

который может затем использоваться при вызовах функций SendMessage или PostMessage. В качестве параметра IpString она использует указатель на строку, определяющую имя сообщения. Эта функция должна использоваться для предотвращения возможных конфликтов в случае, когда нужно связать между собой два (или больше) приложения. Зарегистрированное сообщение действует до окончания сеанса работы Windows. Обработчик сообщения ассоциируется с ним посредством специального макроса ON_REGISTERED_MESSAGE, например, как показано ниже:

class CUserWnd : public CParentWnd

/ / { {AFX_MSG_MAP(CUserWnd)

afx_msg LRESULT OnSample(WPARAM wParam, LPARAM IParam); / / { {AFX_MSG_MAP DECLARE_MESSAGE_MAP()

} ;

UINT WM_SAMPLE = RegisterWindowMessage("MESSAGE_SAMPLE");

BEGIN_MESSAGE_MAP(CUserWnd, CParentWnd) // { (AB'X_MSG MAP (CUserWnd)

ON__REGISTERED_MESSAGE(WM_SAMPLE, OnSample) //}}AFX_MSG_MAP END MESSAGE MAP()

Наиболее

интересными из перечисленных являются две функции: Send Message и Post Message

(рис. 19):

 

SendM

WndProc

essage

 

> Цикл обработки сообщений

PostMe

WndProc

ssage

 

Рис. 19. Посылка сообщений функциями SendMessage и PostMessage

Основная цель этих функций — посылка сообщения в окно своего или некоторого другого приложения. Но на этом их совпадения заканчиваются. Дело в том, что функция SendMessage явно вызывает процедуру того окна, которое ассоциировано с объектом, вызывающим ее, и не выходит из процедуры, пока та не обработает сообщение. Другими словами, выполнение программы не будет продолжено до тех пор, пока сообщение не будет обработано.

В отличие от нее, функция PostMessage не вызывает явно оконную процедуру, а посылает сообщение в очередь сообщений приложения, откуда оно выбирается с помощью функции GetMessage или PeekMessage. Выполнение самой функции PostMessage при этом завершается и работа приложения может быть продолжена.

Но от теории, пусть даже и очень важной, пора переходить к практике. Неоднократное упоминание классов оконных объектов (и даже некоторое знакомство с ними) — одной из важнейших составляющих библиотеки классов MFC, диктует необходимость их скорейшего рассмотрения.