VC其它- 在MFC类中各种类的指针的获取和应用

MFC - 获取MainFrame,Doc,View,App等指针的方法 一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针获取和操作问题。 下面这节内容主要是一般的框架,然后再讲多线程中的指针使用。使用到的类需要包含响应的头文件。 首先一般获得本类(视,文档,对话框都支持)实例指针this,用this的目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在非本类中操作和使用本类中的功能。在View中获得Doc指针 CYouSDIDoc *pDoc=GetDocument(); 注意:SDI模 阅读详情
在MFC类中各种类的指针的获取和应用

关于MFC下的文档和视图以及框架之间的访问, 这些问题已经是老生常谈了,但我觉得还是都没有详细的说明,特
  
  别是对于英语较差的人,我查看了一些blog,总结了一下
!希望对和我一样的人有点帮助!
  
  
1:  因为对于SDI程序,主框架窗口就是文档框窗(如果这个也不知道,就要查看一下MFC下的单文档的构成原理了).
  下面所说的是关于单文档的.
  
  例子: 在CMainFrame框架中如何得到视图类的指针.
  可以 先得到框架指针,然后调用 GetActiveView 函数指向当前活动视.
  
  C 
**View * pView;
  pView
=(C**View*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveView();
  
  当然这些也许都知道是这么用的,但真正的m_pMainWnd和AfxGetApp()是什么意思也许有的人不明白.
  大家也许都知道如何在App中获得MainFrame指针(框架类): CWinApp 中的 m_pMainWnd变量就是CMainFrame的指针.
  
  所以在别的类下也可以先得到m_pMainWnd,就得到了MainFrame的指针. 所以得到视图类的指针,必先 得到CFrameWnd的指针m_pMainWnd,然后在调用FrameWnd下的GetActiveView 就指向当前活动视.

  m_pMainWnd的由来:

  每一个MFC应用程序都有一个CWinApp派生类的对象。这个对象对应着程序的主线程。而 CWinApp 类中有一个 CWnd 
* m_pMainWnd 成员变量。这个成员变量记录了应用程序的主窗口。

  当你新建一个MFC应用程序的时候,在 InitInstance虚函数里都会出现对 m_pMainWnd 赋值的语句.唯一的例外是单文档界面的MFC应用程序,你无法在 InitInstance 函数里看到这段代码,因为它已经被隐藏在 ProcessShellCommand 这个函数里了。

           由此你就可以下结论了:只要创建自己的窗口类,就要把这个类的对象赋值给 m_pMainWnd .而这个成员只能在C
**APP类中才可以使用,所以怎样使用这个CWinApp类里的CWnd 类型的变量来得到主框架窗口的指针呢??

  AfxGetApp函数才可以 , 因为AfxGetApp()得到的是CWinApp类的对象,且AfxGetApp返回值为CWinApp对象指针,就是MFC生成的C**App.cpp中定义的那个对象(对象theApp的指针)。
  
  因为你是在自己创建的项目中得到CWndApp成员函数或者成员变量,所以你必须强制转换为你自己的项目中的类,才能找到成员函数或者变量.

  注: 在单文档中,获得视指针的最简单的方法还是
  ((C
**View *)CFrameWnd::GetActiveView())
  
  
2:   当然在FrameWnd中也可以得到文档类的指针:
  CMyDocument
* pDoc;
  pDoc
=(CMyDocument*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveDocument();
  
  
3:   由上面可以知道:在View中怎样获得MainFrame指针
  CMainFrame 
*pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
  
  注: 从视图类中获得主帧窗口类指针:用函数:CWnd::GetParentFrame() 或 AfxGetMainWnd()也可达到目的。
           GetParentFrame()的工作原理是在父窗口链中搜索,直到找到CFrameWnd或其派生类为止,并返回其指针。
  
  ((CMainFrame 
*)CWnd::GetParentFrame())
  或者
  ((CMainFrame 
*)AfxGetMainWnd())
  
  当然对于MDI程序,由于子窗口才是文档框窗,因此首先要用GetActiveFrame()取得活动子框架窗口,然后通过该子窗口获取活动视图和文档:
  
  CMDIChildWnd
* pChild=(CMDIChildWnd*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)-
  
  
>GetActiveFrame();
  
  取得活动视图:
  CMyView
* pView=(CMyView*)pChild->GetActiveView();
  
  取得活动文档:
  CMyDocument
* pDoc=pChild->GetActiveDocument();
  
  注: 也可以用这种方法来得到多文档中的视指针
  
//获得活动子框架窗口
  CMDIChildWnd* pChild=(CMDIChildWnd*)GetActiveFrame();
  
//或:
  CMDIChildWnd* pChild=MDIGetActive();
  
//获得活动子帧窗口的活动视图
  CMyView* pView=(CMyView*)pChild->GetActiveView();
  
  
1.  从视图类获得文档类的指针
  在视图类中需要引用文档类的地方之前,使用以下语句:
  C
*Doc *pDoc=(C*Doc*)GetDocument();
  以后便可使用pDoc指针访问文档类。
  
2.  从文档类取得视图类的指针 CDocument类提供了两个函数用于视图类的定位:  
  GetFirstViewPosition()和GetNextView()
  
  注意:GetNextView()括号中的参数用的是引用方式,因此执行后值可能改变.GetFirstViewPosition()用于
  
  返回第一个视图位置(返回的并非视图类指针,而是一个POSITION类型值),GetNextView()有两个功能:返回下一个视图类的指针以及用引用调动的方式来改变传入的POSITION类型参数的值。很明显,在Test程序中,只有一个视图类,因此只需将这两个函数调用一次即可得到 CTestView的指针如下(需定义一个POSITION结构变量来辅助操作):
  
  C
*View* pView;
  POSITION pos
=GetFirstViewPosition();
  pView
=GetNextView(pos);
  
  这样,便可到了C
*View类的指针pView.执行完成几句后,变量pos=NULL,因为没有下一个视图类,自然也没有下一个视图类的 POSITION.但是之几条语句太简单,不具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指定类的指针时,我们需要遍历所有视图类,直到找到指定类为止。判断一个类指针指向的是否某个类的实例时,可用IsKindOf()成员函数时行检查.
  
  如:
  pView
->IsKindOf(RUNTIME_CLASS(C*View));
  即可检查pView所指是否是C
*View类。
  有了以上基础,我们已经可以从文档类取得任何类的指针。为了方便,我们将其作为一个文档类的成员函数,它有一个参数,表示要获得哪个类的指针。实现如下:
  CView
* C*Doc::GetVieww(CRuntimeClass* pClass)
  
{ CView* pView;
  POSITION pos
=GetFirstViewPosition();
  
while(pos!=NULL){
  pView
=GetNextView(pos);
  
if(!pView->IsKindOf(pClass))
  
break;}

  
if(!pView->IsKindOf(pClass)){
  AfxMessageBox(
"Connt Locate the View.");
  
return NULL;}

  
return pView;}

  其中用了两次视图类的成员函数IsKindOf()来判断,是因为退出while循环有三种可能:
  
1.pos为NULL,即已经不存在下一个视图类供操作;
  
2.pView已符合要求。
  
3.1和2同是满足。这是因为GetNextView()的功能是将当前视图指针改变成一个视图的位置同时返回当前视图指针,因此pos是pView的下一个视图类的POSITION,完全有可能既是pos==NULL又是pView符合需要。当所需的视图是最后
  
  一个视图是最后一个视图类时就如引。因此需采用两次判断。
  使用该函数应遵循如下格式(以取得CTestView指针为例):
  CTestView
* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));
  RUNTIME_CLASS是一个宏,可以简单地理解它的作用:将类的名字转化为CRuntimeClass为指针。
  至于强制类型转换也是为了安全特性考虑的,因为从同一个基类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要,但能避免一些可能出现的麻烦。
 
VC6.0对话框控件字体颜色自定义指南 创建应用程序之后,我们常常需要添加自定义对话框以提供额外的用户交互界面。以下是如何在MFC应用程序中添加自定义对话框的步骤:使用对话框编辑器设计对话框界面,包括添加所需的控件和设置属性。创建一个新的对话框类,与设计的对话框相关联。在应用程序中合适的位置调用对话框,可以是模式对话框或非模式对话框。 阅读详情

相关推荐

mfc中各类指针的获取

讲解了再mfc中如何获取各种不同类,对象的指针

关于获得MFC窗口其它类指针的方法(优快云)

访问应用程序的其它类 获得CWinApp: -在CMainFrame,CChildFrame,CDocument,CView中直接调用AfxGetApp()或用theApp -在其它类中只能用AfxGetApp() 获得CMainFrame: -在CMinApp中用AfxGetMainWnd()或者m_pMainWnd -在CChildFrame中可用GetParentFr...

weixin_30616969的博客 366

在MFC类中各种类的指针的获取和应用

在MFC类中各种类的指针的获取和应用,帮助编程人员较快掌握不同类间指针的使用

【C++】C++中获得类型名称

文章目录0x00 前言0x02 __cxa_demangle简介 0x00 前言 文章中的文字可能存在语法错误以及标点错误,请谅解; 如果在文章中发现代码错误或其它问题请告知,感谢! 0x02 __cxa_demangle简介 一般情况下,我们可以通过C++中的typeid().name()获得一个类型或者表达式的名称: std::cout << typeid().name() << std::endl; 例: #include <iostream> #include

C/C++攻城狮 9301

MFC获得各类指针,句柄的方法

MFC获得各个类,控件,当前活动窗口的指针,句柄

关于获得MFC窗口其它类指针的方法.pdf

关于获得MFC窗口其它类指针的方法.pdf

MFC中获取各种类(文档、视图、框架、应用程序)指针的方法

比较详细地介绍了MFC中获取各种类(文档、视图、框架、应用程序)的指针的获取方法。

yuvmen的专栏 1万+

在视图上创建ListCtrl

一般来说在对话框上创建ListCtrl,这次演示下如何在视图上创建ListCtrl。

如何在C++中获得完整的类型名称

char* name = abi::__cxa_demangle(typeid(Foo*[10]).name(), nullptr, nullptr, nullptr); std::cout

Turn X7 3978

嘉立创EDA vs Altium Designer:新手如何选择?从界面到实战全对比

本文全面对比了嘉立创EDA与Altium Designer(AD)两大PCB设计工具,从设计哲学、界面交互、封装库管理、设计规则引擎、协作功能到成本生态六大维度进行深入分析。嘉立创EDA以极简设计和云端协作为特色,适合学生和创客快速上手;而AD则凭借专业级精准控制,成为高端电子设计的行业标准。通过实战案例和详细对比表格,帮助新手根据项目需求选择合适的EDA工具。

weixin_30296405的博客 721

文件上传漏洞攻击与防范方法

文件上传漏洞攻击与防范方法 文件上传漏洞简介: 文件上传漏洞是web安全中经常用到的一种漏洞形式。是对数据与代码分离原则的一种攻击。上传漏洞顾名思义,就是攻击者上传了一个可执行文件如木马,病毒,恶意脚本,WebShell等到服务器执行,并最终获得网站控制权限的高危漏洞。 文件上传漏洞危害: 上传漏洞与SQL注入或 XSS相比 , 其风险更大 , 如果 Web应用程序存在上传漏洞 , 攻击者上传...

m0_38103658的博客 4万+

MFC通过对话框窗口句柄获得对话框对象指针

mfc如何获得控件句柄 CWnd *pWnd = GetDlgItem(ID_***); // 取得控件的指针 HWND hwnd = pWnd->GetSafeHwnd(); // 取得控件的句柄 MFC在很多的对话框操作中,我们经常要用到在一个对话框中调用另一个对话框的函数或变量.可以用如下方法来解决. HWND hWnd=::FindWindow(NULL,_...

u011555996的博客 1432

Linux内存压力测试工具【memtester】详且精

对Linux下的压力测试工具memtester有一个比较人性化的概述,以及避坑心得。

weixin_44118923的博客 1万+

VC MFC SDI/MDI框架各部分指针获取方式(转)

VC MFC SDI/MDI框架各部分指针获取方式(转)            获得CWinApp   获得CMainFrame   获得CChildFrame   获得CDocument   获得CView 在CWinApp中   AfxGetMainWnd() m_pMainWn...

weixin_34080571的博客 100

视觉惯性SLAM系列——ORB-SLAM3的整体介绍及各个线程的功能(五)

跟踪线程(Tracking Thread)作用:负责处理每一帧图像,进行相机位姿的估计和定位。它首先执行与前一帧图像的特征匹配,然后通过仅运动(motion-only)BA(Bundle Adjustment)优化位姿。如果跟踪失败,它会尝试在所有地图中进行重定位。此外,跟踪线程还负责决定何时插入新的关键帧,以及何时将关键帧从局部地图中移除。详细介绍见局部建图线程(Local Mapping Thread)作用:管理局部地图,向活跃地图添加关键帧和点,移除多余的关键帧和点。

曾经也曾立志 1004

并网逆变器学习笔记8---平衡桥(独立中线模块)控制

参考文献:《带独立中线模块的三相四线制逆变器中线电压脉动抑制方法》---赵文心。

圆桌骑士的博客 7321

MFC中获得各个类的指针/句柄 ID的总结

一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针获取和操作问题。 下面这节内容主要是一般的框架,然后再讲多线程中的指针使用。使用到的类需要包含响应的头文件。首先一般获得本类(视,文档,对话框都支持)实例指针 this,用this的目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在非本类中操作和使用本类中的功

数据轨迹的专栏 508

01-嵌入式入门-如何看原理图

最近由于找到的工作是偏于嵌入式方向,因此又重新开始学习已经丢弃两年的知识。新手学习知识感觉有一个通病:喜欢收集各种各样的视频、资料,网盘里收藏一大堆,但是却从没有打开看过,到头来还是个小白,只听说过几个概念,而实际却是不知所云,这就是所谓的"学习综合征"。而我也是其中的一员,最近痛定思痛,就准备根据一套资料沉下心学习下去,不再进入收集资料的大军。...

weixin_34010566的博客 4489

MFC中获取各种类指针的方法

MFC中获取各种类指针的方法 要获得另一窗体视图类中的某控件指针,首先获得视图指针是难点,获的视图指针再用GetDlgItem函数就容易可以获得控件指针 获得各种视图指针如下1) 在View中获得Doc指针2) 在App中获得MainFrame指针3) 在View中获得MainFrame指针4) 获得View(已建立)指针5) 获得当前文档指针6) 获得状态栏与工具栏指针7) 获得状态栏与工具栏变

回家念经(kv300)--编程之禅 2151

ABAP Bits and Bytes 完全参考,理解内存、字节、位运算与类型解释

ABAP开发中业务代码与底层字节处理的差异:业务层关注采购订单、会计凭证等语义信息,而接口开发需处理十六进制、位运算等底层操作。文章通过整数变量示例说明同一段字节在不同类型解释下会呈现不同值,并介绍x类型、位运算及类型转换的实际应用。这些知识在文件接口、加密传输等场景中尤为重要,开发者需注意字节序、编码等问题。建议将底层协议处理与业务逻辑分离,以保持代码清晰和可维护性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 142

第10章 shellcode实战:18 神级开源shellcode工具:donut

Donut是一款shellcode生成器,可将C/C++、C#生成的PE文件转换为shellcode文件,同时支持JS、XSL、VBS脚本转换为shellcode。以下“原生”EXE/DLL指非托管PE文件(包括并不限于C/C++、delphie等编写生成的可执行文件),可以直接由系统加载运行,区别于.Net生成的托管文件。被处理exe/dll为32位程序,则需要用32为的shellcode加载器启用,exe/dll为64位的就用64位shellcode加载器启用。

李小咖·网安技术库 2796

MFC 获得各类指针、句柄的方法

最近有些人在问MFC编程一些要点,有一些句柄的获取、指针的获取是常见的问题,本文将对这些问题做以解释,参考了前人的笔录(见reference),希望能够帮助大家更方便地进行MFC程序开发。        一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针和句柄获取和操作问题。本文中将针对各类句柄的获得、指针的获得以及M

Rachel Zhang的专栏 4万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VC MFC类中获得其它类指针

获取工具条的指针     在缺省状态下,有一个默认的工具条AFX_IDW_TOOLBAR,我们可以根据相应的ID去获取工具条指针,方法如下:      CToolBar* pToolBar=(CToolBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);     是不是很简单?     获取状态条的指针     在缺省状态下,有

gwwgle的专栏 1392

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

MFC/VC 获取其他类指针

 在mainframe类中得到view的指针: 首先要在mainframe的头文件中包涵doc类和view类的头文件,doc类要比view类先包含,因为可能view类中实例了doc的对象和调用了doc的函数。 然后代码为: CFameWnd*   pActiveFrame=GetActiveFrame();   CView*   pView=pActiveFrame->GetAct

Cici_xigua的博客 621

MFC工程中,各个类之间相互获取指针

MFC工程中,各个类之间相互获取指针   初学MFC,很多人都会有个疑惑:为什么SDI中有五个基础类,他们之间是否有联系,如何互相调用指针和句柄?其实,在VC中编程中,对于刚刚开始学习的同学,最大的障碍和问题就是消息机制和指针获取与操作。这些内容基本上是每本VC学习工具书上必讲的内容,而且通过MSDN很多问题都能解决。为了方便,本文从网上东拼西凑解释一下。      SDI中有五个类分别为

zsrzsr2的专栏 2268

MFC应用程序中指针的获取(1)

MFC应用程序中指针的使用           1)     在View中获得Doc指针       2)     在App中获得MainFrame指针       3)     在View中获得MainFrame指针       4)     获得View(已建立)指针      

VC++/MFC的专栏 2653
上一篇: VC网络编程-Winsock开发网络通信程序的经典入门
下一篇: VC其它-VC++中的自定义消息
MasterFT
博客等级 码龄20年 48粉丝 59原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值