Цикл сообщений в 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класс не является хорошей идеей.

Другие вопросы по тегам