社区
界面
帖子详情
请进来谈一下你对MFC中document和view的理解,以及如何用好他们,100分相送!
333sunshine
2005-12-23 09:21:06
请进来谈一下你对MFC中document和view的理解,以及如何用好他们,100分相送!
...全文
404
18
打赏
收藏
请进来谈一下你对MFC中document和view的理解,以及如何用好他们,100分相送!
请进来谈一下你对MFC中document和view的理解,以及如何用好他们,100分相送!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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一个点,再做一下刷新就行了
就举这个例子抛砖引玉:)
C++
MFC
实战速成教程(VS2013)
中
本教程,则排除一切对初步者的干扰,从
MFC
庞大的结构
中
,单刀直入,取出最核心的类,以简明易懂的方式,剖析于学员面前。 并通过纯手工方式编写
MFC
的程序,把
MFC
的基础架构,功能,由来,作用一一详细展示。以此为...
MFC
框架
中
的设计模式分析
摘要:分析
MFC
的视图-文档(
View
-
Document
)框架
中
使用到的设计模式,阐述了这些设计模式的原理和结构,并详细介绍了各种设计模式在
MFC
中
的具体实现方法。 关键字:
MFC
设计模式 视图-文档框架
中
图...
MFC
教程 -- Windows界面开发
如果想要更好的学习掌握
MFC
,必须要先了解Windows 程序的内部运行机制,为我们扫清学习路途
中
的第一个障碍,为进一步学习
MFC
程序打下基础。 1.1 基本概念解释 我们在编写标准C程序的时候,经常会调用各种库函数...
VS2010
MFC
编程入门
鸡啄米的C++编程入门系列给大家讲了C++的编程入门知识,大家对C++语言在语法和设计思想上应该有了一定的了解了。但是教程
中
讲的例子只是一个个简单的例程,并没有可视化窗口。鸡啄米在这套VS2010/
MFC
编程入门教程...
MFC
中
消息映射机制分析
MFC
中
消息映射机制分析张玉庆(哈尔滨...本文通过对整个消息映射机制进行系统的分析,可以帮助程序开发人员更好地了解
MFC
,进行可视化编程。关键词:消息驱动;消息映射;
MFC
程序设计 1 引言微软公司提供的
MFC
基本类
界面
15,980
社区成员
115,900
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章