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

框架窗口与文档的交互:

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、获得应用程序对象,然后获得文档模板,进而获得文档模板的文档,最后获得视图。

以上三种方法均可以获得视图对象,进行想要的交互活动。

你可能感兴趣的:(框架窗口和文档、视图的交互(MFC))