⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 03.2.3 消息循环.txt

📁 网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
💻 TXT
字号:
3.2.3  消息循环
至此,注册窗口类、创建窗口、显示和更新窗口的工作都已完成,就该进入消息循环了。CWinThread类的Run函数就是完成消息循环这一任务的,该函数是在AfxWinMain函数中调用的,调用形式如下(位于例3-7所示AfxWinMain函数实现代码的符号④处)所示。

pThread->Run();

CWinThread类的Run函数的定义位于THRDCORE.CPP文件中,代码如例3-16所示。

例3-16

// main running routine until thread exits

int CWinThread::Run()

{

    ASSERT_VALID(this);

 

    // for tracking the idle time state

    BOOL bIdle = TRUE;

    LONG lIdleCount = 0;

 

    // acquire and dispatch messages until a WM_QUIT message is received.

    for (;;)

    {

        // phase1: check to see if we can do idle work

        while (bIdle &&

            !::PeekMessage(&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))

            {

                bIdle = TRUE;

                lIdleCount = 0;

            }

 

        } while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE));

    }

 

    ASSERT(FALSE);  // not reachable

}

该函数的主要结构是一个for循环,该循环在接收到一个WM_QUIT消息时退出。在此循环中调用了一个PumpMessage函数,该函数的部分定义代码如例3-17所示。

例3-17

BOOL CWinThread::PumpMessage()

{

    ASSERT_VALID(this);

 

    if (!::GetMessage(&m_msgCur, NULL, NULL, NULL))

    {

……

        return FALSE;

    }

……

    // process this message

    if (m_msgCur.message != WM_KICKIDLE && !PreTranslateMessage(&m_ msgCur))

    {

        ::TranslateMessage(&m_msgCur);

        ::DispatchMessage(&m_msgCur);

    }

    return TRUE;

}

可以发现,这与前面第2章中讲述的SDK编程的消息处理代码是一致的。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -