轉(zhuǎn)自 http://blog.csdn.net/vlily 本文介紹如何刪除由MFC AppWinzard工程中產(chǎn)生的文檔/視圖結(jié)構(gòu),同時根據(jù)自己的實(shí)際需要創(chuàng)建子窗口界面。 Visual C++ 開發(fā)系統(tǒng)中應(yīng)用程序向?qū)У臉?biāo)準(zhǔn)設(shè)置允許應(yīng)用程序開發(fā)者方便簡單地創(chuàng)建多種基于DOC/VIEW結(jié)構(gòu)的應(yīng)用程序,但在實(shí)際軟件開發(fā)過程中,總是感覺由向?qū)傻?a href="http://www./doc/">程序控制起來比較麻煩,因此希望對有AppWinzard生成的代碼進(jìn)行改造,使程序結(jié)構(gòu)比較簡單,同時去掉其提供的文檔管理。簡單的例子就是在一個菜單中項(xiàng)中直接產(chǎn)生自己定義的子窗口。 下面通過一個示例描述整個的處理過程,該示例的結(jié)果是通過指定的菜單項(xiàng)IDM_TEST顯示定義的視圖CmyView,其主要的處理步驟為:先用AppWinzard生成一個MDI同時支持DOC/VIEW的TEST工程,然后去掉默認(rèn)的子窗口顯示,加入調(diào)用自己定義的窗口代碼。具體實(shí)現(xiàn)按照以下步驟進(jìn)行: 1、從 File 菜單選擇 New ,并使用 MFC AppWizard(exe) 選項(xiàng)來創(chuàng)建一個新的工程,工程名為 TEST。選擇 Multiple Documents 選項(xiàng),并且選擇Document/View architechture support。 2、 從CtestApp的成員函數(shù)中InitInstance()中刪除以下內(nèi)容 CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_TESTTYPE, RUNTIME_CLASS(CTestDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CTestView)); AddDocTemplate(pDocTemplate); 3、創(chuàng)建自定義的框架類CMyFrame:,該類的基類為CMDIChildWnd。 4、進(jìn)入資源管理器,添加FORMVIEW,IDD_FORMVIEW,生成對應(yīng)的視圖類CMyView,基類為CformView。 5、目前已經(jīng)創(chuàng)建完我們需要的框架和視圖,下面的工作是把CmyFrame和CmyView進(jìn)行連接。在CmyFrame中添加成員變量CMyView *m_pMyView;然后在OnCreate成員函數(shù)中加入以下內(nèi)容: CRect rect; GetClientRect(&rect); m_pMyview=new CMyView; if(!m_pMyview->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW ,rect,this,AFX_IDW_PANE_FIRST , NULL)) { TRACE0("Failed to create view window\n"); return 0; } //AFX_WS_DEFAULT_VIEW*/ 在OnSize函數(shù)中加入 CRect rect; this->GetClientRect (rect); m_pMyview ->MoveWindow( rect.left ,rect.top,rect.Width(),rect.Height(),TRUE); 在這里需要指出的的是要把CmyView和CmyFrame的構(gòu)造函數(shù)改成public類型,同時要重載CmyView的Create函數(shù)。 6、進(jìn)入資源管理器中在菜單IDR_MAINFRAME中加入IDM_TEST菜單項(xiàng),在對應(yīng)的處理函數(shù)中加入以下代碼: m_pMyframe=new CMyFrame; m_pMyframe->Create(NULL,NULL,WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, rectDefault); m_pMyframe->ShowWindow(SW_SHOW); m_pMyframe->UpdateWindow(); 當(dāng)然m_pMyFrame必須要在 CmainFrame中先定義了。 7、編譯運(yùn)行,選擇Test菜單項(xiàng),就可以打開我們定義的窗口,這樣處理后,可以刪除目錄下的testdoc.*和childframe.*,TestView.*以及源程序中的所有與之有關(guān)的頭文件,形成一個簡單的工程。 在實(shí)際工作可能有多種不同的視圖,并不是每種視圖都需要一個指定的框架,實(shí)現(xiàn)時可以在定義框架后指定視圖的種類,然后在框架的OnCreate函數(shù)中根據(jù)指定的試圖種類創(chuàng)建不同的視圖。 注意:vs2008中將CFormView的Create成員函數(shù)聲明為protected,無法直接在外部調(diào)用,需要在CMyView中重寫為public。 類對象直接的調(diào)用關(guān)系如圖: Visual C++ 開發(fā)系統(tǒng)中應(yīng)用程序向?qū)У臉?biāo)準(zhǔn)設(shè)置允許應(yīng)用程序開發(fā)者方便簡單地創(chuàng)建多種基于DOC/VIEW結(jié)構(gòu)的應(yīng)用程序,但在實(shí)際軟件開發(fā)過程中,總是感覺由向?qū)傻?a href="http://www./doc/">程序控制起來比較麻煩,因此希望對有AppWinzard生成的代碼進(jìn)行改造,使程序結(jié)構(gòu)比較簡單,同時去掉其提供的文檔管理。簡單的例子就是在一個菜單中項(xiàng)中直接產(chǎn)生自己定義的子窗口。 下面通過一個示例描述整個的處理過程,該示例的結(jié)果是通過指定的菜單項(xiàng)IDM_TEST顯示定義的視圖CmyView,其主要的處理步驟為:先用AppWinzard生成一個MDI同時支持DOC/VIEW的TEST工程,然后去掉默認(rèn)的子窗口顯示,加入調(diào)用自己定義的窗口代碼。具體實(shí)現(xiàn)按照以下步驟進(jìn)行: 1、從 File 菜單選擇 New ,并使用 MFC AppWizard(exe) 選項(xiàng)來創(chuàng)建一個新的工程,工程名為 TEST。選擇 Multiple Documents 選項(xiàng),并且選擇Document/View architechture support。 2、 從CtestApp的成員函數(shù)中InitInstance()中刪除以下內(nèi)容 CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_TESTTYPE, RUNTIME_CLASS(CTestDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CTestView)); AddDocTemplate(pDocTemplate); 3、創(chuàng)建自定義的框架類CMyFrame:,該類的基類為CMDIChildWnd。 4、進(jìn)入資源管理器,添加FORMVIEW,IDD_FORMVIEW,生成對應(yīng)的視圖類CMyView,基類為CformView。 5、目前已經(jīng)創(chuàng)建完我們需要的框架和視圖,下面的工作是把CmyFrame和CmyView進(jìn)行連接。在CmyFrame中添加成員變量CMyView *m_pMyView;然后在OnCreate成員函數(shù)中加入以下內(nèi)容: CRect rect; GetClientRect(&rect); m_pMyview=new CMyView; if(!m_pMyview->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW ,rect,this,AFX_IDW_PANE_FIRST , NULL)) { TRACE0("Failed to create view window\n"); return 0; } //AFX_WS_DEFAULT_VIEW*/ 在OnSize函數(shù)中加入 CRect rect; this->GetClientRect (rect); m_pMyview ->MoveWindow( rect.left ,rect.top,rect.Width(),rect.Height(),TRUE); 在這里需要指出的的是要把CmyView和CmyFrame的構(gòu)造函數(shù)改成public類型,同時要重載CmyView的Create函數(shù)。 6、進(jìn)入資源管理器中在菜單IDR_MAINFRAME中加入IDM_TEST菜單項(xiàng),在對應(yīng)的處理函數(shù)中加入以下代碼: m_pMyframe=new CMyFrame; m_pMyframe->Create(NULL,NULL,WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, rectDefault); m_pMyframe->ShowWindow(SW_SHOW); m_pMyframe->UpdateWindow(); 當(dāng)然m_pMyFrame必須要在 CmainFrame中先定義了。 7、編譯運(yùn)行,選擇Test菜單項(xiàng),就可以打開我們定義的窗口,這樣處理后,可以刪除目錄下的testdoc.*和childframe.*,TestView.*以及源程序中的所有與之有關(guān)的頭文件,形成一個簡單的工程。 在實(shí)際工作可能有多種不同的視圖,并不是每種視圖都需要一個指定的框架,實(shí)現(xiàn)時可以在定義框架后指定視圖的種類,然后在框架的OnCreate函數(shù)中根據(jù)指定的試圖種類創(chuàng)建不同的視圖。 注意:vs2008中將CFormView的Create成員函數(shù)聲明為protected,無法直接在外部調(diào)用,需要在CMyView中重寫為public。 類對象直接的調(diào)用關(guān)系如圖: |
|