1. 程式人生 > >CFormView類的用法舉例

CFormView類的用法舉例

轉載自:http://blog.csdn.net/laocunzhangxiashan/article/details/52176985

一.CFormView類優點:

MFC建立基於對話方塊的應用程式存在對話方塊大小無法改變大小的問題.程式移植遇到不同解析度顯示器就可能產生顯示不全的問題.基於CFormView的派生類可以解決這個問題.

二.單文件應用程式使用:

兩種方法.

第一種是在建立單文件應用程式過程中直接將派生於CView類的CXXXView類的基類修改為CFormView,除了經典的文件視類結構之外,MFC將額外生成一個對話方塊資源,ID為"IDD_XXX_FORM".同時,該對話方塊通過列舉與"CXXXView"類關聯.

  1. //View類派生於CFormView
  2. class CSDITestView : public CFormView  
  3. {  
  4. protected// 僅從序列化建立
  5.     CSDITestView();  
  6.     DECLARE_DYNCREATE(CSDITestView)  
  7. public:  
  8.     //主對話方塊與類關聯
  9.     enum{ IDD = IDD_SDITEST_FORM };  

第二種方法:已經按照預設流程建立完單文件應用程式了之後再建立基於CFormView類的對話方塊時最好不要手動修改CXXXView的基類為CFormView,再手動新增一個對話方塊.

而是要通過以下步驟實現:

1.新建一個單文件應用程式.

2.選單欄”專案”選擇”類嚮導”,在”新增類”彈出式對話方塊中輸入類名,”基類”選擇為”CFormView.

3.在單文件應用程式的CXXXApp的實現檔案頂部新增”#include ‘新類的標頭檔案名’”.

4.在CXXXApp類的”InitInstance()”函式的”CSingleDocTemplate”型別(註冊應用程式的文件模板,文件模板將用作文件,框架視窗和檢視之間的連線)連線視類時,將視類替換為我們新新增的CFormView類派生的對話方塊類.

  1. // 註冊應用程式的文件模板。文件模板
  2. // 將用作文件、框架視窗和檢視之間的連線
  3. CSingleDocTemplate* pDocTemplate;  
  4. //pDocTemplate = new CSingleDocTemplate(
  5. //  IDR_MAINFRAME,
  6. //  RUNTIME_CLASS(CSDITestDoc),
  7. //  RUNTIME_CLASS(CMainFrame),       // 主 SDI 框架視窗
  8. //  RUNTIME_CLASS(CSDITestView));
  9. pDocTemplate = new CSingleDocTemplate(  
  10.     IDR_MAINFRAME,  
  11.     RUNTIME_CLASS(CSDITestDoc),  
  12.     RUNTIME_CLASS(CMainFrame),       // 主 SDI 框架視窗
  13.     RUNTIME_CLASS(CSDIFormDlg));  
5.編譯通過執行之後發現對話方塊可以在單文件一啟動就顯示了.

接下來就可以像操作對話方塊應用程式一樣直接操作單文件應用程式了.需要注意的是CFormView派生類沒有"OnInitDialog"函式.對話方塊的初始化(或者說習慣開始函式)可以放在"OnInitialUpdate"中完成.

三.多文件應用程式中實現兩個對話方塊以選項卡的方式顯示.

1.按照上述方法建立兩個派生於CFormView的對話方塊.

2.為了讓不同的選項卡顯示不同的名字,可以在字串表(string table)裡新建一個字串資源以備使用.如下圖所示.


3.將"CXXXApp"類的CMDITestApp::InitInstance()函式中的pDocTemplate修改為該類的成員變數.並且新加一個相同型別的成員變數.

  1. public:  
  2.     CMultiDocTemplate* pDocTemplate;  
  3.     CMultiDocTemplate* pChildDocTemplate;  
4.新增的文件模板將第二個對話方塊與框架和文件連線起來.與pDocTemplate連線方法一致.函式的第一個引數可以設定為步驟2新建的那個字串資源.

5.測試此時還是不能同時開啟兩個對話方塊.需要註釋掉程式自動生成的新建檔案函式,過載本類的新建檔案函式

  1. //註釋掉預設的檔案新建函式
  2. //ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew)
  3. ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen)  
  4. //過載使用自己的檔案新建函式
  5. ON_COMMAND(ID_FILE_NEW, &CMDITestApp::OnFileNew)  
6.過載的檔案新建函式中內容如下.
  1. void CMDITestApp::OnFileNew()  
  2. {  
  3.     // TODO: 在此新增命令處理程式程式碼
  4.     pDocTemplate->OpenDocumentFile(NULL);  
  5.     pChildDocTemplate->OpenDocumentFile(NULL);  
  6. }  

---------------------------------------------------------------------------------------

notes:

1.在單文件應用程式的CXXXApp中新加入的標頭檔案中,需要加入:#include "Resource.h",才可以使用ID

2.可以選擇新建對話方塊型別