转自:https://blog.csdn.net/lihui126/article/details/43340695

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的目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在非本类中操作和使用本类中的功能。
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);
(CMainFrame *)GetParent()->m_wndToolBar;
(CMainFrame *)GetParent()->m_wndStatusBar;
CMenu *pMenu=m_pMainWnd->GetMenu();
9) 在任何类中获得应用程序类
AfxGetInstanceHandle 得到句柄,AfxGetApp 得到指针
SDI AfxGetMainWnd() -> GetActiveView() -> GetDocument() 得到指针
MDI AfxGetMainWnd() -> MDIGetActive() -> GetActiveView() -> GetDocument() 得到指针
B3.如何在“框架类”中获得“文档类”句柄?
SDI GetActiveView() -> GetDocument() 得到指针,MDI MDIGetActive() -> GetActiveView() -> GetDocument() 从 CMainFrame 得到指针,GetActiveView() -> GetDocument() 从 CChildFrame 得到指针
B4.如何在“视图类”中获得“文档类”句柄?
GetDocument()
GetView(),调用 GetFirstViewPosition 和 GetNextView 函数得到指针。
C2.如何在自己的类和“应用程序类”中获得“视图类”句柄?
SDI GetActiveView 得到指针
MDI MDIGetActive() -> GetActiveView() 从 CMainFrame 得到指针,GetActiveView 从 CChildFrame 得到指针
最后提醒大家,在提取到各个句柄之后,因为初次提取的都是标准类句柄,所以,在使用时要注意将标准句柄转换成自己的类的句柄。如:
AfxGetApp();//得到的是WinApp类的句柄,
所以操作前记得转换成自己定义的类的句柄。
如:((CMyApp*)AfxGetApp())->XXXX();//这的xxxx()就是你定义的类中间的成员。
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;
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));

附注:获得窗口句柄三种方法
本文来自CSDN博客:http://blog.csdn.net/cy757/archive/2009/08/07/4423756.aspx
      (1) 一般窗口对象都会有一个其对应的句柄变量,所以我们可以取此对象的m_hWnd属性来得到句柄。
      (2)使用GetSafeHwnd函数取得程序所在窗口类的句柄
      (3)使用FromHandle函数来通过句柄得到其想要的指针
      其他的一些方法:
      GetActiveWindow 取当前活动窗口句柄
      AfxGetMainWnd   取主窗口句柄
      GetForegroundWindow 取前台窗口句柄
      FindWindow寻找参数指定的窗口
      EnumWindow枚举窗口
      (1)this->m_hDC
      (2)CDC::GetSafeHdc
      (3)可以使用FromHandle函数来通过句柄得到其想要的指针
      (1)this->m_hObject
      (2)CGdiObject::GetSafeHandle
      (3)可以使用FromHandle函数来通过句柄得到其想要的指针

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

1) 在View中获得Doc指针

7) 如果框架中加入工具栏和状态栏变量还可以这样

8) 在Mainframe获得菜单指针

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

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

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

win32直接操作的是句柄HANDLE,每个句柄就对应windows窗口,而vc对HANDLE进行类封装,间接操作的都是HANDLE,现在句柄只是类的一个成员变量。

从句柄到指针

从指针到句柄

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

1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)

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

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

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

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

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

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

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

MFC中获取各个窗口(对话框)之间的指针、对象、句柄相关推荐

  1. MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置

    在MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置: CRect  r; pWnd->GetWindowRect(&r); 这样获得的r是控件相对于屏幕的坐标,然后用Scre ...

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

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

  3. 修改MFC中AfxMessageBox()函数的对话框标题

    修改MFC中AfxMessageBox()函数的对话框标题 如何在MFC中修改AfxMessageBox()函数所弹出的对话框标题,步骤如下: 1.找到项目工程的资源视图,打开.rc资源文件下的Str ...

  4. html中获取浏览器窗口宽度,JavaScript 获取浏览器窗口的大小

    简明现代魔法 -> JavaScript -> JavaScript 获取浏览器窗口的大小 JavaScript 获取浏览器窗口的大小 2010-04-16 程序演示: 获取浏览器当前窗口 ...

  5. java memcached 存储对象_java – 从Memcache中获取低级别数据存储区实体对象时的慢速反序列化...

    事实证明,检索存储内存缓存的低级数据存储实体非常缓慢.由于objectify将实体缓存为低级数据存储区实体类型,因此当使用objectify从memcache中获取许多实体时,这会导致性能不佳. 真正 ...

  6. MFC中获取任务栏大小

    MFC怎么获得当前屏幕大小 你可以这样 HWND hwnd=GetDesktopWindow(); RECT rect; GetClientRect(hwnd,&rect);//可以得到桌面大 ...

  7. 在qt中获取halcon窗口图片_Qt联合HALCON显示文件夹图片及初步处理

    1.先上图 2.头文件 1 #ifndef MAINWINDOW_H2 #define MAINWINDOW_H 3 4 #include 5 #include 6 #include 7 #inclu ...

  8. MFC中获取TimeStamp的简要方法

    1.获取精确到秒的TimeStamp(10位) SYSTEMTIME sysTime;::GetLocalTime(&sysTime); CTime curTime(sysTime);__in ...

  9. MFC中获取指定打印机的打印队列的方法

    void CPrintListTestDlg::OnBnClickedButton1() {GetDlgItem(IDC_TxtList)->SetWindowText(L"" ...

  10. MFC中如何给子对话框添加图标

    1.先打开类向导为子对话框添加OnInitDialog()成员虚函数 2.子对话框属性中选中style->Title bar改为true 3.导入对应的图标到文件中: 4.在子对话框OnInit ...

最新文章

  1. 动态sql语句输出参数
  2. Clion this file does not belong to any project target问题解决方案
  3. linux c代码出现段错误,Linux下段错误(C语言)
  4. glide 加载webp_如何使您的网站通过WebP图像快速加载闪电
  5. 大学c语言作业网站,西北农林科技大学c语言作业
  6. linux下ftp权限控制
  7. 论文阅读SG-PBFT: a Secure and Highly Efficient Blockchain PBFT Consensus Algorithm for IoV
  8. 判断闰年简单逻辑运算符
  9. 怎么禁用笔记本的键盘
  10. ThinkPad E430 选择U盘启动后又跳回选择画面
  11. 双绞线的制作方式详解
  12. js中Error对象
  13. YUV_420_888数据裁剪
  14. 2022-2028年全球与中国汽车超声波传感器行业深度分析
  15. 刀片服务器的机箱显示器,刀片服务器机箱如何配置网络交换器端口
  16. matlab行向量,列向量
  17. @keyframes详解与实例
  18. JavaScript学习之路(WebAPIs阶段)
  19. Python编程知识点总结
  20. 前端获取页面的高度/宽度

热门文章

  1. python遍历目录压缩文件夹_zip包含一个档案文件夹,如何使用Python获取存档中每个zip的注释?...
  2. python中randint用法_python中的randint,引入模块
  3. linux root身份执行命令,用root的身份去执行一个命令
  4. 铺铜规则在哪设定_干货丨PCB layout结合生产设计必须遵循这六大规则!
  5. mac vi快速删除_Mac下Vim编辑快捷键小结
  6. php中加载图片淡入淡出,jQuery做出图片滚动淡入淡出
  7. 脚本文件不变色_LoadRunner脚本开发
  8. leetcode·双指针
  9. Java NIO学习与记录(七): Reactor单线程模型的实现
  10. 如何把DEBIAN变成UBUNTU-DESKTOP最少化安装