(转)文档doc、视图view、框架frame相互之间的访问
2011-04-12 22:05
555 查看
1. 文档类通常与数据的存取以及其它处理过程有关,而视主要用来表现文档数据的,但每个视必须依附于一个框架(在SDI中依附于MainFrame,在MDI中依附于ChildFrame),框架上可以放置工具栏、菜单等;
2. 某种类型的文档、框架、视共同关联构成一个文档模板类(基类是CDocTemplate,其子类CSingleDocTemplate与CMutiDocTemplate分对应于SDI和MDI),文档模板类在WinApp的初始化时构造;
3. 一个APP可以有N个文档模板,但SDI及MDI框架向导默认生成的都只有一种模板(若需要更多则可以模仿添加);一个文档模板在程序中可多次生成多个文档实例,此所谓多文档接口MDI(多文档不仅可以是多个同类型的文档还可以是多个不同类型的文档);一种数据可以有N种表现形式,所以一个文档可以有N个视与之关联;
4. 在某一时刻只可能有一个活动的文档、视、和框架。即当前文档、视、和框架。
理解了这些再加上下面的操作就可以令你处理这类问题时得心应手了。
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();
访问当前活动视图和活动文档
1. 对于SDI程序,主框架窗口就是文档框窗,可以采用以下方法取得当前文档和视图:
取得活动文档:
CMyDocument* pDoc;
pDoc=(CMyDocument*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveDocument();
或
pDoc=(CMyDocument*)((CFrameWnd*)AfxGetMainWnd());
这两者是等效的。
取得活动视图:
CMyView* pView;
pView=(CMyView*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveView();
2.对于MDI程序,由于子窗口才是文档框窗,因此首先要用GetActiveFrame()取得活动子框架窗口,然后通过该子窗口获取活动文档和视图:
CMDIChildWnd* pChild=(CMDIChildWnd*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveFrame();
取得活动文档:
CMyDocument* pDoc=pChild->GetActiveDocument();
CMyView* pView=(CMyView*)pChild->GetActiveView();
可以把上述函数片段做成静态成员函数,比如:
static CMyDocument::GetCurrentDoc()
{
CMDIChildWnd* pChild=(CMDIChildWnd*)((CFrameWnd*)AfxGetApp()- >m_pMainWnd)->GetActiveFrame();
CMyDocument* pDoc=pChild->GetActiveDocument();
}
这样就可以通过以下方式取得活动文档(或视图):
CMyDocument::GetCurrentDoc();
注:静态成员函数调用时不需要一个具体的对象与之相关联。
文档模板中找文档
例:
CMultiDocTemplate* pDocTmpl;
pDocTmpl = ((CImpApp*)AfxGetApp())->m_pDocTemplate;
POSITION posDoc= pDocTmpl->GetFirstDocPosition();
while(NULL!=posDoc)
{
pFrmDoc = (CFrmDoc*) pDocTmpl->GetNextDoc(posDoc);
nDocOrder++;
}
2. 某种类型的文档、框架、视共同关联构成一个文档模板类(基类是CDocTemplate,其子类CSingleDocTemplate与CMutiDocTemplate分对应于SDI和MDI),文档模板类在WinApp的初始化时构造;
3. 一个APP可以有N个文档模板,但SDI及MDI框架向导默认生成的都只有一种模板(若需要更多则可以模仿添加);一个文档模板在程序中可多次生成多个文档实例,此所谓多文档接口MDI(多文档不仅可以是多个同类型的文档还可以是多个不同类型的文档);一种数据可以有N种表现形式,所以一个文档可以有N个视与之关联;
4. 在某一时刻只可能有一个活动的文档、视、和框架。即当前文档、视、和框架。
理解了这些再加上下面的操作就可以令你处理这类问题时得心应手了。
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();
访问当前活动视图和活动文档
1. 对于SDI程序,主框架窗口就是文档框窗,可以采用以下方法取得当前文档和视图:
取得活动文档:
CMyDocument* pDoc;
pDoc=(CMyDocument*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveDocument();
或
pDoc=(CMyDocument*)((CFrameWnd*)AfxGetMainWnd());
这两者是等效的。
取得活动视图:
CMyView* pView;
pView=(CMyView*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveView();
2.对于MDI程序,由于子窗口才是文档框窗,因此首先要用GetActiveFrame()取得活动子框架窗口,然后通过该子窗口获取活动文档和视图:
CMDIChildWnd* pChild=(CMDIChildWnd*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveFrame();
取得活动文档:
CMyDocument* pDoc=pChild->GetActiveDocument();
CMyView* pView=(CMyView*)pChild->GetActiveView();
可以把上述函数片段做成静态成员函数,比如:
static CMyDocument::GetCurrentDoc()
{
CMDIChildWnd* pChild=(CMDIChildWnd*)((CFrameWnd*)AfxGetApp()- >m_pMainWnd)->GetActiveFrame();
CMyDocument* pDoc=pChild->GetActiveDocument();
}
这样就可以通过以下方式取得活动文档(或视图):
CMyDocument::GetCurrentDoc();
注:静态成员函数调用时不需要一个具体的对象与之相关联。
文档模板中找文档
例:
CMultiDocTemplate* pDocTmpl;
pDocTmpl = ((CImpApp*)AfxGetApp())->m_pDocTemplate;
POSITION posDoc= pDocTmpl->GetFirstDocPosition();
while(NULL!=posDoc)
{
pFrmDoc = (CFrmDoc*) pDocTmpl->GetNextDoc(posDoc);
nDocOrder++;
}
相关文章推荐
- Document(文档)、View(视图)、Frame(框架)、App(应用)之间相互访问
- Doc--View 之间相互访问
- 文档、视图、框架窗口、文档模板之间的相互关系【转】
- MFC文档视图框架之间的访问关系
- 文档、视图、框架窗口、文档模板之间的相互关系
- MFC文档视图框架之间的访问关系
- 文档、视图、框架类之间相互访问的方法
- 各种Doc类View类MainFram类的联系方法(文档,视图,框架之间的相互引用方法)
- MFC文档、视图、框架窗口、文档模板之间的相互关系
- 文档、视图、框架窗口、文档模板之间的相互关系
- MFC文档视图框架之间的访问关系
- 文档、视图、框架窗口、文档模板之间的相互关系,关键要理解他们的结构
- 文档、视图、框架窗口、文档模板之间的相互关系
- MFC 文档 视图 和 框架 的建立(Document View and Frame Vork)
- Doc--View 之间相互访问
- iOS设计之 表格UITableView 的参数与视图页面之间的相互传递
- 框架、文档、视图类之间的调用关系
- VS2010/MFC编程入门之四十(文档、视图和框架:各对象之间的关系)
- 在uitabbarviewcontroller的子视图间相互访问,以及在uitabbarviewcontroller中访问其子视图
- 如何让DOC/VIEW框架不创建新文档