MFC中添加一个对话框到主视图

来源:互联网 发布:网络教育本科第二学历 编辑:程序博客网 时间:2024/05/01 10:23
0.假设工程名字为zheng。
1.新建一个对话框,属性style:child,border:None,添加一个新类CMainView,使他继承自public CFormView。
2.将CMainView的构造函数和析构函数由protected改为public。
3.重写CMainView类的Create函数。
4.将CzhengView类中的//CzhengDoc* GetDocument() const;注释掉。在zhengView.h,zhengView.cpp中删除所有关于GetDocument的语句。
5.删除zhengView.h,zhengView.cpp中的打印打印预览等代码。
6.删除MainFrm.h,MainFrm.cpp中所有的关于工具栏和状态栏的代码。
7.在MainFrm.h中#include“MainView.h”.添加一个CMainView类对象的指针public: CMainView *m_mainview;
8.在MainFrm.cpp中的Create函数中添加代码
 CRect rect;
    GetClientRect(rect); 
 m_mainview = new CMainView;
 m_mainview->Create("CMainView",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER,rect,this,IDD_MainView,NULL); 
 m_mainview->OnInitialUpdate();
 m_mainview->ShowWindow(SW_SHOW); 
 RecalcLayout();
9.在MainFrm.cpp添加Onpaint函数,让新建的对话框随窗口的调整而调整。
 CRect rect;
    GetClientRect(rect);
 m_mainview->MoveWindow(&rect,1);
10.至此,一个对话框成为程序的主视图。

我们创建一个对话框资源后,然后创建一个类(假设为CMyClass)来管理它。如果这个类(CMyClass)是从CFormView派生出来的,并且要在其他类中使用CMyClass的对象,则应如下处理。

因为CFormView的构造函数和析构函数都是保护类型的,所以在其他类中是无法访问的,因此无法直接在其他类中声明CMyClass的对象。那么要使用CMyClass,该如何做呢?有两种方法:

方法一:

在CMyClass类的头文件中声明其他类为友元类。显然不是太爽

方法二:

1.在其他类的头文件中声明CMyClass类的指针,如:

CMyClass *m_pMyCls;

(注: 这里不一定要作为类的成员变量, 如果只是需要创建而不需要管理该对象时, 完全可以作为临时变量)

2.在其他类的构造函数中,添加如下代码:

m_pMyCls = (CMyClass*)(RUNTIME_CLASS(CMyClass)->CreateObject());//最重要的地方

(注: 既然CMyClass是自定义类, 那么这里当然可以把构造函数public一下了. 不过关键是这种方法不错, 值得借鉴 -- 即如何创建构造函数是protected成员的对象, 即使用CRuntimeClass的CreateObject()函数).

3.在其他类的OnCreate函数中,添加如下代码:

RECT rect;
GetClientRect(&rect);
m_pMyCls->Create(NULL, "Option window", WS_CHILD|WS_VISIBLE, rect, this, 0, NULL);//重要的地方

(注: 不知道为什么非要在人家类的OnCreate函数中创建, 实际上个人认为只要在父窗口的窗口结构体被创建以后都是可以的, 因为我试过了在构造函数中是不可以的, 呵呵. 我试了其它的地方, 比如CView::OnInitialUpdate和CDialog::OnInitDialog都应该没有问题的)

4.因为第3步调用到了CMyClass的Create函数,这个函数是继承CFormView类的,在CFormView中它是保护类型,因此,为了可以访问它,我们要在CMyClass中重载它,类型为公开类型。

(注: 方法很简单, 只需要加上该函数(在VC6的ClassWizard中给该类增加虚函数Create即可, 默认类型即是公开的, 且不需要修修改其代码)

方法三(自己加的):

当分隔窗口时可以直接创建对象, 如下:

splitterWnd.CreateView(0,0,RUNTIME_CLASS(CMyClass),CSize(400,100),pContext);


0 0
原创粉丝点击