请进来谈一下你对MFC中document和view的理解,以及如何用好他们,100分相送!

333sunshine 2005-12-23 09:21:06
请进来谈一下你对MFC中document和view的理解,以及如何用好他们,100分相送!
...全文
404 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Atomictry 2006-03-09
  • 打赏
  • 举报
回复
mmmmaaaaaarrrrrkkkkkk
333sunshine 2006-03-09
  • 打赏
  • 举报
回复
up
shmily1280 2005-12-30
  • 打赏
  • 举报
回复
mark
HelloIvan2005 2005-12-29
  • 打赏
  • 举报
回复
大家都说了这么多了,我就up一下了!
laofang 2005-12-28
  • 打赏
  • 举报
回复
在多窗口显示的时候,程序应该有多个Frame对象和多个View对象
——这个不一定要有多个Frame的

当其中一个在执行OnPaint函数时,我能够动态获得另一个View对象的名字么<<Q>>,API是什么啊?
——这有很多方法,比如通过CSplitterWnd分隔的多视SDI,可以将所有视图指针作为成员变量放在其父Frame中:
m_pNewView = wndSplitter.GetPane( 0, 0 );

也可通过视图对应的ID(创建时指定) 来取得:
m_pNewView = (CView*) GetDlgItem(nViewID);

然后,我能够根据这个名字获得另一个View对象的句柄么<<Q>>,API是什么啊?
——得到窗口指针,可通过CWnd类成员m_hWnd取得其句柄

再后,我能根据这个句柄来发出让另个窗口重绘的消息么,或者按建的消息如WM_KEYDOWN等, API是什么啊<<Q>>?
——取得窗口指针或句柄就可对这个窗口发送消息了:
SendMessage

让窗口重绘:
pWnd->Invalidate();
pWnd->UpdateWindow();

还有一个函数可以只绘制窗口的一部分
——InvalidateRect
pinel 2005-12-28
  • 打赏
  • 举报
回复
事实上我并不怎么用CDocument放数据。我觉得如果不是做特定文档管理,比如各种格式的互相不太有关联的文档的管理,类似ACDSee,如果不是这种程序,其他的应用管理我会把所有的数据都放在MainFrame类中,因为这些数据都有关联,不太好放在各个文档。事实上这样的程序也不太需要有多文档形式,一般是做成单文档多视。如果需要几种没有关联的模块,宁愿分成不同的执行体,而不是堆在同一个工程里。
handsomerun 2005-12-28
  • 打赏
  • 举报
回复
http://blog.csdn.net/ytng/archive/2005/06/09/391158.aspx

http://blog.csdn.net/coordinate/archive/2005/05/26/209276.aspx

这两篇文章不错,可以去研究研究
laofang 2005-12-28
  • 打赏
  • 举报
回复
1。文档模板标识ID的作用:
Specifies the ID of the resources used with the document type. This may include menu, icon, accelerator table, and string resources.


2。用CWinApp::AddDocTemplate 增加新的文档模板

3。文档创建时只和一个视类关联,要同时和多个视类关联,一般在视类创建时通过CCreateContext 对象与文档关联,如:
CCreateContext context;
context.m_pCurrentDoc = pOldActiveView->GetDocument();//先取得当前文档放到CCreateContext 对象中

//创建一个与当前文档关联的新视图
pNewActiveView->Create(NULL, NULL, 0L, CFrameWnd::rectDefault, this, nView, &context);

通过CSplitterWnd分隔的多视SDI可以在OnCreateClient中创建分隔视图时就通过pContext指定为同一文档:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
if (!wndSplitter.CreateStatic(this, 1, 2))
return false;

// 在这里创建的视图都和当前文档关联,因为pContext中都是同一个文档
if (!wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CSubFrame), CSize(0,0), pContext))
return false;

// ...
return true;
}
coolzdp 2005-12-28
  • 打赏
  • 举报
回复
楼主只要明白Doc和View是为了把数据和显示分离就行了,
初学没必要去扣细节,大体框架熟悉就可以了,要不会很痛苦哦,
以后慢慢接触例子用到了再细细体会。
333sunshine 2005-12-27
  • 打赏
  • 举报
回复
up一下
333sunshine 2005-12-25
  • 打赏
  • 举报
回复
谢谢楼上各位。
今天我又看了一遍MFC的Document/View这一章节的类容,小结一下所学到的东西。
我还有很多不太明白的位置都用<<Q>>标记了出来希望后面知道的朋友告知一下。谢谢!

Document应该负责数据管理,View负责窗口绘制。
在SDK 的开发中,显示一个文件内容的过程应该是这样:

1,文件字符串数据 ----> 2,数据对象集合 ----> 3,建立窗口 ----> 4,绘制窗口

Document应该就是负责从1->2的工作,把串行化的数据表示为对象数据。这个过程中需要两个技术:一是动态类识别,二是串行化读入。串行化读入的作用是把文件字符串用位移的操作一片一片的把数据读出来。 动态类识别的作用是告诉MFC每读一片数据的时候一该读多长(即多少个字节)。

Frame 完成建立窗口的工作。 主要响应窗口的创建和消除消息,即WM_CREATE 和 WM_DESTROY 等

View 完成窗口的绘制工作, 主要响应该窗口的绘制消息包括 WM_PAINT, WM_SIZE,WM_LBUTTONDOWN , WM_LBUTTONUP 等等

上面三个类由DocumentTemplete来管理。在一个DocumentTemplete中需要注册自己的MyDocument,MyFrame和MyView三个类,还有标识ID。对于那个标识ID我现在也不太清楚其具体作用。 好像表示在窗口建立时显示在窗口左上角的图标资源,和一个菜单资源。具体还有什么作用<<Q>>?

DocumentTemplete类分两种,一种是多资源的MultiDocumentTemplete,和单资源的SingleDocumentTemplete.
SingleDocumentTemplete里面只能有一个Document类。而MultiDocumentTemplete 里面有一个Document队列成员,所以MultiDocumentTemplete里面可以有多个自定义的Document类。但是在DocumentTemplete的初始化函数里面只能有一个Document类。 怎么把其他的Document类加进去,有专门的函数么<<Q>>?
在MFC的书中没有看到DocumentTemplete里面的View类的说明,我想问一下DocumentTemplete里面能有多个View类吗?如果有的话,那么把其他View类加入进去的API是什么啊<<Q>>?

在多窗口显示的时候,程序应该有多个Frame对象和多个View对象。每个View对象对应一个Frame对象。当有两个子窗口打开时,就有两个View对象。那么当其中一个在执行OnPaint函数时,我能够动态获得另一个View对象的名字么<<Q>>,API是什么啊? 然后,我能够根据这个名字获得另一个View对象的句柄么<<Q>>,API是什么啊? 再后,我能根据这个句柄来发出让另个窗口重绘的消息么,或者按建的消息如WM_KEYDOWN等, API是什么啊<<Q>>?

我看到有两个函数可以让其他的子重绘。一个是把其他View的整个窗口重绘(一楼朋友说的UpdateAllViews)函数,还有一个函数可以只绘制窗口的一部分,好像执行来效率要快些,但函数名忘记了。能帮忙写出这两个函数调用的例子么<<Q>>?

我初学MFC,很多东西不太清楚。如果有错误的位子,请指出来。希望看到各位更精辟的见解。还有<<Q>>标记了一些疑问希望后面知道的朋友告知一下。谢谢!
Kudeet 2005-12-24
  • 打赏
  • 举报
回复
这个问题最好自己搜索一些介绍的文章,详细的阅读
zsjiaming 2005-12-24
  • 打赏
  • 举报
回复
例如如何用这二个把文本文件读进来.按行显示成列表的形式.
处理后(处理由另外的其它代码来完成.
如何再保存成文本文件.

wshcdr 2005-12-24
  • 打赏
  • 举报
回复
LZ可以问具体点的问题
不然不好回答
寻开心 2005-12-23
  • 打赏
  • 举报
回复
还应把frame拉进来:
Doc: 保存数据
View: 显示数据
Frame: 协调doc和view之间的关系,一个doc可以有多个view

A_Qiao 2005-12-23
  • 打赏
  • 举报
回复
来个最简的:
CDocument:保存数据
CView: 显示数据
goodboyws 2005-12-23
  • 打赏
  • 举报
回复
http://www.mscenter.edu.cn/blog/k_eckel/articles/3466.html
laofang 2005-12-23
  • 打赏
  • 举报
回复
大道理不多讲,来点实用的:

需要展现出来的数据一律保存在文档中,特别是配置之类的数据;
在视图中展现时使用文档数据,而不是直接用本地数据。
这样做的好处是一时数据通过设置或其它与用户交互的对话框改变时,只需要一句:
GetDocument()->UpdateAllViews(NULL);
所有关联视图自动更新。

举个画图(画直线吧)的例子:
用户通过鼠标操作来画图时,不必在鼠标事件中画图,而是把图形数据(如点坐标)保存到文档中(如CArray<CPoint, CPoint&> m_ptArray),再做一下刷新:
GetDocument()->UpdateAllViews(NULL);

实际画图动作放在OnDraw中:
m
if( !GetDocument()->m_ptArray.GetSize() )
return;

pDC->MoveTo( GetDocument()->m_ptArray.GetAt(0) );
for(int i=0; i < GetDocument()->m_ptArray.GetSize(); i++)
pDC->LineTo( GetDocument()->m_ptArray.GetAt(i) );

想像一下如果不这样做的话,都在鼠标事件中把线画好了,如果想undo一条线,就很麻烦(设置异或模式把原线重画一遍),如果在文档中,只需GetDocument()->m_ptArray.RemoveAt一个点,再做一下刷新就行了

就举这个例子抛砖引玉:)

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧