在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
*pMyApp = (CMyApp*)AfxGetApp(); //得到应用程序指针

POSITION p = pMyApp->GetFirstDocTemplatePosition();//得到第1个文档模板

while (p != NULL) //遍历文档模板

{

 CDocTemplate *pDocTemplate =
pMyApp->GetNextDocTemplate(p);

 POSITION p1 =
pDocTemplate->GetFirstDocPosition();//得到文档模板对应的第1个文档

 while (p1 != NULL) //遍历文档模板对应的文档

 {

  CDocument *pDocument =
pDocTemplate->GetNextDoc(p1);

  POSITION p2 = pDocument->GetFirstViewPosition();
//得到文档对应的第1个视图

  while (p2 != NULL) //遍历文档对应的视图

  {

   CView *pView = pDocument->GetNextView(p2);

  }

 }

}

  由此可见,下面的管理关系和实现途径都是完全类似的:



  (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 常用的知识点的更多相关文章

  1. VS2010/MFC编程入门之四十三(MFC常用类:CTime类和CTimeSpan类)

    上一节中鸡啄米讲了MFC常用类CString类的用法,本节继续讲另外两个MFC常用类-日期和时间类CTime类和CTimeSpan类. 日期和时间类简介 CTime类的对象表示的时间是基于格林威治标准 ...

  2. JS中常用开发知识点

     JS中常用开发知识点 1.获取指定范围内的随机数 2.随机获取数组中的元素 3.生成从0到指定值的数字数组 等同于: 4.打乱数字数组的顺序 5.对象转换为数组 //注意对象必须是以下格式的才可以通 ...

  3. VS2010-MFC(MFC常用类:CTime类和CTimeSpan类)

    转自:http://www.jizhuomi.com/software/230.html 上一节讲了MFC常用类CString类的用法,本节继续讲另外两个MFC常用类-日期和时间类CTime类和CTi ...

  4. MFC常用类

    CString CStringT 操作可变长度字符串的模板类CStringT有三个实例:CString.CStringA和CStringW,它们分别提供对TCHAR.char和wchar_t字符类型的 ...

  5. php 常用的知识点归集(下)

    24.静态属性与静态方法在类中的使用 需求:在玩CS的时候不停有伙伴加入,那么现在想知道共有多少人在玩,这个时候就可能用静态变量的方法来处理 利用原有的全局变量的方法来解决以上的问题 <?php ...

  6. Groovy常用编程知识点简明教程

    概述 Groovy 是一门基于JVM的动态类型语言,可以与 Java 平台几乎无缝融合(与Java代码一样编译成字节码). 使用 Groovy ,可以增强 Java 应用的灵活性和可扩展性,提升开发效 ...

  7. unity常用小知识点

    感觉自己抑郁变得更严重了,超级敏感,经常想崩溃大哭,睡眠超差,实在不想药物治疗,多看看书,多约约朋友,多出去走走. 来几句鸡汤吧,人一定要活得明白一点,任何关系都不要不清不楚,说不定最后受伤的就是自个 ...

  8. VS2010/MFC编程入门之四十五(MFC常用类:CFile文件操作类)

    上一节中鸡啄米讲了定时器Timer的用法,本节介绍下文件操作类CFile类的使用. CFile类概述 如果你学过C语言,应该知道文件操作使用的是文件指针,通过文件指针实现对它指向的文件的各种操作.这些 ...

  9. VS2010/MFC编程入门之四十二(MFC常用类:CString类)

    上一节鸡啄米讲了分割窗口的有关知识,本节开始讲解MFC的一些常用类,先来说说CString类. CString类简介 CString类作为MFC的常用类,当之无愧.可以这样说,只要是从事MFC开发,基 ...

随机推荐

  1. dp 套 dp扯谈

    1.[扯谈概念] \(dp\) 套 \(dp\) 其实也就是 \(dp\) . 这里就定义下面两个概念: 内层 \(dp\) 表示的是被套在里面的那个 \(dp\) 外层 \(dp\) 表示的是最外面 ...

  2. 「AGC010F」 Tree Game

    「AGC010F」 Tree Game 传送门 切了一个 AGC 的题,很有精神. 于是决定纪念一下. 首先如果任意一个人在点 \(u\),他肯定不会向点权大于等于 \(a_u\) 的点走的,因为此时 ...

  3. C语言:外部函数

    //main.c #include <stdio.h> extern void func(); extern int m; int n = 200; int main(){ func(); ...

  4. Java基础00-面向对象基础13

    1. 类和对象 1.1 什么是对象 1.2 什么是面向对象                1.3 什么是类 1.4 什么是对象的属性 1.5 什么是对象的行为 行为就是对象能够干什么 1.6 类和对象 ...

  5. Scala学习——函数

    一.函数的定义(def) object FunctionApp { //定义函数:方法体内最后一行为返回值,不需要使用return def add(a:Int,b:Int):Int={ a + b } ...

  6. PAT乙级:1072开学寄语(20分)

    PAT乙级:1072开学寄语(20分) 题干 下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其 QQ,封其电脑,夺其手机,收其 ipad,断其 wifi,使其百无聊赖,然后,净面 ...

  7. [HAOI2012]外星人 题解

    人类智慧题. 首先,只有 \(\varphi(1)=\varphi(2)=1\).再考虑题目中给的提示: \[\varphi\left(\prod_{i = 1}^m p_i^{q_i}\right) ...

  8. 【洛谷P2028 龙兄摘苹果】动态规划

    分析 第二类striling数 考虑最后一个数到底是放在之前的任意一个集合内,还是自成一个集合 \[F_{i\ j}=F_{i-1\ j-1}+j\times F_{i-1,j} \] AC代码 #i ...

  9. TCP通信简单梳理

    一.什么是TCP协议 TCP协议是一种面向连接的可靠的通信协议,最重要的两个特点:连接.可靠. 二.TCP是如何进行通信的 TCP通过三次握手建立连接后客户端服务端的内核都分别开辟资源,这时候开始进行 ...

  10. maven之---资源过滤 在java/main/resourse/*.xml ,*.properties引用maven属性${db.username}

    本文主要来源maven实战14.3 为了应对环境的变化,首先使用Maven属性将这个会发生变化的部分提取出来.在上一节的数据库配置中,连接数据库使用的驱动类,URL,用户名和密码都可能发生变化,因此使 ...