我目前正在学习MFC库,我注意到在Visual Studio默认生成的应用程序中没有对m_pMainWnd指针的赋值。所以我的问题是指针指向什么?我还从最近发现的教程中做了一个示例,并且在InitInstance函数中创建了一个对话框类对象,并且它的地址被分配给m_pMainWnd指针:
virtual BOOL InitInstance()
{
CWinApp::InitInstance();
GAME_FORM dlg; //dialog object
m_pMainWnd = &dlg; //dialog object set as main window
INT_PTR nResponse = dlg.DoModal();
}
当应用程序向导创建MFC应用程序时,整个解决方案中只有两行使用m_pMainWnd,并且它不是一个asiggement。那么指针指向什么?
BOOL CMFCTestyApp::InitInstance()
{
(...)
// The one and only window has been initialized, so show and update it
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
(...)
}
答案 0 :(得分:0)
最初为NULL。 CWinThread
(CWinApp
的默认构造函数派生自CWinThread
)次调用CWinThread::CommonConstruct()
。 CWinThread::CommonConstruct()
设置
m_pMainWnd = NULL;
如果您有一个向导生成的SDI程序,稍后将在CSingleDocTemplate :: OpenDocumentFile()中初始化主窗口。堆栈跟踪看起来像这样:
mfc120ud.dll!CSingleDocTemplate::OpenDocumentFile(const wchar_t * lpszPathName, int bAddToMRU, int bMakeVisible) Line 205 C++
mfc120ud.dll!CSingleDocTemplate::OpenDocumentFile(const wchar_t * lpszPathName, int bMakeVisible) Line 83 C++
mfc120ud.dll!CDocManager::OnFileNew() Line 912 C++
mfc120ud.dll!CWinApp::OnFileNew() Line 21 C++
mfc120ud.dll!_AfxDispatchCmdMsg(CCmdTarget * pTarget, unsigned int nID, int nCode, void (void) * pfn, void * pExtra, unsigned int nSig, AFX_CMDHANDLERINFO * pHandlerInfo) Line 77 C++
mfc120ud.dll!CCmdTarget::OnCmdMsg(unsigned int nID, int nCode, void * pExtra, AFX_CMDHANDLERINFO * pHandlerInfo) Line 373 C++
mfc120ud.dll!CWinApp::ProcessShellCommand(CCommandLineInfo & rCmdInfo) Line 35 C++
ModelessTest.exe!CModelessTestApp::InitInstance() Line 133 C++
MFC的所有源代码都附带Visual C ++。您可以自己单步执行以查看变量何时更改或设置断点以查看内存位置何时更改。
如果您有MDI应用程序,则必须在重载的CWinApp :: InitInstance()函数中显式创建MDI框架窗口,然后手动将m_pMainWnd指针设置为MDI框架窗口。如果您使用向导生成应用程序,它将为您设置。