热门标签 | 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


推荐阅读
  • 第一步:PyQt4Designer设计程序界面该部分设计类同VisvalStudio内的设计,改下各部件的objectName!设计 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • C#DataGridView控件中数据导出到Excel方法一:usingSystem;usingSystem.Collections.Generic;usingSys ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
  • VS2010MFC(对话框:为对话框添加控件)
    转自:http:www.jizhuomi.comsoftware151.html上一讲创建了一个名为“Addition”的工程,目的是生成一个实现加法运 ... [详细]
  • ExcelApp#启动excel程序ExcelAppCreateOleObject(“Excel.Application”);#加载文件但不显示文件内容(true表 ... [详细]
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社区 版权所有