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

如:CEpdscDlg* pdlg=(CEpdscDlg*)CWnd::FromHandle(myhwnd);//这样就获得了对话框资源的指针;使用初始化实例GI()->只能对非控件变量作用。
pdlg->UpdateBranchName(cur,newname);
指针->ID       id = GetWindowLong(pWnd->GetSafeHwnd,GWL_ID);
                                            GetDlgCtrlID();
指针->句柄     hWnd=cWnd.GetSafeHandle() or mywnd->m_hWnd;

指针的使用在编程过程中至关重要,恰到好处并能正确无误的使用指针不但能够提高程序自身的运行效率,而且有助于节省程序执行所需要消耗的资源。指针对应着某个数据在内存空间中的地址,得到了指针就可以自由地修改该数据。句柄代表指针的“指针”,也可以将其比作表中数据项的索引值( 表对应某个进程自身的内存空间 )。句柄是间接的引用对象。

指针和句柄的不同之处

  • 句柄所指的可以是一个很复杂的结构,并且很有可能与系统有关的,比如上面所说 线程的句柄,它指向的就是一个类或者结构,它和系统有很密切的关系。当一个线程由于不可预料的原因而终止时,系统就可以通过句柄来回收它所占用的资料,如 CPU,内存等等。反过来想,这些句柄中的某一些,是与系统进行交互用的。
  • 指针它也可以指向一个复杂的结构,但通常是由用户自我定义的,所以一些必需的工作都要由用户自己完成,特别是在删除的时候。
  • 另外需要注意的是句柄往往有自己的存在区限,比如一个进程,如果将其传递到另一个进程中,句柄也就失去了意义( 表中数据项的索引值,索引离开了具体的表也就失去了意义 )。

具体转换

( 句柄转为指针 )

CWnd* pWnd=FromeHandle(hMyHandle); 
        pWnd->SetWindowText("Hello World!");

or

CWnd* pWnd; 
        pWnd->Attach(hMyHandle);

MFC类中有的还提供了标准方法,比如Window句柄:

static CWnd* PASCAL FromHandle( 
        HWND hWnd 
        ); 
        HWND GetSafeHwnd( ) const;

对于位图: 
        static CBitmap* PASCAL FromHandle( 
       HBITMAP hBitmap 
         );  
         static CGdiObject* PASCAL FromHandle( 
       HGDIOBJ hObject 
         ); 
        HGDIOBJ GetSafeHandle( ) const;

当然,更详细的信息需要在具体使用中自我查询。

建 议:指针和句柄的使用属于比较复杂、危险性较高的应用,在具体实践中,如果可以,尽量不要使用指针和句柄,最好选择现有的、封装完好的方式来实现,更别提指针同句柄的转换了,它更加危险。

比如在操作字符串时,尽量使用CString类来实现,通过定义好的构造、析构函数来完成分配和回收,最好不要通过指针来动态操作。

GetDlgItem(资源ID)

不过这个方法如果这个对话框还没建立好,传过来的指针会有问题

VC中窗口ID,句柄,指针三者相互转换函数【转】的更多相关文章

  1. VC中获取窗体句柄的各种方法

    AfxGetMainWnd AfxGetMainWnd获取自身窗体句柄 HWND hWnd = AfxGetMainWnd()->m_hWnd; GetTopWindow 函数功能:该函数检查与 ...

  2. java中String\十六进制String\byte[]之间相互转换函数

    java二进制,字节数组,字符,十六进制,BCD编码转换2007-06-07 00:17/** *//** * 把16进制字符串转换成字节数组 * @param hex * @return */ pu ...

  3. VC中句柄、指针、ID之间的转换

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

  4. VC中实现带有背景位图的树型控件

    当前许多应用程序都在使用树型控件时为其添加了背景位图,增强的控件的魅力,然而对于Visual C++编程爱好者来说,使用Visual C++MFC提供的树型控件(CTreeCtrl)本身就是一个难点, ...

  5. VC++中有关句柄和指针及其转换(转)

    原文转自 https://blog.csdn.net/jearmy/article/details/47030011 1.MFC窗口的句柄和指针的转换 (1) 一般窗口对象都会有一个其对应的句柄变量, ...

  6. VC++的窗口句柄和窗口ID

    原文地址:VC++的窗口句柄和窗口ID作者:放放 句柄是窗口资源的标识,它标识资源在系统中所占用的内存块,应用程序通过窗口句柄对窗口进行操作.除了窗口句柄之外,任何一种资源都有它自己的句柄,比如光标句 ...

  7. VC++中使用用户自定义消息及自定制窗口技巧

    Windows 应用程序所要做的每项工作几乎都是基于消息处理的, Windows 系统消息分为常用 Windows 消息,控件通知消息和命令.然而,有时我们需要定义自己的消息来通知程序什么事情发生了, ...

  8. ATL和vc++中的智能指针(分别是CComPtr和_com_ptr_t)

    一.智能指针的概念 智能指针是一个类,不是指针,智能指针在所包含的指针不再被使用时候会自动释放该所包含指针所占用的系统资源,而不用手动释放. 原理:智能指针封装了包含指针的AddRef()函数和Rel ...

  9. 深度解析VC中的消息传递机制

    摘要:Windows编程和Dos编程,一个很大的区别就是,Windows编程是事件驱动,消息传递的.所以,要学好Windows编程,必须 对消息机制有一个清楚的认识,本文希望能够对消息的传递做一个全面 ...

随机推荐

  1. Css3抖动

    http://files.cnblogs.com/xinlinux/csshake.min.css <div class="shake">AAA</div> ...

  2. SuperMap

    SuperMap iClient for JavaScript 新手入门 地理信息系统(英语:Geographic Information System,缩写:GIS)是一门综合性学科,结合地理学与地 ...

  3. Scala学习笔记--文件IO

    补充: http://blog.csdn.net/lyrebing/article/details/20369445 http://developer.51cto.com/art/200907/134 ...

  4. 桌面上嵌入窗口(桌面日历)原理探索(将该窗口的Owner设置成桌面的Shell 窗口,可使用SetWindowLong更改窗口的GWL_HWNDPARENT,还要使用SetWindowPos设置Z-Order)

    今天在QQ群里有人问怎样实现将自己的窗口嵌入桌面,让它和桌面融为一体,就像很多桌面日历软件那样. 我当时想到的就是建立一个Child  Window,将他的父窗口设置成桌面Shell窗口就可以了.但是 ...

  5. Manage Spring Boot Logs with Elasticsearch, Logstash and Kibana

    下载地址:https://www.elastic.co/downloads When time comes to deploy a new project, one often overlooked ...

  6. js深入研究之无法理解的js类代码,extend扩展

    <script type="text/javascript"> function Person(name) { this.name = name; } Person.p ...

  7. BZOJ1638: [Usaco2007 Mar]Cow Traffic 奶牛交通

    1638: [Usaco2007 Mar]Cow Traffic 奶牛交通 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 571  Solved: 199 ...

  8. c#秒转时分秒

          2个办法 @{             int hour = item.track / 3600;             int min = (item.track - hour * 3 ...

  9. 批量更新sql |批量update sql

    图所示现需要批量更新table2表内字段Pwd更新userName对IP地址username与Ip对应关系table1所示 update table2 set pwd=table1.ip from t ...

  10. 潘石屹的SOHO小报猝死

    东莞时报多媒体数字报刊平台 潘石屹的SOHO小报猝死