我对Win32 API有所了解,但现在我想学习MFC。在我的电子书中,他们说这个CWinApp
类管理应用程序的主线程,但我在这个类中找不到类似GetMessage
的DispatchMessage
函数。那么它如何开始消息循环呢?
请有人为我解释一下。抱歉,我是 MFC 的新手,我的英语很差。在哪里可以找到一些关于 Visual Studio 中 MFC 的电子书/教程?
我对Win32 API有所了解,但现在我想学习MFC。在我的电子书中,他们说这个CWinApp
类管理应用程序的主线程,但我在这个类中找不到类似GetMessage
的DispatchMessage
函数。那么它如何开始消息循环呢?
请有人为我解释一下。抱歉,我是 MFC 的新手,我的英语很差。在哪里可以找到一些关于 Visual Studio 中 MFC 的电子书/教程?
这一切都在本CWinApp:Run
节中完成。
InitInstance
返回 true后,CWinApp:Run
将启动消息循环并发挥其作用。这个消息循环很棘手,因为它还会OnIdle
在应用程序无事可做时处理调用。
只需查看源代码。
MFC 通过使用消息映射简化了消息处理,程序员大多不需要关心消息循环是如何运行的,消息是如何传递的,以及映射消息如何映射到用户定义的函数。我建议您摆弄CWnd
派生类(如框架、对话框),并查看映射消息如何调用您的函数。
AWM_MOUSEMOVE
正在调用您的 OnMouseMove,前提是您输入了一个条目ON_WM_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));
}
}