MFC中的消息循环

MFC中的消息循环,mfc,message-loop,Mfc,Message Loop,我已经学习了一些关于Win32 API的知识,但现在我想学习MFC。在我的电子书中,他们说CWinApp类管理应用程序的主线程,但我在这个类中找不到类似GetMessage,DispatchMessage的函数。那么它如何开始消息循环呢 请给我解释一下。对不起,我是MFC的新手,我的英语不好。 在Visual Studio中,我在哪里可以找到一些关于MFC的电子书/教程?这些都是在CWinApp:Run部分完成的 InitInstance返回true后,CWinApp:Run启动,消息循环发挥作

我已经学习了一些关于Win32 API的知识,但现在我想学习MFC。在我的电子书中,他们说
CWinApp
类管理应用程序的主线程,但我在这个类中找不到类似
GetMessage
DispatchMessage
的函数。那么它如何开始消息循环呢

请给我解释一下。对不起,我是MFC的新手,我的英语不好。
在Visual Studio中,我在哪里可以找到一些关于MFC的电子书/教程?

这些都是在
CWinApp:Run
部分完成的

InitInstance
返回true后,
CWinApp:Run
启动,消息循环发挥作用。这个消息循环很棘手,因为它还处理应用程序无事可做时的
OnIdle
调用


只需查看源代码。

MFC通过使用消息映射简化了消息处理,程序员基本上不需要担心消息循环如何运行、消息如何传递以及映射消息如何映射到用户定义的函数。我建议您在
CWnd
-派生类(如框架、对话框)中来回摆弄,看看映射消息是如何调用您的函数的


一个
WM\u MOUSEMOVE
正在调用你的OnMouseMove,只要你在WM\u MOUSEMOVE上输入一个
——这很有趣,你应该会发现它是如何工作的。玩弄
CWinApp
-派生类不是个好主意。

MFC有点像Win32上的一个包装层。消息循环被包装在名为Run的CWinThread成员中。应用程序类是从CWinApp派生的,而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));
    }
}