zoukankan      html  css  js  c++  java
  • MFC获取各个窗体(体)之间的指针(对象)

    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

  • 相关阅读:
    转载:Cgroups 与 Systemd
    转载:linux cgroups 简介
    深入剖析Linux IO原理
    Tomcat zabbix监控、jmx监控、zabbix_java_gateway
    Tomcat 打开jmx
    vsftp、ftps 搭建
    Tomcat 调优
    Tomcat 部署及配置
    SVN 搭建
    Nginx 编译安装
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5061599.html
Copyright © 2011-2022 走看看