Цикл сообщений в MFC

Я немного узнал о Win32 API, но теперь хочу изучить MFC. В моей электронной книге сказано, что класс CWinApp управляет основным потоком приложения, но я не могу найти что-то вроде функций GetMessage, DispatchMessage в этом классе. Так как же начать цикл сообщений?

Кто-нибудь, объясните мне, пожалуйста. Извините, я новичок в MFC и плохо владею английским. И где я могу найти несколько электронных книг / руководств по MFC в Visual Studio?


person Phùng Khánh Hiên    schedule 22.09.2014    source источник


Ответы (3)


Все это сделано в разделе CWinApp:Run.

После того, как InitInstance вернет истину, запускается CWinApp:Run, и его роль берет на себя цикл сообщений. Этот цикл сообщений сложен, потому что он также обрабатывает OnIdle вызовы, когда приложению нечего делать.

Просто загляните в исходный код.

person xMRi    schedule 22.09.2014

MFC упростил обработку сообщений за счет использования карт сообщений, программисту в основном не нужно беспокоиться о том, как работает цикл сообщений, как доставляются сообщения и как отображаемые сообщения отображаются на пользовательские функции. Я бы посоветовал вам повозиться с классами, производными от CWnd (например, фреймами, диалогами), и посмотреть, как отображаемые сообщения вызывают ваши функции.

WM_MOUSEMOVE вызывает ваш OnMouseMove, если вы поместили запись ON_WM_MOUSEMOVE - это интересно, вы должны узнать, как это работает. Играть с классом, производным от CWinApp, - не лучшая идея.

person Ajay    schedule 27.09.2014

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));
    }
}
person Karthik Krish    schedule 20.08.2019