[[[[[[[ 大家来说说OnOK()与OnClose()的根本区别 ]]]]]]]
yo_jo 2004-10-13 04:09:00 本人在平时使用时,二者从来没有注意过区别,但在这两天写的一段代码中就出现了一个问题(编译没有报任何错误,但在调试时最后就会出现 的错误),之后将原来的 CDialog::OnClose(); 替换为 CDialog::OnOK(); 就不再出现这个问题了,所以就想看看他们之间到底有什么区别,以下是我在调试时copy的源码,欢迎大家各抒己见!
--------------------------------------------------------------------------------
// OnOK()的.....
void CDialog::OnOK()
{
if (!UpdateData(TRUE))
{
TRACE0("UpdateData failed during dialog termination.\n");
// the UpdateData routine will set focus to correct item
return;
}
EndDialog(IDOK);
}
void CDialog::EndDialog(int nResult)
{
ASSERT(::IsWindow(m_hWnd));
if (m_nFlags & (WF_MODALLOOP|WF_CONTINUEMODAL))
EndModalLoop(nResult);
::EndDialog(m_hWnd, nResult);
}
void CWnd::EndModalLoop(int nResult)
{
ASSERT(::IsWindow(m_hWnd));
// this result will be returned from CWnd::RunModalLoop
m_nModalResult = nResult;
// make sure a message goes through to exit the modal loop
if (m_nFlags & WF_CONTINUEMODAL)
{
m_nFlags &= ~WF_CONTINUEMODAL;
PostMessage(WM_NULL);
}
}
#define WM_NULL 0x0000
--------------------------------------------------------------------------------
// OnClose()的.....
_AFXWIN_INLINE void CWnd::OnClose()
{ Default(); }
LRESULT CWnd::Default()
{
// call DefWindowProc with the last message
_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
return DefWindowProc(pThreadState->m_lastSentMsg.message,
pThreadState->m_lastSentMsg.wParam, pThreadState->m_lastSentMsg.lParam);
}
LRESULT CWnd::DefWindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)
{
if (m_pfnSuper != NULL)
return ::CallWindowProc(m_pfnSuper, m_hWnd, nMsg, wParam, lParam);
WNDPROC pfnWndProc;
if ((pfnWndProc = *GetSuperWndProcAddr()) == NULL)
return ::DefWindowProc(m_hWnd, nMsg, wParam, lParam);
else
return ::CallWindowProc(pfnWndProc, m_hWnd, nMsg, wParam, lParam);
}