zoukankan      html  css  js  c++  java
  • 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 *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! "));

                  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);

  • 相关阅读:
    假如我那时再努力点
    C语言经典算法100例-030-判断一个数是否为回文数
    C语言经典算法100例-029-求一个整数的位数且逆序打印
    C语言经典算法100例-028-五个人问岁数
    Abap-Smartforms中如何去掉开头的中文文本
    C语言经典算法100例-027-用递归逆序输出字符
    逐梦之路充满艰辛
    C语言经典算法100例-026-递归求阶乘
    C语言经典算法100例-025-求1+2!+3!+...+20!的和
    集合类Set、Map
  • 原文地址:https://www.cnblogs.com/bruce1992/p/13896387.html
Copyright © 2011-2022 走看看