MFC在非常多的对话框操作中,我们常常要用到在一个对话框中调用还有一个对话框的函数或变量.能够用例如以下方法来解决.

   HWND hWnd=::FindWindow(NULL,_T("Sphere"));      //得到对话框的句柄

   C***Dialog* pWnd= (C***Dialog*)C***Dialog::FromHandle(hWnd); //由句柄得到对话框的对象指针

   pWnd->xxx( );   //调用C***Dialog中的函数xxx();

以上參考:http://www.cnblogs.com/del/archive/2008/02/28/1085432.html。


通过窗体类函数:CWnd *GetWindow获得窗体指针,pWnd->m_hWnd(The handle of the Windows window attached to this CWnd)在::FromHandle(hWnd);

获取主窗体句柄:  
   CWnd *wnd  = AfxGetMainWnd();
                     HWND hwnd = wnd->GetSafeHwnd();

设置控件为窗体焦点:GetDlgItem(IDC_TREE1)->SetFocus();

获取控件句柄:HWND hwndctrl = ::GetDlgItem(mainHwnd,
IDC_TREE1);//获取树形控件的句柄IDC_TREE
IDC_COMBO1

获取当前最上层窗体的句柄:
HWND  mainHwnd = ::GetForegroundWindow();//获取当前topmost的窗体句柄
获取当前窗体的焦点句柄:        HWND 
currentFocus = ::GetFocus();

(一)MFC中获得各个类的句柄总结 

 
  VC中编程。最大的障碍和问题就是消息机制和指针获取与操作。事实上这些内容基本上是每本VC学习工具书上
必讲的内容,并且通过MSDN非常多问题都能解决。下面文字主要是个人在编程中指针使用的一些体会。说的不当的地方请指正。一般我们使用的框架是VC提供的Wizard生成的MFC
App Wizard(exe)框架,不管是多文档还是单文档,都存在指针获取和操作问题。

以下这节内容主要是一般的框架。然后再讲多线程中的指针使用。使用到的类须要包括响应的头文件。首先一般获得本类(视,文档。对话框都支持)实例指针this,用this的目的,主要能够通过类中的函数向其它类或者函数中发指针,以便于在非本类中操作和使用本类中的功能。

这当中的关键在于理解 m_pMainWnd, AfxGetApp(),AfxGetMainWnd() 的意义!

1) 在View中获得Doc指针

CYouSDIDoc *pDoc=GetDocument();一个视仅仅能有一个文档。

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();

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) 在不论什么类中获得应用程序类

AfxGetInstanceHandle 得到句柄,AfxGetApp 得到指针

B1.怎样在自己的类和“应用程序类”中获得“文档类”的句柄?

SDI AfxGetMainWnd() -> GetActiveView() -> GetDocument() 得到指针

MDI AfxGetMainWnd() -> MDIGetActive() -> GetActiveView() -> GetDocument() 得到指针

B3.怎样在“框架类”中获得“文档类”句柄?

SDI GetActiveView() -> GetDocument() 得到指针。MDI MDIGetActive() -> GetActiveView() -> GetDocument() 从 CMainFrame 得到指针,GetActiveView() -> GetDocument() 从 CChildFrame 得到指针

B4.怎样在“视图类”中获得“文档类”句柄?

GetDocument()

C1.怎样在“文档类”中获得“视图类”句柄?

GetView()。调用 GetFirstViewPosition 和 GetNextView 函数得到指针。

C2.怎样在自己的类和“应用程序类”中获得“视图类”句柄?

SDI GetActiveView 得到指针

MDI MDIGetActive() -> GetActiveView() 从 CMainFrame 得到指针,GetActiveView 从 CChildFrame 得到指针

最后提醒大家。在提取到各个句柄之后。由于初次提取的都是标准类句柄,所以,在使用时要注意将标准句柄转换成自己的类的句柄。

如:

AfxGetApp();//得到的是WinApp类的句柄。

所以操作前记得转换成自定义的类的句柄。

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

(二)MFC中句柄、指针、ID之间的转换

win32直接操作的是句柄HANDLE。每一个句柄就相应windows窗体,而vc对HANDLE进行类封装,间接操作的都是HANDLE,如今句柄仅仅是类的一个成员变量。

从句柄到指针 

CWnd* pWnd=CWnd::FromHandle(hWnd); //a temporary CWnd object is created //and attached. 

pWnd->Attach(hWnd); //Attaches a Windows window to a CWnd object

从指针到句柄 

HWND hWnd=pWnd->GetSafeHandle(); 

hWnd=pWnd->m_hWnd;

SDK编程中窗体ID。句柄,指针三者相互转换函数 

ID--HANDLE--HWND三者之间的互相转换 

id->句柄-----------hWnd = ::GetDlgItem(hParentWnd,id); 

id->指针-----------CWnd::GetDlgItem(); 

句柄->id-----------id = GetWindowLong(hWnd,GWL_ID); 

句柄->指针--------CWnd *pWnd=CWnd::FromHandle(hWnd); 

指针->ID----------id = GetWindowLong(pWnd->GetSafeHwnd,GWL_ID); 

GetDlgCtrlID(); 

指针->句柄--------hWnd=cWnd.GetSafeHandle() or mywnd->m_hWnd;

HICON->ID--------HICON hIcon = AfxGetApp()->LoadIcon(nIconID);

                        HICON hIcon = LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(nIconID));

附注:获得窗体句柄三种方法

1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)

HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)

2.HWND WindowFromPoint(POINT& Point)//获得当前鼠标光标位置的窗体HWND

本文来自CSDN博客:http://blog.csdn.net/cy757/archive/2009/08/07/4423756.aspx

VC++中有关句柄和指针及其转换

1.MFC窗体的句柄和指针的转换

      (1) 一般窗体对象都会有一个其相应的句柄变量,所以我们能够取此对象的m_hWnd属性来得到句柄。

      (2)使用GetSafeHwnd函数取得程序所在窗体类的句柄

      (3)使用FromHandle函数来通过句柄得到其想要的指针

      其它的一些方法:

      GetActiveWindow 取当前活动窗体句柄

      AfxGetMainWnd   取主窗体句柄

      GetForegroundWindow 取前台窗体句柄

      FindWindow寻找參数指定的窗体

      EnumWindow枚举窗体

2. 上下文无关设备的句柄和指针的转换

      (1)this->m_hDC

      (2)CDC::GetSafeHdc 

      (3)能够使用FromHandle函数来通过句柄得到其想要的指针

3.Gdi对象的句柄和指针的转换

      (1)this->m_hObject

      (2)CGdiObject::GetSafeHandle

      (3)能够使用FromHandle函数来通过句柄得到其想要的指针

4.窗体、控件的指针和句柄的相互转化

(1)指针转化为句柄

在MFC应用程序中首先要获得窗体的指针,然后将其转化为句柄

CWnd* pWnd;

HANDLE hWnd = pWnd->GetSafeHwnd();

(2)句柄转化为指针

在MFC应用程序中首先获得对话框控件的句柄。然后获得其指针

HANDLE hWnd;

GetDlgItem(IDC_xxx,&hWnd);

CWnd * pWnd = FromHandle(hWnd);

获得程序窗体指针的办法

(1)获得主框架窗体指针(不论什么时候都能够用,仅仅要是MFC程序中)

CWnd* pWnd = AfxGetMainWnd();

(2)获得对话框中控件指针

CWnd* pWnd = GetDlgItem(IDC_xxx);

(3)获得对话框中某控件的句柄

HANDLE GetDlgItem(m_hDLG,m_nID_DlgItem);

(4)获得GDI对象的句柄

HANDLE m_hGDIObj = m_pGDIObj->GetSafeHanle();

本文来自CSDN博客:http://blog.csdn.net/lovegod12/archive/2009/04/19/4092249.aspx

MFC中获取各个窗口之间的句柄或者指针对象的方法的更多相关文章

  1. MFC中的主窗口修改标题

    MFC中的主窗口修改标题 如何去掉“无标题”1.在主程序中的InitInstance(): m_pMainWnd->SetWindowText("你要显示的东西如果不想显示置空就行&q ...

  2. MFC中获取App,MainFrame,Doc和View类等指针的方法

    From: http://hi.baidu.com/wxnxs/item/156a68f5b3b4ed18e3e3bd03   MFC中获取App,MainFrame,Doc和View类等指针的方法 ...

  3. 在MFC中添加OpenGL窗口

    虽然MFC已经落伍好多年,而且用来做界面非常的不好用...但是我既不会C#也不会QT,又需要使用OpenGL,就只能将就用了...   一.首先介绍Windows图像程序设计中几个重要的概念:   G ...

  4. VC中窗口ID,句柄,指针三者相互转换函数【转】

    ID--HANDLE--HWND三者之间的互相转换id->句柄        hWnd = ::GetDlgItem(hParentWnd,id);id->指针        CWnd:: ...

  5. WinForm 中两个窗口之间传递数据

    方法有很多种,这里介绍项目中使用的两种 一.通过委托+事件的方法进行传值 (点击Form2中的button1按钮,将会把Form2中的textbox.text 传给Form1中的 lable.text ...

  6. Android Studio中获取查看签名SHA1证书指纹数据或MD5的方法

    原来在Eclipse中获取SHA1或者MD5,在IDE界面上就可以查找到. 切换到Android Studio后,如何查看呢?找了半天没找到.那就老办法命令行. 第一步.打开Android Studi ...

  7. Java中获取项目根路径和类加载路径的7种方法

    引言 在web项目开发过程中,可能会经常遇到要获取项目根路径的情况,那接下来我就总结一下,java中获取项目根路径的7种方法,主要是通过thisClass和System,线程和request等方法. ...

  8. MFC中获取指针的方法

    1.获取应用程序指针 CMyApp* pApp=(CMyApp*)AfxGetApp(); 2.获取主框架指针 CWinApp 中的公有成员变量 m_pMainWnd 就是主框架的指针 CMainFr ...

  9. MFC中无标题栏窗口的移动

    原文链接: http://blog.sina.com.cn/s/blog_6288219501015dwa.html   移动标准窗口是通过用鼠标单击窗口标题条来实现的,但对于没有标题条的窗口,就需要 ...

随机推荐

  1. 【大视野入门OJ】1099:歌德巴赫猜想

    Description 歌德巴赫猜想大家都很熟悉吧?给一个数,能够分解成两个素数的和.现在要给你一个n,6 <= n < 1000000,让你求他会分解成哪两个素数?如果存在多组解,则要求 ...

  2. [P4064][JXOI2017]加法(贪心+树状数组+堆)

    题目描述 可怜有一个长度为 n 的正整数序列 A,但是她觉得 A 中的数字太小了,这让她很不开心. 于是她选择了 m 个区间 [li, ri] 和两个正整数 a, k.她打算从这 m 个区间里选出恰好 ...

  3. 【jzyzoj】【p1320 patrol】 巡逻(网络流最小割例题)

    描述 Description FJ有个农场,其中有n块土地,由m条边连起来.FJ的养牛场在土地1,在土地n有个新开张的雪糕店.Bessie经常偷偷溜到雪糕店,当Bessie去的时候,FJ就要跟上她.但 ...

  4. C++中的读入输出优化及清新脱俗的宏命令

    C和C++有了#define,从此它就变了模样 宏命令就是#define,#if,#error之类的 本文主要介绍宏命令和相关的骚操作 读入输出优化 inline int read() { int a ...

  5. 【二分】Codeforces Round #404 (Div. 2) C. Anton and Fairy Tale

    当m>=n时,显然答案是n: 若m<n,在第m天之后,每天粮仓减少的量会形成等差数列,只需要二分到底在第几天,粮仓第一次下降到0即可. 若直接解不等式,可能会有误差,需要在答案旁边扫一下. ...

  6. (原创)Stanford Machine Learning (by Andrew NG) --- (week 7) Support Vector Machines

    本栏目内容来源于Andrew NG老师讲解的SVM部分,包括SVM的优化目标.最大判定边界.核函数.SVM使用方法.多分类问题等,Machine learning课程地址为:https://www.c ...

  7. subline text 常用插件

    C语言 Alignment   c Improved   cool format doc Blocker   cTags   AllAutoComplete       wakatime 精确统计你再 ...

  8. RACLE 错误 12899 处理, oracle 11g 更改字符集

    工作需要,安装装了oracle 11g,在导入其他机器上的备份数据的时间,发生一个错误: IMP-00019: 由于 ORACLE 错误 12899 而拒绝行IMP-00003: 遇到 ORACLE ...

  9. java nio最白话理解

    JAVA NIO是同步非阻塞io.同步和异步说的是消息的通知机制,阻塞非阻塞说的是线程的状态 .下面说说我的理解,client和服务器建立了socket连接:1.同步阻塞io:client在调用rea ...

  10. Android 卡顿优化 2 渲染优化

    1.概述 2015年初google发布了Android性能优化典范,发了16个小视频供大家欣赏,当时我也将其下载,通过微信公众号给大家推送了百度云的下载地址(地址在文末,ps:欢迎大家订阅公众号),那 ...