2016-11-19 80 views
0

我目前正在学习MFC库,我注意到,在默认生成的应用程序由Visual Studio没有分配给m_pMainWnd指针。所以我的问题是那个指针指向什么?我也从一个教程,我发现最近做了一个例子,有在InitInstance函数创建一个对话框类的对象和它的地址被分配到m_pMainWnd指针:默认情况下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的整个解决方案中的行,这不是一个问题。那么这个指针指向什么?

BOOL CMFCTestyApp::InitInstance() 
{ 
(...) 
// The one and only window has been initialized, so show and update it 
m_pMainWnd->ShowWindow(SW_SHOW); 
m_pMainWnd->UpdateWindow(); 
(...) 
} 
+1

您的应用程序类继承许多基类层。他们还拥有大量的代码,以建立运行应用程序代码的环境。 –

+0

除非您非常熟悉Windows API(和C++),否则您将无法理解MFC。如果您真的想开始使用Windows编程,请从[Learn to Program for Windows in C++](https://msdn.microsoft.com/en-us/library/windows/desktop/ff381399.aspx)开始。 – IInspectable

+0

'm_pMainWnd'默认为'NULL'。你必须告诉MFC,在这种情况下'dlg'被用作你的主窗口。一些MFC类需要知道主窗口的位置。 –

回答

0

它最初是NULL。 CWinThreadCWinApp的默认构造函数源自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框架窗口。如果您使用向导来生成应用程序,它将为您设置。