我已经了解了一些关于Win32 API的知识,但现在我想学习MFC。在我的电子书中,他们说CWinApp
类管理应用程序的主要线程,但我在这个类中找不到类似GetMessage
,DispatchMessage
函数的东西。那么它如何开始消息循环呢?
请有人为我解释。对不起,我是MFC的新手,我的英语不好。 我在哪里可以找到一些关于Visual Studio中MFC的电子书/教程?
答案 0 :(得分:2)
这一切都在CWinApp:Run
部分完成。
InitInstance
返回true后,CWinApp:Run
将启动,消息循环将扮演其角色。这个消息循环很棘手,因为它还可以在应用程序无关时处理OnIdle
次调用。
只需查看源代码。
答案 1 :(得分:0)
MFC通过使用消息映射简化了消息处理,程序员主要不需要打扰消息循环如何运行,如何传递消息,以及映射消息如何映射到用户定义的函数。我建议你摆弄CWnd
派生类(如框架,对话框),看看映射消息如何调用你的函数。
WM_MOUSEMOVE
正在调用你的OnMouseMove,只要你输入一个条目ON_WM_MOUSEMOVE
- 这很有趣,你应该知道它是如何工作的。玩CWinApp
派生的课程并不是一个好主意。
答案 2 :(得分:0)
MFC有点像Win32上的包装层。消息循环包装在名为Win的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));
}
}