

Программирование на языке MFC
Мой второй блог в серии программирования
Метод Onldle
Завершив рассмотрение метода PumpMessage(), мы тем самым завершили рассмотрение и метода Run(). Из всего сказанного можно сделать вывод о том, что метод Run(), включая метод Pump-Message(), реализует основной цикл обработки сообщений, определяя при этом периоды «простоя» (в очереди нет сообщений) и осуществляя во время простоя вызов метода Onldle(). Тем самым метод позволяет осуществлять выполнение дополнительных задач в период «простоя».
Исходя из того, о чем мы говорили выше, можно сделать еще один вывод: в совокупности метод InitlnstanceQ и метод RunQ являются аналогами функции WinMainQ, а совокупность макросов-обработчиков событий представляет собой аналог оконной функции. Теперь наших знаний достаточно для того, чтобы создать объект-приложение, главное окно приложения и написать обработчики сообщений. Для примера я написал программу, которая выдает в центр окна слова «НеИо, World!» (надо же было когда-нибудь написать «НеИо, World!», не так ли? ©). Исходный текст этой программы:
#include <afxwin.h>
// Объявляем класс приложения, его поля и методы.
class CTheFirstApp : public CWinApp
{
public:
virtual BOOL Initlnstance (); };
// Объявляем класс окна, его поля и методы.
class CMainWnd : public CWnd
{
public: -CMainWnd() ;
afx_msg void OnPaintO; DE С LARE_ME S SAGE_MA P()
};
// Деструктор класса, должен быть переопределен, // т.к. у класса CWnd деструктор виртуальный
CMainWnd::-CMainWnd()
{
}
// Инициализация класса приложения. BOOL CTheFirstApp::Initlnstance () {
CString pszWndClassName;
pszWndClassName = AfxRegisterWndClass( CS_HREDRAW |
CS_VREDRAW, LoadStandardCursor ( IDC_ARROW ), ( HBRUSH ) ::GetStockObject( WHITE_BRUSH ), LoadStandardIcon( IDI_APPLICATION ) ); CMainWnd* pMainWnd = new CMainWnd; pMainWnd->CreateEx( 0, pszWndClassName,
_T ( "Sample" ) , WS_OVERLAPPEDWINDOW, CRect (0, 0, 200, 200), NULL, NULL ); m__pMainWnd = pMainWnd; pMainWnd->ShowWindow (m__nCmdShow ) ; pMainWnd->UpdateWindow();
return TRUE;
}
// Перерисовка окна прило-// жения – обработка // сообщения WM PAINT.
CMainWnd::OnPaint()
void {
CRect Rect; CPaintDC dc( this ); GetClientRect( &Rect ); dc.DrawText( _T( "Hello,
World!" ), &Rect, DT_SINGLELINE | DT_CENTER I DT_VCENTER );
}
// Карта сообщений BEGIN_MESSAGE_MAP( CMainWnd, CWnd )
Hello, World!
ON_WM_PAINT () EN D_ME S SAGE_MAP()
CTheFirstApp theApp;
Создаваемое программой окно приведено на рис.3.
Обратите внимание, что при объявлении объекта класса CWnd был использован макрос DECLARE__MESSAGE__MAP(), а при реализации класса – макросы BEGIN__MESSAGE_MAP() и END__MESSAGE__MAP(). В связи с тем, что мне необходимо было перехватить обработку ТОЛЬКО сообщения WM_PAINT, карта сообщений состоит из одного элемента, который я определил, воспользовавшись для этого макросом ON_PAINT().
Похожие статьи: CWinApp, Деструктор класса
