mfc 常用的知识点
在MFC中引入了文档-视结构的概念,文档相当于数据容器,视相当于查看数据的窗口或是和数据发生交互的窗口。因此一个完整的应用一般由四个类组成:CWinApp应用类,CFrameWnd窗口框架类,CDocument文档类,CView视类。
在程序运行时CWinApp将创建一个CFrameWnd框架窗口实例,而框架窗口将创建文档模板,然后有文档模板创建文档实例和视实例,并将两者关联。一般来讲我们只需对文档和视进行操作,框架的各种行为已经被MFC安排好了而不需人为干预,这也是M$设计文档-视结构的本意,让我们将注意力放在完成任务上而从界面编写中解放出来。
在应用中一个视对应一个文档,但一个文档可以包含多个视。一个应用中只用一个框架窗口,对多文档界面来讲可能有多个MDI子窗口。每一个视都是一个子窗口,在单文档界面中父窗口即是框架窗口,在多文档界面中父窗口为MDI子窗口。一个多文档应用中可以包含多个文档模板,一个模板定义了一个文档和一个或多个视之间的对应关系。同一个文档可以属于多个模板,但一个模板中只允许定义一个文档。同样一个视也可以属于多个文档模板。
接下来看看如何在程序中得到各种对象的指针:
● 全局函数AfxGetApp可以得到CWinApp应用类指针
● AfxGetApp()->m_pMainWnd为框架窗口指针
● 在框架窗口中:CFrameWnd::GetActiveDocument得到当前活动文档指针
● 在框架窗口中:CFrameWnd::GetActiveView得到当前活动视指针
● 在视中:CView::GetDocument得到对应的文档指针
● 在文档中:CDocument::GetFirstViewPosition,CDocument::GetNextView用来遍历所有和文档关联的视。
● 在文档中:CDocument::GetDocTemplate得到文档模板指针
● 在多文档界面中:CMDIFrameWnd::MDIGetActive得到当前活动的MDI子窗口
某种类型的文档、框架、视共同关联构成一个文档模板类(基类是CDocTemplate,其子类CSingleDocTemplate与CMutiDocTemplate分对应于SDI和MDI),文档模板类在WinApp的初始化时构造;
MDI对象之间的交互函数类
函数
返回值
Global AfxGetApp CWinApp *(指向当前程序)
Global AfxGetMainWnd CWnd *(指向程序主窗口框架)
CMDIFrameWnd MDIGetActive CMDIChild Wnd *(指向当前活动的MDI子窗口)
CWnd GetParentFrame CFrameWnd *(指向父窗口框架)
CFrameWnd GetActiveView CView*(指向当前活动视)
CFrameWnd GetActiveDocument CDocument *(指向当前活动文档)
CView GetDocument CDocument* (同该视图类相联系)
CDocument GetFirstViewPosition 同文档相关的视图列表中的第一个视图类位置
CDocument GetNextView 同文档相关的视图列表中的下一个视图类位置
e.g. CMainFrame* mfrm=(CMainFrame
*)AfxGetMainWnd();
e.g.:得到当前视:
CFrameWnd* pMain =
(CFrameWnd*) AfxGetMainWnd();
CFrameWnd *pChild =
(CFrameWnd *) pMain->GetActiveFrame();
CView* m_pAgentView
= (CView *)pChild->GetActiveView();l
访问当前活动视图和活动文档.



表6-1 文档、文档模板、视图和框架类的互相访问
|
从该对象 |
如何访问其他对象 |
|
全局函数 |
调用全局函数AfxGetApp可以得到CWinApp应用类指针 |
|
应用 |
AfxGetApp()->m_pMainWnd为框架窗口指针;用CWinApp::GetFirstDocTemplatePostion、CWinApp::GetNextDocTemplate来遍历所有文档模板 |
|
文档 |
调用CDocument::GetFirstViewPosition,CDocument::GetNextView来遍历所有和文档关联的视图;调用CDocument:: GetDocTemplate 获取文档模板指针 |
|
文档模板 |
调用CDocTemplate::GetFirstDocPosition、CDocTemplate::GetNextDoc来遍历所有对应文档 |
|
视图 |
调用CView::GetDocument 得到对应的文档指针; 调用CView::GetParentFrame 获取框架窗口 |
|
文档框架窗口 |
调用CFrameWnd::GetActiveView 获取当前得到当前活动视图指针; 调用CFrameWnd::GetActiveDocument 获取附加到当前视图的文档指针 |
|
MDI 框架窗口 |
调用CMDIFrameWnd::MDIGetActive 获取当前活动的MDI子窗口(CMDIChildWnd) |
我们列举一个例子,综合应用上表中的函数,写一段代码,它完成遍历文档模板、文档和视图的功能:
|
CMyApp |
由此可见,下面的管理关系和实现途径都是完全类似的:
(1)应用程序之于文档模板;
(2)文档模板之于文档;
(3)文档之于视图。
Update
All Views
CMDIChildWnd* pChildActive = MDIGetActive();
COneDocAndMultViewDoc* pDoc = (COneDocAndMultViewDoc*)pChildActive->GetActiveDocument();
//MyPage2
*page2 = new MyPage2();
//CMDIChildWnd*
pColorChild = (CMDIChildWnd*)pDocTemple_Color->CreateNewFrame(pDoc, NULL);
CChildFrame* pColorChild = new CChildFrame();
if (!pColorChild)
{
AfxMessageBox(_T("Can't
Create new Child Frame!\n"));
return;
}
CCreateContext context;
context.m_pNewViewClass = RUNTIME_CLASS(MyPage2);
context.m_pCurrentDoc = pDoc;
pColorChild->LoadFrame(IDD_DIALOG2, WS_TABSTOP | WS_OVERLAPPEDWINDOW, this,
&context);
//pDocTemple_Color->InitialUpdateFrame(pColorChild,
pDoc);
pColorChild->ShowWindow(SW_SHOWMAXIMIZED);
pColorChild->InitialUpdateFrame(NULL, true);
MDITile(MDITILE_ZORDER);
思考一下: CMDIChildWnd
与 CChildFrame
有什么不同。
更新CMultiDocTemplate相关的所有views
-----------------------------------------------------------------------------------------
CMultiDocTemplate *muldoc=pMyApp->temp2;
if (muldoc)
{
POSITION p1=muldoc->GetFirstDocPosition();
while (p1)
{
CDocument *doc=muldoc->GetNextDoc(p1);
POSITION p2 =
doc->GetFirstViewPosition();
while (p2)
{
CView *view=doc->GetNextView(p2);
if (view==NULL)
{
return;
}
if (view->IsKindOf(RUNTIME_CLASS(MyView1)))
{
AfxMessageBox(_T("true"));
}
CUpdateAllViewDoc*doc=(CUpdateAllViewDoc*)view->GetDocument();
if (doc)
{
doc->m_szText
= _T("更新所有的views………..");
//doc->UpdateAllViews(NULL);
doc->UpdateAllViews(this);
}
}
}
}

------------------------------遍历整个文档和试图-------------------------------------------


--------------------------------字符类型之间的转换----------------------------------------

-------------------------------------------------------------------------------------------------------------------------------------
vs2013 mfc
Cstring转int、int转Cstring
2017年08月01日 16:41:23
阅读数:2858
CString str = _T(“123”);
int i = _ttoi(str);
===============
int i = 123;
CString str ;
str.Format(_T(“%d”), i);

mfc 常用的知识点的更多相关文章
- VS2010/MFC编程入门之四十三(MFC常用类:CTime类和CTimeSpan类)
上一节中鸡啄米讲了MFC常用类CString类的用法,本节继续讲另外两个MFC常用类-日期和时间类CTime类和CTimeSpan类. 日期和时间类简介 CTime类的对象表示的时间是基于格林威治标准 ...
- JS中常用开发知识点
JS中常用开发知识点 1.获取指定范围内的随机数 2.随机获取数组中的元素 3.生成从0到指定值的数字数组 等同于: 4.打乱数字数组的顺序 5.对象转换为数组 //注意对象必须是以下格式的才可以通 ...
- VS2010-MFC(MFC常用类:CTime类和CTimeSpan类)
转自:http://www.jizhuomi.com/software/230.html 上一节讲了MFC常用类CString类的用法,本节继续讲另外两个MFC常用类-日期和时间类CTime类和CTi ...
- MFC常用类
CString CStringT 操作可变长度字符串的模板类CStringT有三个实例:CString.CStringA和CStringW,它们分别提供对TCHAR.char和wchar_t字符类型的 ...
- php 常用的知识点归集(下)
24.静态属性与静态方法在类中的使用 需求:在玩CS的时候不停有伙伴加入,那么现在想知道共有多少人在玩,这个时候就可能用静态变量的方法来处理 利用原有的全局变量的方法来解决以上的问题 <?php ...
- Groovy常用编程知识点简明教程
概述 Groovy 是一门基于JVM的动态类型语言,可以与 Java 平台几乎无缝融合(与Java代码一样编译成字节码). 使用 Groovy ,可以增强 Java 应用的灵活性和可扩展性,提升开发效 ...
- unity常用小知识点
感觉自己抑郁变得更严重了,超级敏感,经常想崩溃大哭,睡眠超差,实在不想药物治疗,多看看书,多约约朋友,多出去走走. 来几句鸡汤吧,人一定要活得明白一点,任何关系都不要不清不楚,说不定最后受伤的就是自个 ...
- VS2010/MFC编程入门之四十五(MFC常用类:CFile文件操作类)
上一节中鸡啄米讲了定时器Timer的用法,本节介绍下文件操作类CFile类的使用. CFile类概述 如果你学过C语言,应该知道文件操作使用的是文件指针,通过文件指针实现对它指向的文件的各种操作.这些 ...
- VS2010/MFC编程入门之四十二(MFC常用类:CString类)
上一节鸡啄米讲了分割窗口的有关知识,本节开始讲解MFC的一些常用类,先来说说CString类. CString类简介 CString类作为MFC的常用类,当之无愧.可以这样说,只要是从事MFC开发,基 ...
随机推荐
- Adaptive AUTOSAR 学习笔记 7 - 应用设计和 Manifest
本系列学习笔记基于 AUTOSAR Adaptive Platform 官方文档 R20-11 版本 AUTOSAR_EXP_PlatformDesign.pdf 缩写 AP:AUTOSAR Adap ...
- c语言:sprintf() 数字转字符赋值给数组
//sprintf() //sprintf 最常见的应用之一是把整数打印到字符串中,所以,spritnf 在大多数场合可以替代itoa /* 缓冲区溢出 第一个参数的长度太短了,没的说,给个大点的地方 ...
- [刘阳Java]_CSS菜单侧边栏制作
再来写一个菜单侧边栏的制作,先看截图 源代码如下 <!DOCTYPE html> <html> <head> <meta charset="UTF- ...
- Spring RestTemplate 之get请求
一,简介:Spring RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写 ...
- 前端开发入门到进阶第二集【emmet插件的使用技巧】
Emmet (前身为 Zen Coding) 是一个能大幅度提高前端开发效率的一个工具.基本上,大多数的文本编辑器都会允许你存储和重用一些代码块,我们称之为"片段".虽然片段能很好 ...
- Requests方法 -- Blog流程类进行关联
1.接口封装关联 1.有些接口经常会用到比如登录的接口,这时候我们可以每个接口都封装成一个方法,如:登录.保存草稿.发帖.删帖,这四个接口就可以写成四个方法2.接口封装好了后,后面我们写用例那就直接调 ...
- POJ1456 Supermarket 题解
思维题. 关键在于如何想到用堆来维护贪心的策略. 首先肯定是卖出的利润越大的越好,但有可能当前这天选定了利润最大的很久才过期而利润第二大的第二天就过期,这时的策略就不优了. 所以我们必须动态改变策略, ...
- IBM java开发面试题
1.commite在什么场合使用 svn 提交项目 数据库自动提交 Oracle手动,mysql自动 2.void(0)怎么使用 html界面 <a href="javaScript ...
- javascript中“==”,“===”和“Object.is(a,b)”的区别
作为两个量比较的三种方式"==","==="和"Object.is(a,b)"有一定区别,如下(具体见MDN): (1)Object.is( ...
- ODOO里视图开发案例---定义一个像tree、form一样的视图
odoo里视图模型MVC模式: 例子:在原来的视图上修改他: var CustomRenderer = KanbanRenderer.extend({ ....});var CustomRendere ...