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

<h5>&nbsp;</h5> <p>转载: <p>最近有些人在问MFC编程一些要点,有一些句柄的获取、指针的获取是常见的问题,本文将对这些问题做以解释,参考了前人的笔录(见reference),希望能够帮助大家更方便地进行MFC程序开发。 <p>&nbsp;&nbsp; 一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针和句柄获取和操作问题。本文中将针对各类句柄的获得、指针的获得以及MFC中常见应用进行阐述并举例。 <p>本文内容索引: <p>========================================================= <p>MFC中获取常见类句柄&lt;视图类,文档类,框架类,应用程序类&gt; <p>MFC中获取窗口句柄及相关函数&nbsp; <p>MFC获取控件句柄 <p>MFC各类中获取类指针详解 <p> MSDN关于应用程序信息和管理的各个函数 <p>========================================================== <p>MFC中获取常见类句柄&lt;视图类,文档类,框架类,应用程序类&gt; <p>本节为VC中常用的文档类,视图类,框架类,应用程序类,自定义类中获取其它四个类的方法:<br>GET App <br>&nbsp;&nbsp; AfxGetInstanceHandle() <br>&nbsp;&nbsp; AfxGetApp() <br>GET Frame-&gt;View-&gt;Document <br>&nbsp;&nbsp;&nbsp; SDI&nbsp;&nbsp; AfxGetMainWnd() -&gt; GetActiveView() -&gt; GetDocument() <br>&nbsp;&nbsp;&nbsp; MDI&nbsp;&nbsp; AfxGetMainWnd() -&gt; MDIGetActive() -&gt; GetActiveView() -&gt; GetDocument() <br>GET Menu <br>&nbsp;&nbsp;&nbsp;&nbsp; CMenu *pMenu=AfxGetApp()-&gt;m_pMainWnd-&gt;GetMenu(); <br>GET ToolBar,StatusBar <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (CMainFrame *)GetParent()-&gt;m_wndToolBar; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (CMainFrame *)GetParent()-&gt;m_wndStatusBar; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CStatusBar * pStatusBa=(CStatusBar*)AfxGetMainWnd()-&gt;GetDescendantWindow(AFX_IDW_STATUS_BAR); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CToolBar * pToolBar=(CtoolBar*)AfxGetMainWnd()-&gt;GetDescendantWindow(AFX_IDW_TOOLBAR); <br>Get View from Document <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetFirstViewPosition 和 GetNextView 函数得到指针。&nbsp; <p>MFC中获取窗口句柄及相关函数&nbsp; <p>首先,窗口句柄,在窗口类中直接使用成员变量m_hWnd,在窗口外最常见是用AfxGetMainWnd (获取主窗口指针,其成员变量m_hWnd为主窗口句柄): <p>HWND hWnd = AfxGetMainWnd()-&gt;m_hWnd; <p>与其相关的函数说明如下,这些函数对于获取窗口句柄非常有用: <p>GetTopWindow<br>函数功能:该函数检查与特定父窗口相联的子窗口z序(Z序:垂直屏幕的方向,即叠放次序),并返回在z序顶部的子窗口的句柄。<br>函数原型:HWND GetTopWindow(HWND hWnd);<br>参数:<br>  hWnd:被查序的父窗口的句柄。如果该参数为NULL,函数返回Z序顶部的窗口句柄。<br>返回值:<br>&nbsp;&nbsp;&nbsp; 如果函数成功,返回值为在Z序顶部的子窗口句柄。如果指定的窗口无子窗口,返回值为NULL。<br>GetForegroundWindow<br>函数功能:该函数返回当前系统的前台窗口的窗口句柄。<br>函数原型:HWND GetForegroundWindow(VOID)  <br>返回值:函数返回前台窗回的句柄。<br>☆☆☆ GetActiveWindow 获取当前窗口句柄 <p>函数功能:该函数可以获得与调用该方法的线程的消息队列相关的活动窗口的窗口句柄(就是取得当前进程的活动窗口的窗口句柄)。<br>函数原型:HWND GetActiveWindow(VOID)<br>返回值:返回值是与调用线程的消息队列相关的活动窗口的句柄。否则,返回值为NULL。<br>GetSafeHwnd<br>函数功能:获取某个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数。<br>通过下面的例子来看其理由:<br>  CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器 <p><b>[cpp]</b> <a href="http://blog.csdn.net/abcjennifer/article/details/7480019#">view plain</a><a href="http://blog.csdn.net/abcjennifer/article/details/7480019#">copy</a> <ol> <li>CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器 <li>HWND hwnd = pwnd-&gt;m_hwnd; //得到它的HWND</li></ol> <p>HWND hwnd = pwnd-&gt;m_hwnd; //得到它的HWND <p>  这样的代码当开始得到的pwnd为空的时候就会出现一个“General protection error”,并关闭应用程序,因为一般不能对一个NULL指针访问其成员,如果用下面的代码: <p><b>[cpp]</b> <a href="http://blog.csdn.net/abcjennifer/article/details/7480019#">view plain</a><a href="http://blog.csdn.net/abcjennifer/article/details/7480019#">copy</a> <ol> <li>CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器 <li>HWND hwnd = pwnd-&gt;GetSafeHwnd(); //得到它的HWND</li></ol> <p>就不会出现问题,因为尽管当pwnd是NULL时,GetSafeHwnd仍然可以用,只是返回NULL<br>IsWindowVisible<br>函数功能:该函数获得给定窗口的可视状态。<br>函数原型:BOOL IsWindowVisible(HWND hWnd);<br>参数;<br>  hWnd:被测试窗口的句柄。<br>返回值:<br>&nbsp;&nbsp;&nbsp; 如果指定的窗口及其父窗口具有WS_VISIBLE风格,返回值为非零;如果指定的窗口及其父窗口不具有WS_VISIBLE风格,返回值为零。由于返回值表明了窗口是否具有Ws_VISIBLE风格,因此,即使该窗口被其他窗口遮盖,函数返回值也为非零。<br>备注:<br>&nbsp;&nbsp;&nbsp; 窗口的可视状态由WS_VISIBLE位指示。当设置了WS_VISIBLE位,窗口就可显示,而且只要窗口具有WS_VISIBLE风格,任何画在窗口的信息都将被显示。<br>IsWindow:<br>函数功能:该函数确定给定的窗口句柄是否标示一个已存在的窗口。 <br>函数原型:BOOL IsWindow(HWND hWnd);<br>参数:<br>&nbsp;&nbsp;&nbsp; hWnd:被测试窗口的句柄。<br>返回值:<br>&nbsp;&nbsp;&nbsp; 如果窗口句柄标识了一个已存在的窗口,返回值为TURE;如果窗口句柄未标识一个已存在窗口,返回值为FALSE。 <p>FindWindow:<br>HWND FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName );<br>参数:<br>lpClassName <p>  指向一个以null结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子。如果这个参数是一个原子,那么它必须是一个在调用此函数前已经通过GlobalAddAtom函数创建好的全局原子。这个原子(一个16bit的值),必须被放置在lpClassName的低位字节中,lpClassName的高位字节置零。 <p>lpWindowName<br>  指向一个以null结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名。<br>返回值:<br>如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。 <p>  如果函数执行失败,则返回值为 NULL 。可以通过调用GetLastError函数获得更加详细的错误信息。 <p>来说个应用,窗口标题的改变,我们可以通过SetWindowText来实现: <p>注:如果窗口本身属性是不显示标题的,这个函数的调用不会影响窗口属性。 <p><b>[cpp]</b> <a href="http://blog.csdn.net/abcjennifer/article/details/7480019#">view plain</a><a href="http://blog.csdn.net/abcjennifer/article/details/7480019#">copy</a> <ol> <li>//Set title for application’s main frame window . <li>AfxGetMainWnd ( ) -&gt; SetWindowText (_T("Application title") )&nbsp;&nbsp; <li>//Set title for View’s MDI child frame window . <li>GetParentFrame ( ) -&gt; SetWindowText ("_T ("MDI Child Frame new title") )&nbsp;&nbsp; <li>//Set title for dialog’s push button control. <li>GetDigitem (IDC_BUTTON) -&gt; SetWindowText (_T ("Button new title ") )&nbsp; </li></ol> <p>MFC获取控件句柄 <p>SDI中的控件句柄获取: <p><b>[cpp]</b> <a href="http://blog.csdn.net/abcjennifer/article/details/7480019#">view plain</a><a href="http://blog.csdn.net/abcjennifer/article/details/7480019#">copy</a> <ol> <li>CWnd&nbsp;&nbsp; *pWnd&nbsp;&nbsp; =&nbsp;&nbsp; GetDlgItem(ID_***); // 取得控件的指针 <li>HWND hwnd = pWnd-&gt;GetSafeHwnd();&nbsp; // 取得控件的句柄</li></ol><pre></pre><pre>取得CDC的指针是CDC* pdc = pwnd-&gt;GetWindowDC();</pre> <p>MFC各类中获取类指针详解 <p>使用到的类需要包含响应的头文件。首先一般获得本类(视,文档,对话框都支持)实例指针 this,用this的目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在非本类中操作和使用本类中的功能。这其中的关键在于理解 m_pMainWnd,AfxGetApp(),AfxGetMainWnd()的意义!<br>1)在View中获得Doc指针<br>CYouSDIDoc *pDoc=GetDocument();一个视只能有一个文档。<br>2) 在App中获得MainFrame指针<br>CWinApp 中的 m_pMainWnd变量就是MainFrame的指针,也可以: CMainFrame *pMain =(CMainFrame*)AfxGetMainWnd();<br>3) 在View中获得MainFrame指针<br>CMainFrame *pMain=(CmaimFrame *)AfxGetApp()-&gt;m_pMainWnd;<br>4) 获得View(已建立)指针<br>CMainFrame *pMain=(CmaimFrame *)AfxGetApp()-&gt;m_pMainWnd;<br>CyouView *pView=(CyouView *)pMain-&gt;GetActiveView();<br>5) 获得当前文档指针<br>CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd-&gt;GetActiveDocument();<br>6) 获得状态栏与工具栏指针<br>CStatusBar * pStatusBar=(CStatusBar *)AfxGetMainWnd()-&gt;GetDescendantWindow(AFX_IDW_STATUS_BAR);<br>CToolBar * pToolBar=(CtoolBar*)AfxGetMainWnd()-&gt;GetDescendantWindow(AFX_IDW_TOOLBAR);<br>7) 如果框架中加入工具栏和状态栏变量还可以这样<br>(CMainFrame *)GetParent()-&gt;m_wndToolBar;<br>(CMainFrame *)GetParent()-&gt;m_wndStatusBar;<br>8) 在Mainframe获得菜单指针<br>CMenu *pMenu=m_pMainWnd-&gt;GetMenu();<br>9) 在任何类中获得应用程序类<br>AfxGetInstanceHandle 得到句柄,AfxGetApp得到指针<br>最后提醒大家,在提取到各个句柄之后,因为初次提取的都是标准类句柄,所以,在使用时要注意将标准句柄转换成自己的类的句柄。<br>如:<br>AfxGetApp();//得到的是WinApp类的句柄,<br>所以操作前记得转换成自己定义的类的句柄。<br>如:<br>((CMyApp*)AfxGetApp())-&gt;XXXX();//这的xxxx()就是你定义的类中间的成员。 <p>MSDN关于应用程序信息和管理的各个函数 <p>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.<br>The Microsoft Foundation Class Library provides the following global functionsto help you accomplish these tasks:<br>Application Information and Management Functions<br>AfxFreeLibrary<br>Decrements the reference count of the loaded dynamic-link library (DLL) module;when the reference count reaches zero, the module is unmapped.<br>AfxGetApp<br>Returns a pointer to the application's single CWinApp object.<br>AfxGetAppName<br>Returns a string containing the application's name.<br>AfxGetInstanceHandle<br>Returns an HINSTANCE representing this instance of the application.<br>AfxGetMainWnd<br>Returns a pointer to the current "main" window of a non-OLEapplication, or the in-place frame window of a server application.<br>AfxGetResourceHandle<br>Returns an HINSTANCE to the source of the application's default resources. Usethis to access the application's resources directly.<br>AfxInitRichEdit<br>Initializes the version 1.0 rich edit control for the application.<br>AfxInitRichEdit2<br>Initializes the version 2.0 and later rich edit control for the application.<br>AfxLoadLibrary<br>Maps a DLL module and returns a handle that can be used to get the address of aDLL function.<br>AfxRegisterWndClass<br>Registers a Windows window class to supplement those registered automaticallyby MFC.<br>AfxSocketInit<br>Called in a CWinApp::InitInstance override to initialize Windows Sockets.<br>AfxSetResourceHandle<br>Sets the HINSTANCE handle where the default resources of the application areloaded.<br>AfxRegisterClass<br>Registers a window class in a DLL that uses MFC.<br>AfxBeginThread<br>Creates a new thread.<br>AfxEndThread<br>Terminates the current thread.<br>AfxGetThread<br>Retrieves a pointer to the current CWinThread object.<br>AfxWinInit<br>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. <p>Reference: <p>1. <a href="http://www.cppblog.com/eday/archive/2006/11/18/15375.html">http://www.cppblog.com/eday/archive/2006/11/18/15375.html</a> <p>2. <a href="http://support.microsoft.com/KB/141003">http://support.microsoft.com/KB/141003</a> <p>3. <a href="http://blog.csdn.net/zhifeiya/article/details/7402667">http://blog.csdn.net/zhifeiya/article/details/7402667</a></p>

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

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

  1. c语言 取窗口句柄,MFC获取句柄的方法

    句柄获取方法(获取该窗口的句柄后,即可向该窗口类类发送消息.处理程序): 例如:::PostMessage("句柄", WM_USER_DRAWVIEWPIC_EDS, 0, 0) ...

  2. MFC中的CString类使用方法指南

    MFC中的CString类使用方法指南 原文出处:codeproject:CString Management [禾路:这是一篇比较老的资料了,但是对于MFC的程序设计很有帮助.我们在MFC中使用字符 ...

  3. 【.NET】C#中遍历各类数据集合的方法

    C#中遍历各类数据集合的方法,这里自己做下总结: 1.枚举类型              // 遍历枚举类型Sample的各个枚举名称              foreach  ( string   ...

  4. LabVIEW读写各类格式图像的方法(基础篇—1)

    目录 1.读写各类格式图像的方法 1.1.LabVIEW集成图像读写函数 1.2.Nl Vision图像读写函数 2.小试牛刀 图像数据被采集至内存缓冲区后,机器视觉软件即可对其施加各种图像预处理.图 ...

  5. linux c 文件指针 句柄(FILE*) 文件描述符(fd) 文件路径(filepath) 互相转换

    最近在linux下编程常需要对一些文件进行操作.有时不同的条件下,需要将文件指针/句柄(FILE*).文件描述符(fd)以及文件路径(filepath)进行相互转换,以满足实际的编程需要. 现简单的做 ...

  6. 明显调用的表达式前的括号必须具有指针函数类型_基于指针对象的方法

    " 本文来源于<The Go Programming Language>" 6.2. 基于指针对象的方法 当调用一个函数时,会对其每一个参数值进行拷贝,如果一个函数需要 ...

  7. C++智能指针使用指南 part2:智能指针本身的方法以及使用建议

    目录 往期文章 智能指针本身的方法 对于unique_ptr 对于shared_ptr 对于weak_ptr 使用建议 1.使用工厂函数而非new构造对象 2.在类内部调用其他类的方法 3.在某类内部 ...

  8. 深度学习推荐系统中各类流行的Embedding方法

    Embedding技术概览: 对其它Embedding技术不熟悉,可以看我的上一篇文章:深度学习推荐系统中各类流行的Embedding方法(上) Graph Embedding简介 Word2Vec和 ...

  9. linux+守护进程+php,【转载】Linux 守护进程的编程方法

    [转载]Linux 守护进程的编程方法 原文见: http://www.linuxdevelop.org/tingxx/show.php?table=c&id=3 Linux 守护进程的编程方 ...

最新文章

  1. swift 字符串中查找字符位置
  2. 流程审批OA办公系统解决财务报销等问题
  3. java i 什么时候变_Java中i++与++i的区别(效率分析)
  4. 【学亮IT手记】PL/SQL编程-存储过程
  5. hibernate Criteria(条件查询接口)
  6. 做了一个RAID 5 10块盘的试验
  7. python中字符串:声明、编码、函数、格式化
  8. 总结目前做得好的新实体店,大致有如下几点
  9. [转载] java接口中方法的默认访问修饰符为public
  10. ADT(Android) — Eclipse开发NOX夜神安卓模拟器如何进行横竖屏切换
  11. VS2010与.NET4系列 19.ASP.NET4中新的HTML编码的%: %语法
  12. 拓端tecdat|Matlab用深度学习长短期记忆(LSTM)神经网络对文本数据进行分类
  13. 用DISKGEN恢复硬盘数据
  14. 最新版黑苹果MacOS 10.14 Mojave安装教程
  15. 华为防火墙配置IPSEC实现二个站点间网络互通 隧道模式 CLI配置 (三)
  16. 学习java的第十九天,static关键字、隐匿代码块的学习
  17. 取消大小周易,取消周报难
  18. 操作系统-页面置换算法
  19. HTML5相册,网页,模板,微信,制作,
  20. 程序员口中常说的“组件”是什么?简洁易懂

热门文章

  1. php 自动创建文件,php:自动创建多级文件夹
  2. 在显著性区域外画矩形框matlab,Matlab实验报告样板
  3. Typecho程序伪静态规则大全(包括Linux/Windows
  4. 西门子S7以太网通讯协议
  5. npm全局安装失效修复
  6. FreeMarker手册pdf
  7. Swift - 选择框(UIPickerView)的用法
  8. 【设计和算法分析】3、二进制搜索
  9. 【入门经典】创建站点地图
  10. ASP.NET操作文件大全