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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
VC中窗口ID,句柄,指针三者相互转换函数
2009-05-30 13:53

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;  

 

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

        指针和句柄的不同之处

  • 句柄所指的可以是一个很复杂的结构,并且很有可能与系统有关的,比如上面所说线程的句柄,它指向的就是一个类或者结构,它和系统有很密切的关系。当一个线程由于不可预料的原因而终止时,系统就可以通过句柄来回收它所占用的资料,如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类来实现,通过定义好的构造、析构函数来完成分配和回收,最好不要通过指针来动态操作。

(转摘)

 

Windows句柄剖析 Windows句柄的前生今世:句柄剖析 阅读详情

相关推荐

指针句柄的简单转换

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

风生水起 2092

MFC - 窗口句柄与控件指针转换

句柄得到指针 FromHandle(hwnd); 从对象指针得到句柄 pWnd->m_hWnd; 转载于:https://my.oschina.net/mlgb/blo...

chijiaozhao5384的博客 489

Windows程序设计-子窗口控件

按钮类别/*---------------------------------------- BTNLOOK.C -- Button Look Program (c) Charles Petzold, 1998 ----------------------------------------*/#include <windows.h>struct {

小龙在线 1863

VC API常用函数简单例子大全

VC API常用函数简单例子大全 http://hi.baidu.com/tag/vc%20api%E5%87%BD%E6%95%B0/feeds   系统API查询 http://www.vbgood.com/api.html http://hi.baidu.com/3582077/item/9cc3483b581f53c5392ffae3 第一个:FindWindow根据窗口

jiangxinyu的专栏 5377

VC窗口ID句柄指针三者相互转换函数【原+转】

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

sl159的专栏 1551

 VC窗口ID句柄指针三者相互转换函数

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

lyzhm的专栏 1555

我的VC——VC窗口ID句柄指针三者相互转换函数

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

518

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

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

weixin_30527143的博客 86
上一篇: cannot convert wchar_t to const char*
下一篇: 敏捷开发工具scrum
gengxt2003
博客等级 码龄23年 182粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值