热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

2019独角兽企业重金招聘Python工程师标准转载:最近有些人在问MFC编程一些要点,有一些句柄的获取、指针的获取是

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 

转载:

最近有些人在问MFC编程一些要点,有一些句柄的获取、指针的获取是常见的问题,本文将对这些问题做以解释,参考了前人的笔录(见reference),希望能够帮助大家更方便地进行MFC程序开发。

   一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针和句柄获取和操作问题。本文中将针对各类句柄的获得、指针的获得以及MFC中常见应用进行阐述并举例。

本文内容索引:

=========================================================

MFC中获取常见类句柄<视图类&#xff0c;文档类&#xff0c;框架类&#xff0c;应用程序类>

MFC中获取窗口句柄及相关函数 

MFC获取控件句柄

MFC各类中获取类指针详解

MSDN关于应用程序信息和管理的各个函数

&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;

MFC中获取常见类句柄<视图类&#xff0c;文档类&#xff0c;框架类&#xff0c;应用程序类>

本节为VC中常用的文档类&#xff0c;视图类&#xff0c;框架类&#xff0c;应用程序类&#xff0c;自定义类中获取其它四个类的方法&#xff1a;
GET App
   AfxGetInstanceHandle()
   AfxGetApp()
GET Frame->View->Document
    SDI   AfxGetMainWnd() -> GetActiveView() -> GetDocument()
    MDI   AfxGetMainWnd() -> MDIGetActive() -> GetActiveView() -> GetDocument()
GET Menu
     CMenu *pMenu&#61;AfxGetApp()->m_pMainWnd->GetMenu();
GET ToolBar&#xff0c;StatusBar
      (CMainFrame *)GetParent()->m_wndToolBar;
      (CMainFrame *)GetParent()->m_wndStatusBar;
      CStatusBar * pStatusBa&#61;(CStatusBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
      CToolBar * pToolBar&#61;(CtoolBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);
Get View from Document
      GetFirstViewPosition 和 GetNextView 函数得到指针。 

MFC中获取窗口句柄及相关函数 

首先&#xff0c;窗口句柄&#xff0c;在窗口类中直接使用成员变量m_hWnd&#xff0c;在窗口外最常见是用AfxGetMainWnd &#xff08;获取主窗口指针&#xff0c;其成员变量m_hWnd为主窗口句柄&#xff09;&#xff1a;

HWND hWnd &#61; AfxGetMainWnd()->m_hWnd;

与其相关的函数说明如下,这些函数对于获取窗口句柄非常有用&#xff1a;

GetTopWindow
函数功能&#xff1a;该函数检查与特定父窗口相联的子窗口z序&#xff08;Z序&#xff1a;垂直屏幕的方向&#xff0c;即叠放次序&#xff09;&#xff0c;并返回在z序顶部的子窗口的句柄。
函数原型&#xff1a;HWND GetTopWindow&#xff08;HWND hWnd&#xff09;&#xff1b;
参数&#xff1a;
  hWnd:被查序的父窗口的句柄。如果该参数为NULL&#xff0c;函数返回Z序顶部的窗口句柄。
返回值&#xff1a;
    如果函数成功&#xff0c;返回值为在Z序顶部的子窗口句柄。如果指定的窗口无子窗口&#xff0c;返回值为NULL。
GetForegroundWindow
函数功能&#xff1a;该函数返回当前系统的前台窗口的窗口句柄。
函数原型&#xff1a;HWND GetForegroundWindow&#xff08;VOID&#xff09;  
返回值&#xff1a;函数返回前台窗回的句柄。
☆☆☆ GetActiveWindow 获取当前窗口句柄

函数功能&#xff1a;该函数可以获得与调用该方法的线程的消息队列相关的活动窗口的窗口句柄&#xff08;就是取得当前进程的活动窗口的窗口句柄&#xff09;。
函数原型&#xff1a;HWND GetActiveWindow&#xff08;VOID&#xff09;
返回值&#xff1a;返回值是与调用线程的消息队列相关的活动窗口的句柄。否则&#xff0c;返回值为NULL。
GetSafeHwnd
函数功能&#xff1a;获取某个窗口对象&#xff08;CWnd的派生对象&#xff09;指针的句柄&#xff08;HWND&#xff09;时&#xff0c;最安全的方法是使用GetSafeHwnd()函数。
通过下面的例子来看其理由&#xff1a;
  CWnd *pwnd &#61; FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器

[cpp] view plaincopy

  1. CWnd *pwnd &#61; FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器
  2. HWND hwnd &#61; pwnd->m_hwnd; //得到它的HWND

HWND hwnd &#61; pwnd->m_hwnd; //得到它的HWND

  这样的代码当开始得到的pwnd为空的时候就会出现一个“General protection error”,并关闭应用程序&#xff0c;因为一般不能对一个NULL指针访问其成员&#xff0c;如果用下面的代码&#xff1a;

[cpp] view plaincopy

  1. CWnd *pwnd &#61; FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器
  2. HWND hwnd &#61; pwnd->GetSafeHwnd(); //得到它的HWND

就不会出现问题&#xff0c;因为尽管当pwnd是NULL时&#xff0c;GetSafeHwnd仍然可以用&#xff0c;只是返回NULL
IsWindowVisible
函数功能&#xff1a;该函数获得给定窗口的可视状态。
函数原型&#xff1a;BOOL IsWindowVisible&#xff08;HWND hWnd&#xff09;&#xff1b;
参数&#xff1b;
  hWnd&#xff1a;被测试窗口的句柄。
返回值&#xff1a;
    如果指定的窗口及其父窗口具有WS_VISIBLE风格&#xff0c;返回值为非零&#xff1b;如果指定的窗口及其父窗口不具有WS_VISIBLE风格&#xff0c;返回值为零。由于返回值表明了窗口是否具有Ws_VISIBLE风格&#xff0c;因此&#xff0c;即使该窗口被其他窗口遮盖&#xff0c;函数返回值也为非零。
备注&#xff1a;
    窗口的可视状态由WS_VISIBLE位指示。当设置了WS_VISIBLE位&#xff0c;窗口就可显示&#xff0c;而且只要窗口具有WS_VISIBLE风格&#xff0c;任何画在窗口的信息都将被显示。
IsWindow&#xff1a;
函数功能&#xff1a;该函数确定给定的窗口句柄是否标示一个已存在的窗口。 
函数原型&#xff1a;BOOL IsWindow&#xff08;HWND hWnd&#xff09;&#xff1b;
参数&#xff1a;
    hWnd:被测试窗口的句柄。
返回值&#xff1a;
    如果窗口句柄标识了一个已存在的窗口&#xff0c;返回值为TURE&#xff1b;如果窗口句柄未标识一个已存在窗口&#xff0c;返回值为FALSE。

FindWindow&#xff1a;
HWND FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName );
参数&#xff1a;
lpClassName

  指向一个以null结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子。如果这个参数是一个原子&#xff0c;那么它必须是一个在调用此函数前已经通过GlobalAddAtom函数创建好的全局原子。这个原子&#xff08;一个16bit的值&#xff09;&#xff0c;必须被放置在lpClassName的低位字节中&#xff0c;lpClassName的高位字节置零。

lpWindowName
  指向一个以null结尾的、用来指定窗口名&#xff08;即窗口标题&#xff09;的字符串。如果此参数为NULL&#xff0c;则匹配所有窗口名。
返回值&#xff1a;
如果函数执行成功&#xff0c;则返回值是拥有指定窗口类名或窗口名的窗口的句柄。

  如果函数执行失败&#xff0c;则返回值为 NULL 。可以通过调用GetLastError函数获得更加详细的错误信息。

来说个应用&#xff0c;窗口标题的改变&#xff0c;我们可以通过SetWindowText来实现&#xff1a;

注&#xff1a;如果窗口本身属性是不显示标题的&#xff0c;这个函数的调用不会影响窗口属性。

[cpp] view plaincopy

  1. //Set title for application’s main frame window .
  2. AfxGetMainWnd ( ) -> SetWindowText (_T("Application title") )  
  3. //Set title for View’s MDI child frame window .
  4. GetParentFrame ( ) -> SetWindowText ("_T ("MDI Child Frame new title") )  
  5. //Set title for dialog’s push button control.
  6. GetDigitem (IDC_BUTTON) -> SetWindowText (_T ("Button new title ") ) 

MFC获取控件句柄

SDI中的控件句柄获取&#xff1a;

[cpp] view plaincopy

  1. CWnd   *pWnd   &#61;   GetDlgItem(ID_***); // 取得控件的指针
  2. HWND hwnd &#61; pWnd->GetSafeHwnd();  // 取得控件的句柄
取得CDC的指针是CDC* pdc &#61; pwnd->GetWindowDC();

MFC各类中获取类指针详解

使用到的类需要包含响应的头文件。首先一般获得本类(视&#xff0c;文档&#xff0c;对话框都支持)实例指针 this&#xff0c;用this的目的&#xff0c;主要可以通过类中的函数向其他类或者函数中发指针&#xff0c;以便于在非本类中操作和使用本类中的功能。这其中的关键在于理解 m_pMainWnd&#xff0c;AfxGetApp()&#xff0c;AfxGetMainWnd()的意义&#xff01;
1&#xff09;在View中获得Doc指针
CYouSDIDoc *pDoc&#61;GetDocument();一个视只能有一个文档。
2) 在App中获得MainFrame指针
CWinApp 中的 m_pMainWnd变量就是MainFrame的指针&#xff0c;也可以&#xff1a; CMainFrame *pMain &#61;(CMainFrame*)AfxGetMainWnd();
3) 在View中获得MainFrame指针
CMainFrame *pMain&#61;(CmaimFrame *)AfxGetApp()->m_pMainWnd;
4) 获得View&#xff08;已建立&#xff09;指针
CMainFrame *pMain&#61;(CmaimFrame *)AfxGetApp()->m_pMainWnd;
CyouView *pView&#61;(CyouView *)pMain->GetActiveView();
5) 获得当前文档指针
CDocument * pCurrentDoc &#61;(CFrameWnd *)m_pMainWnd->GetActiveDocument();
6) 获得状态栏与工具栏指针
CStatusBar * pStatusBar&#xff1d;(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
CToolBar * pToolBar&#61;(CtoolBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);
7) 如果框架中加入工具栏和状态栏变量还可以这样
(CMainFrame *)GetParent()->m_wndToolBar;
(CMainFrame *)GetParent()->m_wndStatusBar;
8) 在Mainframe获得菜单指针
CMenu *pMenu&#61;m_pMainWnd->GetMenu();
9) 在任何类中获得应用程序类
AfxGetInstanceHandle 得到句柄&#xff0c;AfxGetApp得到指针
最后提醒大家&#xff0c;在提取到各个句柄之后&#xff0c;因为初次提取的都是标准类句柄&#xff0c;所以&#xff0c;在使用时要注意将标准句柄转换成自己的类的句柄。
如&#xff1a;
AfxGetApp();//得到的是WinApp类的句柄&#xff0c;
所以操作前记得转换成自己定义的类的句柄。
如&#xff1a;
((CMyApp*)AfxGetApp())->XXXX&#xff08;&#xff09;&#xff1b;//这的xxxx()就是你定义的类中间的成员。

MSDN关于应用程序信息和管理的各个函数

When you write an application, you create a single CWinApp-derived object. Attimes, you may want to get information about this object from outside theCWinApp-derived object.
The Microsoft Foundation Class Library provides the following global functionsto help you accomplish these tasks:
Application Information and Management Functions
AfxFreeLibrary
Decrements the reference count of the loaded dynamic-link library (DLL) module;when the reference count reaches zero, the module is unmapped.
AfxGetApp
Returns a pointer to the application&#39;s single CWinApp object.
AfxGetAppName
Returns a string containing the application&#39;s name.
AfxGetInstanceHandle
Returns an HINSTANCE representing this instance of the application.
AfxGetMainWnd
Returns a pointer to the current "main" window of a non-OLEapplication, or the in-place frame window of a server application.
AfxGetResourceHandle
Returns an HINSTANCE to the source of the application&#39;s default resources. Usethis to access the application&#39;s resources directly.
AfxInitRichEdit
Initializes the version 1.0 rich edit control for the application.
AfxInitRichEdit2
Initializes the version 2.0 and later rich edit control for the application.
AfxLoadLibrary
Maps a DLL module and returns a handle that can be used to get the address of aDLL function.
AfxRegisterWndClass
Registers a Windows window class to supplement those registered automaticallyby MFC.
AfxSocketInit
Called in a CWinApp::InitInstance override to initialize Windows Sockets.
AfxSetResourceHandle
Sets the HINSTANCE handle where the default resources of the application areloaded.
AfxRegisterClass
Registers a window class in a DLL that uses MFC.
AfxBeginThread
Creates a new thread.
AfxEndThread
Terminates the current thread.
AfxGetThread
Retrieves a pointer to the current CWinThread object.
AfxWinInit
Called by the MFC-supplied WinMain function, as part of the CWinAppinitialization of a GUI-based application, to initialize MFC. Must be calleddirectly for console applications using MFC.

Reference&#xff1a;

1. http://www.cppblog.com/eday/archive/2006/11/18/15375.html

2. http://support.microsoft.com/KB/141003

3. http://blog.csdn.net/zhifeiya/article/details/7402667


转载于:https://my.oschina.net/EndlessText/blog/172259


推荐阅读
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
  • 本文介绍如何使用MFC和ADO技术调用SQL Server中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。 ... [详细]
  • 本文探讨了如何利用HTML5和JavaScript在浏览器中进行本地文件的读取和写入操作,并介绍了获取本地文件路径的方法。HTML5提供了一系列API,使得这些操作变得更加简便和安全。 ... [详细]
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • 当unique验证运到图片上传时
    2019独角兽企业重金招聘Python工程师标准model:public$imageFile;publicfunctionrules(){return[[[na ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 本文深入探讨了 Delphi 中类对象成员的核心概念,包括 System 单元的基础知识、TObject 类的定义及其方法、TClass 的作用以及对象的消息处理机制。文章不仅解释了这些概念的基本原理,还提供了丰富的补充和专业解答,帮助读者全面理解 Delphi 的面向对象编程。 ... [详细]
  • This request pertains to exporting the hosted_zone_id attribute associated with the aws_rds_cluster resource in Terraform configurations. The absence of this attribute can lead to issues when integrating DNS records with Route 53. ... [详细]
  • 本文探讨了如何在Java中使用JAXB解组两个具有相同名称但不同结构的对象。我们将介绍一个抽象类Bar及其具体实现,并展示如何正确地解析XML文档以获取正确的对象实例。 ... [详细]
  • 本文介绍了在JSP页面中显示用户登录时间的几种常见方法,包括直接使用Date对象、格式化日期输出以及使用SimpleDateFormat类进行更精确的时间显示。 ... [详细]
  • Logback使用小结
    1一定要使用slf4j的jar包,不要使用apachecommons的jar。否则滚动生成文件不生效,不滚动的时候却生效~~importorg.slf ... [详细]
  • 本文介绍了如何在 Flutter 应用程序中使用单例模式创建一个全局唯一的数据管理类,以确保在整个应用生命周期中数据的一致性和可访问性。 ... [详细]
  • JavaScript:简洁与复杂之间的平衡
    本文探讨了在编写JavaScript教程时,如何在保持内容简洁的同时,确保初学者能够理解并应用实际开发中的复杂问题。文章通过具体示例分析了不同层次的JavaScript代码实现。 ... [详细]
author-avatar
嗒嗒爱臭臭
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有