框架窗口与文档的交互:
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、获得应用程序对象,然后获得文档模板,进而获得文档模板的文档,最后获得视图。
以上三种方法均可以获得视图对象,进行想要的交互活动。