本人最近在看侯杰的<<深入浅出MFC>>,有几点不明白,想向大家请教一下:
他在书中举得第一个例子-HELLO中,重写了OnIdle函数,而参数为LONG LCOUNT, 在文中他只简单提了一下,说LCOUNT是系统传进来的值,我就不明白了-像定义函数的参数一样的形式,怎么看都是一个自己写的函数,怎么能从操作系统传进来呢,也不是特殊字,这是怎么回事?
整个为:
BOOL CMyWinApp::OnIdle(LONG lCount)
{
CMyFrameWnd* pWnd = (CMyFrameWnd*)m_pMainWnd;
pWnd->IdleTimeHandler(lCount);
return TRUE;
}
CMyFrameWnd* pWnd = (CMyFrameWnd*)m_pMainWnd;这句我也不明白,pWnd是为了得了主窗口的指针,怎么能够(CMyFrameWnd*)m_pMainWnd(在成员变量前面强制转换???请大家详细帮我分析一下,谢谢
他在书中举得第一个例子-HELLO中,重写了OnIdle函数,而参数为LONG LCOUNT, 在文中他只简单提了一下,说LCOUNT是系统传进来的值,我就不明白了-像定义函数的参数一样的形式,怎么看都是一个自己写的函数,怎么能从操作系统传进来呢,也不是特殊字,这是怎么回事?
整个为:
BOOL CMyWinApp::OnIdle(LONG lCount)
{
CMyFrameWnd* pWnd = (CMyFrameWnd*)m_pMainWnd;
pWnd->IdleTimeHandler(lCount);
return TRUE;
}
CMyFrameWnd* pWnd = (CMyFrameWnd*)m_pMainWnd;这句我也不明白,pWnd是为了得了主窗口的指针,怎么能够(CMyFrameWnd*)m_pMainWnd(在成员变量前面强制转换???请大家详细帮我分析一下,谢谢
解决方案 »
- 谁用过udt吗?
- 问一个简单的关于内存问题,困扰我很久了
- 求教:多线程在Release版下执行正常,Debug版下compile通过,build时出现问题
- 一win32程序如何不让其进程显示在任务管理器中?
- 错误提示:unresolved external symbol _DirectDrawCreateEx@16 作何解?
- @^@请教打开文件的目录设置问题。
- 在VC++ 中能否开发多层应用??怎样开发??
- 在控件编写中,如何使用位图来绘制控件的外观?
- 那位兄弟能提供LCD点阵字库,88分呈献!!!
- 请有识之士火速回答本人问题,急急如律令!
- mfc 文件
- WNetGetConnection函数的用法
真正的MFC 是通过虚函数 来调用OnIdle的。你可以理解成系统调用CWinApp::OnIdle但由于这个函数使虚函数,所以执行的是你写的CMyWinApp::OnIdle(LONG lCount)。
而且我也查不到由哪里调进来的?
估计内核在应用程序线程创建初会分配一个定时器。所以有这个count。
这些是我的猜测,因为我没有深入研究过。windows毕竟封装的太厉害。
同样的消息也不就是这样的么?比如按键的键值就由操作系统包装后放到消息中,让窗口函数取得来处理的。
==============================
为什么不能强制转化呢?m_pMainWnd本来就是CMyFrameWnd指针,转化当然是可以的.
4楼的我不太明白,是不是LONG LCout在前面只是申明与定义,在pWnd->IdleTimeHandler(lCount)中的lCount才将系统的确lCount传进来呢?
有意义,
CWnd* m_pMainWnd; // main window (usually same AfxGetApp()->m_pMainWnd)
这是CWinThread的成员变量定义。现在我们要调用IdleTimeHandler函数。必须将指针从CWnd*改成CMyFrameWnd*指针。
也就是那里调用CMyWinApp::OnIdle()
// 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
}看看这段代码,lz应该就会明白了吧。
那个在CWinThread::Run()中应该调用它写的这个OnIdle(),是这样吗?
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
}
中调用了侯杰写的OnIdle(LONG lCount),lCount的确是形参,在if (!OnIdle(lIdleCount++))中程序或者说系统把lIdleCount++传进去,而lIdleCount这个是实参(应该是系统中定义的),把lIdleCount进行操作,得到IDLE的次数.