日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

VC在MDI方式下自由生成自定義的子窗口 | 學(xué)步園

 牛人的尾巴 2017-01-08

VC在MDI方式下自由生成自定義的子窗口

2013年06月11日 ? 綜合 ? 共 3989字 ? 字號 ? 評論關(guān)閉

轉(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)系如圖:

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多