zoukankan      html  css  js  c++  java
  • ID、句柄、指针、对象互相转换

    /*********************************************************************************************************************
    *   发布日期:
    *   更新日期:2017-11-15 09:56:27
    *   进度:
    *   作者:骆天
    *   备注:
    *********************************************************************************************************************/

    一、概述

    HINSTANCE是应用程序实例句柄
    HWND是窗口对象句柄
    HANDLE是任意对象的句柄
    CWnd是MFC中的窗口类。

    一般我们使用的框架是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) 在任何类中获得应用程序类

    三、句柄、ID、指针三者之间的转换

    句柄用于与别的程序进行沟通,指针用于自身。

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

    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);
    指针->ID————ID = GetDlgCtrlID();


    指针->句柄————hWnd=cWnd.GetSafeHandle() ;
    指针->句柄————pWnd->m_hWnd;


    以下是实例
    HWND hwndMain = CreateWindow( "GenericAppClass", //建了一个窗口,就有句柄了
    "Super Video",
    WS_POPUP,
    0,
    0,
    500,
    500,
    NULL,
    NULL,
    hInstance,
    NULL
    );
    CWnd* Wnd=new CWnd;
    Wnd->Attach(hwndMain);   //Wnd就是你通过句柄hwndMain得到的指针

    hwndMain=Wnd->Detach();    //通过指针求句柄


    CWnd *mywnd=new CWnd;
    mywnd->Create(_T("STATIC"), "", WS_CHILD | WS_VISIBLE,CRect(0, 0, 400, 400), this, 1234);
    mywnd->m_hWnd;      //对象里的m_hWnd成员数据中就是这个窗口的句柄


    由ID获得指针

    CWnd*p=GetDlgItem(ID,parent);  //parent为父窗口

    由指针获得ID

    int ID=p->GetDlgCtrlID();//指向当前控件的指针p去获取所指向控件的ID号

    由指针获得句柄

    p->m_hWnd

  • 相关阅读:
    你真的会用Android的Dialog吗?由一个Exception想到的
    请慎用java的File#renameTo(File)方法
    Android核心分析(16)Android电话系统概述篇
    java.lang.UnsupportedOperationException
    fastboot 刷新 system.img 出现 data too large 错误
    Android是什么 之三手机之硬件形态
    快速重建system.img
    Android 核心分析 之五 基本空间划分
    Android核心分析之四 手机的软件形态
    Android核心分析(15)Android输入系统之输入路径详解k
  • 原文地址:https://www.cnblogs.com/tinaluo/p/7362342.html
Copyright © 2011-2022 走看看