2016-11-19 77 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框架窗口。如果您使用嚮導來生成應用程序,它將爲您設置。