Цикл сообщений в MFC
Я немного узнал о Win32 API, но теперь я хочу изучать MFC. В моей книге они сказали, что CWinApp
класс управляет основным потоком приложения, но я не могу найти что-то вроде GetMessage
, DispatchMessage
функции в этом классе. Так как это может начать цикл сообщений?
Кто-нибудь объясните мне, пожалуйста. Извините, я новичок в MFC, и мой английский плохой. И где я могу найти некоторые электронные книги / учебные пособия по MFC в Visual Studio?
2 ответа
Это все сделано в CWinApp:Run
раздел.
После InitInstance
возвращает истину, CWinApp:Run
запускается, и цикл обработки сообщений выполняет свою роль. Эта петля сообщений сложна, потому что она также обрабатывает OnIdle
звонки, когда приложение не имеет ничего общего.
Просто посмотрите в исходный код.
MFC чем-то напоминает завернутый слой на Win32. Цикл сообщений находится внутри члена CWinThread с именем Run. И класс приложения является производным от CWinApp, который, в свою очередь, является производным от CWinThread. Этот метод обычно не отменяется. Если код цикла сообщений должен быть прочитан, этот метод должен быть переопределен, и код можно увидеть во время отладки. Он также обрабатывает пустое сообщение
int CWinThread::Run()
{
....
for (;;)
{
// phase1: check to see if we can do idle work
while (bIdle &&
!::PeekMessage(&(pState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE))
{
// call OnIdle while in bIdle state
if (!OnIdle(lIdleCount++))
bIdle = FALSE; // assume "no idle" state
}
// phase2: pump messages while available
do
{
// pump message, but quit on WM_QUIT
if (!PumpMessage())
return ExitInstance();
// reset "no idle" state after pumping "normal" message
//if (IsIdleMessage(&m_msgCur))
if (IsIdleMessage(&(pState->m_msgCur)))
{
bIdle = TRUE;
lIdleCount = 0;
}
} while (::PeekMessage(&(pState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE));
}
}
MFC упростила обработку сообщений, используя карты сообщений. Программисту, в основном, не нужно беспокоиться о том, как работает цикл обработки сообщений, как доставляются сообщения и как отображаемые сообщения отображаются на определенные пользователем функции. Я бы посоветовал вам возиться CWnd
классы (например, фреймы, диалоги) и посмотрите, как отображаемые сообщения вызывают ваши функции.
WM_MOUSEMOVE
вызывает ваш OnMouseMove, если вы добавили запись ON_WM_MOUSEMOVE
- это интересно, вы должны найти, как это работает. Играя с CWinApp
класс не является хорошей идеей.