框架窗口和文档、视图的交互(MFC)

21 篇文章 0 订阅
8 篇文章 1 订阅

框架窗口与文档的交互:

a、框架窗口    ->    文档  的过程:

1、通过视图。视图都由与之关联的文档,而框架窗口是视图的容器,理所当然,框架窗口和文档的交互可以以视图为桥梁。在框架窗口中可以通过GetActiveView()可以得到活动视图的指针pView,接着pView->GetDocument()便可以得到与之关联的文档指针pDoc。利用这个指针框架窗口便可以对文档进行相关的操作。

2、通过唯一的应用程序对象。框架窗口、文档和视图都是应用程序对象的组成部分,应用程序对象中也有相关的方法来操作这些成员。首先通过全局函数AfxGetApp()取得唯一的全局应用程序对象pApp,然后用pApp获得获得第一个文档模板:

                                             POSITION pos = pApp->GetFirstDocTemplatePosition();

接着通过遍历文档模板及其相应的文档取得相要的文档对象的指针:

while(pos)

{

    CDocTemplate* pTemplate = pApp->GetNextDocTemplate(pos);

    POSITION pos2 = pTemplate->GetFitstDocPosition();

    while(pos)    //里层遍历,寻找特定的文档。

    {

       CDocument* pDoc = pTemplate->GetNextDoc(pos2);

       //省略对文档的处理代码

    }

}


b、文档    ->     框架窗口  的过程:

文档要想“主动”跟框架窗口套近乎也是要通过视图为桥梁。

POSITION pos = GetFirstViewPosition();  //在文档中,取得文档的第一个获得视图

while(pos)  //遍历所有视图,取得视图相应的容器,及框架窗口

{

    CView* pView =  GetNextView(pos);

    CFrameWnd* pFrame = pView->GetParentFrame();

    if(pFrame)

    {

        pFrame->m_nWindow = -1; //由于一个框架窗口可能对于多个视图,所以要为具有同一个容器的视图标记,使得处理框架窗口时只处                                                       //理一次

    }

}

//第二重循环

pos = GetFirstViewPosition();

int nNumber = 0;

while(pos)

{

    CView *pView = GetNextView(pos);

    CFrame* pFrame = pView->GetParentFrame();

    if(pFrame->m_nWindow = nNumber)

    {

        pFrame->m_nWindow = nNumber;

        nNumber++;

    }

}

//对每个框架窗口只处理一次

pos = GetFirstViewPosition();

int nIndex = 0;

while(pos)

{

    CView *pView = GetNextView(pos);

    CFrameWnd * pFrame = pView->GetPatentFrame();

    if(pFrame && pFrame->m_nWindow == nIndex)

{

    //处理框架窗口代码、、、、、、

    nIndex++;

}

}


框架窗口和视图的交互:

1、每个框架窗口都维护一个活动视图,通过GetActiveView()可以获得活动视图的指针。

2、获得当前活动文档,然后通过该文档获得视图。

3、获得应用程序对象,然后获得文档模板,进而获得文档模板的文档,最后获得视图。

以上三种方法均可以获得视图对象,进行想要的交互活动。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值