Программирование на языке 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().

Похожие статьи: ,