MFC中“App类、Doc类、View类”区别与联系

MFC中App,Doc,MainFrame,View各指针的互相获取,首先说明这四个类的执行顺序是App->Doc->MainFrame->View.

App类就是这个SDI作为”程序”的入口有点像c语言的main()函数 。

document/view模式,是为了在逻辑上,让数据和显示分开。

一般在document里,定义document类的成员变量,来存数据,并用View来显示。

在document里,当成员变量的数据改变时,你可以用UpdateAllViews()来通知视图更新。

在View里,用GetDocument来获取与之对应document的指针,进而可以访问document的成员变量,从而进行显示,Document/View仅仅是MFC为你提供的一种很好的支持而已.

view类是在框架类之上,所以如果你需要实现画面显示之类的,就只能在View类中响应.
基本上文档类是用于存储数据管理的类,而视图类是用来显示数据结果的类,他们一般情况下是关联的,
因为他们息息相关,一个存储、一个显示。

另外App类和Doc类都是从CCmdTarget类派生而来,所以只能接收命令消息和控件通知消息,View类与Frame框架类都是从CWnd类派生所以能够接收命令消息和控件通知消息还有windows消息三种消息.对于三种消息,响应的顺序是这样的:

首先由框架类接收到该消息,框架类将该消息递交给其子窗口View,如果View没有对该消息进行响应,则由View递交给Doc,如果Doc也没有对该消息进行响应,那么它回再次将该消息回交给View,View再回交给Frame框架,框架检查自己是否对该消息有相应的处理函数,如果没有则递交给 App,如果App也没有则由Windows系统自己处理。
所以另外一个顺序问题.在doc类定义的还是会回交给view类。

参考1:

转载来源

doc类就是数据存储类,你的文件导入,打开显示,保存都在这个类里面,一个VIEW类对应一个doc,一个doc可以对应多个view类! app其实没什么,它就是创建了一个对象,而这个对象就是你程序实例的本身! View类和mainfram类要注意一下,主要注意他们的客户区窗口的范围,Mainfram指示的是实例的整个框架,而view指示的是工具栏下面的那块区域(假设只有一个VIEW区域)。不知道你明白了没,关于这一段你可以参考孙鑫老师的视频的第三讲,那里面讲的比较详细了!!

参考2:

Dlg 是Dialog 的缩写,表示对话框本身。

App类就是这个SDI作为”程序”的入口,有点像c的Main函数,它不是从CWND中派生出来的。App表示应用程序本身。

View表示视图类,负责显示数据,提供编辑数据、修改数据的功能。它是指编辑区里面的事就是那块白色的中间区域,负责绘制和响应一些消息。

Doc表示文档类,提供对数据的保存和加载。有点像数据库,保存着编辑数据,用于view的Redraw的时候用,还有保存文件。

一般动态的编辑数据都放在Doc里面。他也不是从CWND中派生出来的,没有继承MessageBox函数,可以用AfxMessageBox函数。

  • 14
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
MFC ,对话框(Dialog)和视图(View)都是窗口(Window)对象,但它们的作用和用法不同。对话框用于显示窗口的用户界面元素,如按钮、文本框等,而视图则用于显示和操作应用程序所处理的数据。通常情况下,对话框和视图都需要与文档(Document)关联,以便在用户界面和数据之间建立联系。 要将对话框与视图关联起来,可以在对话框添加一个成员变量,型为视图的指针,用于存储指向该视图对象的指针。在对话框的 OnInitDialog 函数,可以通过 GetDlgItem 函数获取视图控件的句柄,并通过该句柄创建视图对象,并将该对象的指针存储到对话框的成员变量。 例如,假设有一个名为 CMyDialog 的对话框,和一个名为 CMyView 的视图,可以在 CMyDialog 添加如下成员变量: ``` class CMyDialog : public CDialog { public: CMyView* m_pView; }; ``` 然后在 OnInitDialog 函数,可以添加如下代码: ``` BOOL CMyDialog::OnInitDialog() { // ... // 获取视图控件的句柄 CWnd* pWnd = GetDlgItem(IDC_VIEW); // 创建视图对象并将其指针存储到成员变量 m_pView = new CMyView(); m_pView->Create(NULL, NULL, WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), this, IDC_VIEW, NULL); m_pView->SetWindowPos(pWnd, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // ... return TRUE; } ``` 其 IDC_VIEW 是视图控件的 ID,可以在对话框资源设置。这样就可以在对话框显示视图,并且可以通过对话框的成员变量访问该视图对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值