在Visual C++设计中,单文档应用程序中常用的MFC类如何相互获得类的指针?(如CView类获得CDoc类的指针等

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Visual C++设计中,单文档应用程序中常用的MFC类如何相互获得类的指针?(如CView类获得CDoc类的指针等相关的知识,希望对你有一定的参考价值。

不要回答的长篇大论,150——300字就行了,这是我考试题的简答题。谢谢谢谢

前人在CSDN总结的,曾经帮助过我,整理总结一下,希望也能帮助一下别人。

获得CWinApp
获得CMainFrame
获得CChildFrame
获得CDocument
获得CView

在CWinApp中
AfxGetMainWnd()

m_pMainWnd
AfxGetMainWnd()->MDIGetActive()

AfxGetMainWnd()->GetActiveFrame()
SDI:AfxGetMainWnd()->GetActiveView()->GetDocument()

MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument()
SDI:AfxGetMainWnd()->GetActiveView()
MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()
在CMainFrame中 AfxGetApp()

theApp
MDIGetActive()

GetActiveFrame()
SDI:GetActiveView()->GetDocument()
MDI:MDIGetActive()->GetActiveView()->GetDocument() SDI:GetActiveView()
MDI:MDIGetActive()->GetActiveView()
在CChildFrame中 AfxGetApp()

theApp
GetParentFrame()
GetActiveView()->GetDocument() GetActiveView()
在CDocument中 AfxGetApp()

theApp
AfxGetMainWnd() AfxGetMainWnd()->MDIGetActive()

AfxGetMainWnd()->GetActiveFrame()
POSITION pos = GetFirstViewPosition();GetNextView(pos)
在CView中 AfxGetApp()

theApp
AfxGetMainWnd() GetParentFrame() GetDocument()
在其他类中 AfxGetApp()
AfxGetMainWnd() AfxGetMainWnd()->MDIGetActive()

AfxGetMainWnd()->GetActiveFrame()
SDI:AfxGetMainWnd()->GetActiveView()->GetDocument()

MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument()
SDI:AfxGetMainWnd()->GetActiveView()
MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()

理一理MFC的这几个类的关系,可以很容易明白上面的这些乱七八糟的逻辑。
App是应用域,所有的域中的东西都可以通过全局函数访问到它。
MainFrame是主框架,也基本可以用全局函数访问到。
MainFrame下是若干个ChildFrame,ChildFrame中若干个View和Document(可能不成对),ChildFrame管理着View,View和Document进行互操作。
因此整体框架就出来了,一般除了直接应用的关系都可以通过MainFrame-->Active ChildFrame-->Active View-->Document这条线进行访问,这应该叫什么来自?万能方法吧^_^。
恕我懒惰,不愿意画一个更详细的图解,凑合着看看吧。
参考技术A 我擦,这么简单的你都不会,你怎么考试啊
常用的就是CxxxxView,CMainFrame,CxxxxApp,CxxxxDocument这四个类呗
在CMainFrame中可以用GetActiveView(),AfxGetApp(),GetActiveDocument()得到另外三个;
在CxxxxView中可以用GetParent(),GetDocument(),AfxGetApp()得到另外三个;
在CxxxxApp中可以用AfxGetMainWnd()得到CMainFrame 的指针,然后得到另外两个的方法同CMainFrame中的情况;
在CxxxxDocument()中用跟CxxxxApp的一样,也是AfxGetMainWnd()得到CMainFrame 的指针,然后利用这个指针来获得别的类的指针,不过其中用的比较多的是前两个类 中的互相获取,后两个类中基本不获取别的类的指针。

参考资料:MSDN2001OCT

参考技术B 使用BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
函数,详见:
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/dllproc/base/createprocess.htm
参考技术C AfxGetApp()
GetDocument()
GetParent()

Visual Studio 2010 像 Visual Studio 6 一样在 C++ 中编译内联程序集?

【中文标题】Visual Studio 2010 像 Visual Studio 6 一样在 C++ 中编译内联程序集?【英文标题】:Visual Studio 2010 compiling inline assembly in c++ as if Visual Studio 6? 【发布时间】:2011-01-07 15:17:34 【问题描述】:

我有一个在 VS6 中创建的 C++ 项目,它在 VS2010 中打开并且编译良好。它包含一个带有一些内联汇编的类,包括以下代码:

__asm
  mov eax,this
  mov esi,[eax].m_pImage
  ...

一切都好,花花公子,直到我尝试在 VS2010 中创建一个新的 MFC C++ 项目并使用上面显示的汇编代码添加类。突然,这将无法编译,因为 __asm 的新解释要求代码如下(或类似的东西;无论如何都可以编译):

__asm
  mov eax,this
  mov esi,[eax]this.m_pImage
  ...

现在,对于我的生活,我无法弄清楚这两个项目之间有什么区别,它允许转换后的 VS6 项目在 VS2010 中编译(假定当前无效)内联汇编代码,而新创建的项目可以不。

是否有一个(隐藏的)设置允许人们使用旧的 VS6 编译器?

【问题讨论】:

【参考方案1】:

VS6 内联 ASM 似乎是一个已修复的错误。我这么说是因为我不确定编译器如何验证m_pImageeax 寄存器中加载的内容的成员,因此无法找到偏移量。要回答您的问题,我知道在 VS6 编译器中无法使用旧的 ASM 语义。

我会在内联 ASM 之外创建一个局部变量,然后将其分配给 esi

void * pointer = this.m_pImage;
__asm

   mov ebx, pointer
   mov esi, ebx
   ...

【讨论】:

当你从 VS6 转换一个项目时(并且只有 VS6——其他版本不会发生这种情况),大量的兼容性设置被应用。可能已添加此错误修复,但旧的代码路径仍在 VS6 兼容模式下使用。 没有办法复制这些兼容性设置? 忽略最后一条评论......再次阅读答案和比利的评论,我很清楚我们不应该希望我们的错误遗留 VS6 代码在这个时代仍然有效。跨度>

以上是关于在Visual C++设计中,单文档应用程序中常用的MFC类如何相互获得类的指针?(如CView类获得CDoc类的指针等的主要内容,如果未能解决你的问题,请参考以下文章

在C++的MFC工具栏按钮中实现改变单文档字体大小的方法

在 Visual Studio 2010 C++ 中为 /// 生成 XML 文档注释

Visual Studio中C++部分的官方文档链接微软(Microsoft)所有产品的官方文档链接

Visual studio 2010 C++用Release运行是单线程吗?怎样提高运算速度?

Visual C++和C++的区别

删除 Visual C++ 菜单栏