Как делали MFC - Обрабатываем сообщения

Наш класс должен обрабатывать сообщения. Мы с вами реализуем эту обработку. Конечно это обработка будет точно такая как и при программировании на С. Мы же помните делаем оболочку чем MFC и является. Работаем с нашим классом CWinApp. Создадим функцию PumpMessage. Эта функция будет нам говорить есть сообщения или нет.

class CWinApp  
{
..........
	virtual ~CWinApp();
private:
	MSG  m_msgCur;			// структура сообщения Win32
	BOOL PumpMessage();		// насос для сообщений :-)
};

Реализация.

BOOL CWinApp::PumpMessage()
{
if (!::GetMessage(&m_msgCur, NULL, NULL, NULL))	// Есть ли сообшение в очереди ?
{ 			
	return FALSE;				// нет вернуть FALSE
}
::TranslateMessage(&m_msgCur);			// сообщение есть обработать
::DispatchMessage(&m_msgCur);	
return TRUE;					// да сообщение есть вернуть TRUE
}

Ну и теперь можно реализовать Run.

int CWinApp::Run()
{
while (1)				// запуск цикла обработки сообщений
{		
	while (!::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE)) // Есть ли сообщение в очереди ?
	{
	  // нет сообщения спросить еще			
	}				
	if (!PumpMessage())	break;	// Сообщение есть, выбрать его из очереди
}	
return 0;
}

Обратите внимание, что мы используем PeekMessage для того что бы проверить есть ли сообщение или нет. Дело в том, что эта функция не блокирует поток, и мы можем выполнять какие то задачи еще, пока нет сообщений. А вот если оно там появилось, то мы его заберем PumpMessage.

Перейдите в проект TestMyLib и выполните перекомпиляцию Rebuild All потом запустите приложение. Оно будет в памяти. По CTRL-ALT-DEL вы сможете его увидеть. Оно выполняется и ждет команды на завершение. Только взять ее неоткуда.

gif/4_1.gif (5596 b)


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 15.07.2001