MFC - 获取MainFrame,Doc,View,App等指针的方法

这篇具有很好参考价值的文章主要介绍了MFC - 获取MainFrame,Doc,View,App等指针的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 在View中获得Doc指 针
  2. 在App中获得MainFrame指针
  3. 在View中获得MainFrame指针
  4. 获得View(已建立)指针
  5. 获得当前文档指针
  6. 获得状态栏与工具栏指针
  7. 获得状态栏与工具栏变量
  8. 在Mainframe获得菜单指针
  9. 在任何类中获得应用程序类
  10. 从文档类取得视图类的指针(1)
  11. 在App中获得文档模板指针
  12. 从文档模板获得文档类指针
  13. 在文档类中获得文档模板指针
  14. 从文档类取得视图类的指针(2)
  15. 从一个视图类取得另一视图类的指针

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

  1. View中获得Doc指针
    CYouSDIDoc *pDoc=GetDocument(); 注意:SDI模式,即:一个视只能有一个文档。

  2. App中获得MainFrame指针

    • CWinApp 中的m_pMainWnd变量就是MainFrame的指针
    • 也可以: CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd();
  3. View中获得MainFrame指针
    CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;

  4. 获得View(已建立)指针
    CMainFrame *pMain=(CMaimFrame *)AfxGetApp()->m_pMainWnd; // 先获取框架指针
    CyouView *pView=(CyouView *)pMain->GetActiveView(); // 在获取活动view指针

  5. 获得当前文档指针
    CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd->GetActiveDocument();

  6. 获得状态栏与工具栏指针
    CStatusBar * pStatusBar=(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
    CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);

  7. 如果框架中加入工具栏和状态栏变量还可以这样
    (CMainFrame *)GetParent()->m_wndToolBar;
    (CMainFrame *)GetParent()->m_wndStatusBar;

  8. 在Mainframe获得菜单指针
    CMenu *pMenu=m_pMainWnd->GetMenu();

  9. 任何类中获得应用程序类
    用MFC全局函数**AfxGetApp()**获得。

  10. 从文档类取得视图类的指针
    从文档获得视图类指针目的一般为了控制同一文档的多个视图的定位问题,我的体会特别是文字处理CEditView当产生多个视图类时,这个功能是非常需要的。
    CDocument类提供了两个函数用于视图类的定位:GetFirstViewPosition()和GetNextView()

    • virtual POSITION GetFirstViewPosition() const;
    • virtual CView* GetNextView(POSITION& rPosition) const;

    注意:
    GetNextView()括号中的参数用的是引用方式,因此执行后值可能改变。
    GetFirstViewPosition()用于返回第一个视图位置(返回的并非视图类指针,而是一个POSITION类型值),GetNextView()有两个功能:返回下一个视图类的指针以及用引用调用的方式来改变传入的POSITION类型参数的值。
    很明显,在Test程序中,只有一个视图类,因此只需将这两个函数调用一次即可得到CTestView的指针如下(需定义一个POSITION结构变量来辅助操作):

// SDI模式
// 处于CTestdoc.cpp中某段
CTestView* pTestView;
POSITION pos=GetFirstViewPosition();
pTestView=GetNextView(pos);

// 注意:到此 pos等于NULL,因为因为没有下一个视图类了。

这样,便可到了CTestView类的指针pTestView。执行完这几句后,变量pos=NULL,因为没有下一个视图类,自然也没有下一个视图类的POSITION。但是这几条语句太简单,不具有太强的通用性和安全特征;

当象前面说的那样,当要在多个视图为中返回某个指定类的指针时,我们需要遍历所有视图类,直到找到指定类为止。判断一个类指针指向的是否某个类的实例时,可用**IsKindOf()**成员函数时行检查,如:

pView->IsKindOf(RUNTIME_CLASS(CTestView));

即可检查pView所指是否是CTestView类。

有了以上基础,我们已经可以从文档类取得任何类的指针。为了方便,我们将其作为一个文档类的成员函数,它有一个参数,表示要获得哪个类的指针。实现如下:

CView* CTestDoc::GetView(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,即已经不存在下一个视图类供操作;
    1. pView已符合要求。

1和2同时满足。这是因为GetNextView()的功能是将当前视图指针改变成一个视图的位置同时返回当前视图指针,因此pos是pView的下一个视图类的POSITION,完全有可能既是pos==NULL又是pView符合需要。当所需的视图是最后一个视图时就是如此。因此需采用两次判断。
使用该函数应遵循如下格式(以取得CTestView指针为例):

CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));

RUNTIME_CLASS是一个宏,可以简单地理解它的作用:将类的名字转化为CRuntimeClass为指针
至于强制类型转换也是为了安全特性考虑的,因为从同一个基类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要,但能避免一些可能出现的麻烦。

    1. 从一个视图类取得另一视图类的指针综合1和2,很容易得出视图类之间互相获得指针的方法:就是用文档类作中转,先用1的方法得到文档类的指针,再用2的方法,以文档类的视图定位函数取得另一个视图类。同样,可以实现成一个函数:
//(假设要从CTestAView中取得指向其它视图类的指针)
CView* CTestAView::GetView(CRuntimeClass* pClass)
{
	CTestDoc* pDoc=(CTestDoc*)GetDocument();
	CView* pView;
	POSITION pos=pDoc->GetFirstViewPosition();
	while(pos!=NULL){
	   pView=pDoc->GetNextView(pos);
	   if(pView->IsKindOf(pClass))
	   		break;
	}
	
	if(!pView->IsKindOf(pClass)){
	   AfxMessageBox("Connt Locate the View.");
	   return NULL;
	}
	
	return pView;
}

这个函数和2中的GetView()相比,一是多了第一句以取得文档类指针,二是在GetFirstViewPosition()和GetNextView()前加上了文档类指针,以表示它们是文档类成员函数。
有了此函数;当要从CTestAView中取得CTestBView的指针时,只需如下:

CTestBView* pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView));
  1. 对于单文档中也可以加入多个文档模板,但是一般的开发就使用MDI方式开发多文档模板,其方法与上述视图的获取方法很接近,这里稍做解释,如果不清楚,请查阅MSDN。

可以用CWinApp::GetFirstDocTemplatePostion获得应用程序注册的第一个文档模板的位置
利用该值来调用CWinApp::GetNextDocTemplate函数,获得第一个CDocTemplate对象指针。

POSITION GetFirstDocTemplate( ) const;
CDocTemplate *GetNextDocTemplate( POSITION & pos ) const;

第二个函数返回由pos 标识的文档模板。POSITION是MFC定义的一个用于迭代或对象指针检索的值。通过这两个函数,应用程序可以遍历整个文档模板列表。如果被检索的文档模板是模板列表中的最后一个,则pos参数被置为NULL。

  1. 一个文档模板可以有多个文档,每个文档模板都保留并维护了一个所有对应文档的指针列表。

CDocTemplate::GetFirstDocPosition函数获得与文档模板相关的文档集合中第一个文档的位置,并用POSITION值作为CDocTemplate::GetNextDoc的参数来重复遍历与模板相关的文档列表。函数原形为:

viaual POSITION GetFirstDocPosition( ) const = 0;
visual CDocument *GetNextDoc(POSITION & rPos) const = 0;

如果列表为空,则rPos被置为NULL.

  1. 文档中可以调用CDocument::GetDocTemplate获得指向该文档模板的指针

函数原形如下: CDocTemplate * GetDocTemplate ( ) const;
如果该文档不属于文档模板管理,则返回值为NULL。

  1. 一个文档可以有多个视图(view)。每一个文档都保留并维护一个所有相关视的列表。

CDocument::AddView将一个视连接到文档上,将该视图加入到文档相联系的视的列表中,并将视图的文档指针指向该文档。当有File/New、File/Open、Windows/New或Window/Split的命令而将一个新创建的视图的对象连接到文档上时, MFC会自动调用该函数,框架通过文档/视图的结构将文档和视图联系起来。当然,程序员也可以根据自己的需要调用该函数。

Virtual POSITION GetFirstViewPosition( ) const;
Virtual CView * GetNextView( POSITION &rPosition) cosnt;

应用程序可以调用CDocument::GetFirstViewPosition返回与调用文档相联系的视的列表中的第一个视图的位置,并调用CDocument::GetNextView返回指定位置的视,并将rPositon的值置为列表中下一个视的POSITION值。如果找到的视为列表中的最后一个
视,则将rPosition置为NULL.

  1. 从一个视图类取得另一视图类的指针
    这个应用在多视的应用程序中很多见,一般如果自己在主程序或者主框架中做好变量记号,也可以获得,还有比较通用的就是用文档类作中转,以文档类的视图遍历定位,取得另一个视图类。这个功能从本文第10项中可以得到。

VC中常用的文档类,视图类,框架类,应用程序类,自定义类中获取其它四个类的方法:

GET App

AfxGetInstanceHandle()  
AfxGetApp()  

GET Frame->View->Document

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

GET Menu

 CMenu *pMenu=AfxGetApp()->m_pMainWnd->GetMenu();  

GET ToolBar,StatusBar

  (CMainFrame *)GetParent()->m_wndToolBar;  
  (CMainFrame *)GetParent()->m_wndStatusBar;  
  CStatusBar * pStatusBa=(CStatusBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);  
  CToolBar * pToolBar=(CtoolBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);  

Get View from Document

  GetFirstViewPosition 和 GetNextView 函数得到指针。  

最后提醒: 在提取到各个句柄之后,因为初次提取的都是标准类句柄,所以,在使用时要注意将标准句柄转换成自己的类的句柄。文章来源地址https://www.toymoban.com/news/detail-429590.html

((CMyApp*)AfxGetApp())->XXXX();//这的xxxx()就是你定义的类中间的成员。

到了这里,关于MFC - 获取MainFrame,Doc,View,App等指针的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • APP备案,iOS签名文件MD5、公钥获取方法

    前言 2023年8月,国内开始要求应用市场上架的APP要备案,备案则需要提交安卓APP签名文件中的MD5、公钥等信息,如下图是某平台APP备案需要提交的信息。 获取MD5等信息 最省事方法 针对没有ide工具,没有从事过iOS开发,或想节省时间的朋友,建议通过我们开发的网页来获取

    2024年02月08日
    浏览(38)
  • APP备案,最新获取安卓签名文件中MD5等信息方法

    直接通过cmd执行命令 输入后回车会提示输入密码库口令,直接输入Keystore密码(输入过程中终端上不会显示,输完回车就行) 由于上述以前这种方式是可以打印出MD5,现在这种方式却没把MD5值打印出来,处理办法如下 直接在as中的Terminal工具在命令行中输入gradle命令: 1.导出

    2024年01月21日
    浏览(42)
  • Unity - Render Doc - 解决 Waiting For Debugger 导致连接不了 APP 的问题

    Unity : 2020.3.37f1 Pipeline : BRP RDC : 1.26 平常有一些公司内的游戏发布在移动端运行会有各种异常,但是 unity editor (android + opengl es / dx) 下正常 如果没有真机抓帧分析,是搞不定的 然后 RenderDoc 在抓发布出来的调试包也抓不了 调试包环境: development build + android manifest 开启 applica

    2024年02月03日
    浏览(42)
  • 手机上获取地图某个定位的经纬度坐标的方法 - 查询经度、纬度 - 百度地图app、高德地图app、Earth地球

    拖动、定位、获得左上角的 东经、北纬等信息,就是经度、纬度了。 手机安装app 苹果: Earth-地球 安卓、鸿蒙: Earth地球   打开软件,拖动地图   左上角的坐标就是 经度、纬度     百度地图app、高德地图app都无法获取坐标、经度、纬度   手机也可以用 网页版坐标拾取系

    2024年02月09日
    浏览(167)
  • uni-app 小程序获取实时定位和车辆签到(wx.onLocationChange方法)

    1、需求描述         实现一个车辆定位签到功能,获取当前车辆的实时定位,当车辆到达签到点1公里范围内时,可以进行签到,当大于1公里时,禁止签到。同时用户还可以手动刷新定位。         2、wx.getLocation弊端         在小程序中,我们使用wx.getLocation api来获

    2024年02月15日
    浏览(44)
  • uniapp获取app版本号、h5版本号、微信小程序版本号的方法

    App版本号 App的H5版本号 只能在手机模式下才可以打印 , h5 预览模式获取不到的 !!! 获取微信小程序版本号 感觉文章好的话记得点个心心和关注和收藏,有错的地方麻烦指正一下,如果需要转载,请标明出处,多谢!!!

    2024年02月04日
    浏览(56)
  • App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法

    引言 在iOS应用程序开发过程中,进行App备案并获取公钥及证书SHA-1指纹是至关重要的步骤。本文将介绍如何通过appuploader工具获取iOS云管理式证书 Distribution Managed 公钥及证书SHA-1指纹,帮助开发者更好地理解和应用该过程。 正文 iOS应用程序的备案和证书SHA-1指纹获取是确保应

    2024年01月15日
    浏览(48)
  • MFC获取当前程序路径

    可以获取exe的路径,但是当用文件对话框成功打开一个文件后,该目录就被修改为被打开的文件所在目录。 获取的是当前exe的路径。 建议使用这种方法。 如,打开C盘 打开CMD 打开计算器 打开txt文件

    2024年02月17日
    浏览(52)
  • MFC|选择获取文件路径

    参考:mfc按钮选择文件或者文件夹(https://blog.csdn.net/qq_39433050/article/details/130261518) 点击按钮槽函数,选择文件

    2024年02月09日
    浏览(34)
  • MFC 获取程序版本信息

     在 MFC 应用程序中,可以使用 GetFileVersionInfo 函数来获取程序版本信息。这个函数能够获取一个指定文件的版本信息,并将其存储在一个缓冲区中。然后,可以使用 VerQueryValue 函数来解析版本信息并提取所需的信息。 调用

    2024年04月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包