VC中句柄就是控件的ID吗? RT如果不是,二者有什么区别?谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ID是控件的标识,就好像是一个人的名字一样。句柄是控件在数据结构上的外部标识代理,因为不便于通过内存指针暴露(防止用户通过指针越权修改,暴露细节,同时破坏黑盒式的封装)用户,所以便通过一个代理指针,即句柄来代理一个windows对象,可以近似的把句柄理解为一个指针,但是该指针不暴露内存细节,只是一个代理而已。关于代理的机制,你可以参考设计模式中的代理模式 ID是用户定义的值,句柄是系统生成并管理的。ID的作用有哪些呢?对于顶级窗口,ID不存在,它的含义变成了HMENU,窗口拥有的菜单句柄。对于子窗口,ID在创建窗口时就能随意指定,可以相同,也可以不同,可以调用 GetDlgItem 检索ID对应的窗口句柄。但ID在某些特殊情形下有特殊含义,当子窗口是 RADIO 类型时,多个RADIO需要分配相同的ID(且属于同一个GROUP)才被认为是一组单选项,否则这些单选项各自独立。除此之外,ID基本上没有作用。 我想问,SendMessage这个函数中,第一个参数是句柄,我想将消息传到某个窗口,在VC++6.0中如何获得句柄这个参数? ID是身份证(身份证的英文缩写也是ID),即身份证上的号码;中了500万彩票是事件;500万现金是对象;500万支票是指针,指向500万现金这个对象;那张彩票是句柄,因为不便于暴露500万支票那根指针;彩票句柄兑换到支票指针后,可以不要了;你买一张彩票,开奖前不知道是否中奖,因为彩票句柄是查看不了的。中了500万彩票这个事件,是通过彩票句柄,找到了500万支票那根指针,指向了500万现金那个对象;可是,这是谁中的呢?500万现金给谁呢?就需要身份证ID了。 句柄,都是映射到Windows内核对象的,Windows内部禁止通过指针破坏系统运行,所以给出一个句柄,在Windows内部有句柄列表来对应内核对象。可以看《Windows核心编程》 ID只用于控件等非常有限的地方,而句柄在整个WIN程序中到处使用,类似指针,但又不是指针,不能象指针一样直接访问其内存地址,但又能获得很多句柄指向的内存地址的内容。我想句柄是MS发明的一个OS极其以下各个内核对象的控制和使用的东东吧。 在操作系统中 句柄被用于每一个资源(文件,内存段,图片,窗口,设备,管道。)的唯一标识通过句柄可以拒绝程序直接访问资源,从而起到保护和共享等其他作用句柄由操作系统创建,释放,管理等。而用户则只能获取句柄,通过句柄访问资源而ID则是简单的数字标识。通常每个窗口都设置了ID,这个ID 不是唯一的,没有什么有效保护程序本身可以任意修改,不过某些ID 被赋予了特殊意义,在程序中会起到特别的作用PS:控件也是窗口的组合 A.m_hwnd 回复内容太短了 所谓句柄,就是一个唯一的数,用以标识许多不同的对象类型,如窗口、菜单、内存、画笔、画刷等。在Win32里,句柄是指向一个“无类型对象”(void*)的指针,也就是一个4字节长的数据。 句柄和指针最大的不同是:给你一个指针,你可以通过这个指针做任何事情,也许是好事,也许是通过这个指针破坏内存,干一些捣乱的事情。这个我想大家都会碰到过,因为乱用指针导致程序崩溃。 句柄就没有这个缺点,通过句柄,你只能干一些windows让你干的事情(调用一些api函数等等),没有了指针的坏处。 另外,关于lz的的提问:SendMessage这个函数中,第一个参数是句柄,我想将消息传到某个窗口,在VC++6.0中如何获得句柄这个参数?指针和句柄之间是可以相互转换的:a.由指针获得句柄CWnd * pWnd;CWnd HWnd;HWnd = pWnd->GetSafeHWnd();b.由句柄得到指针:CWnd* pWnd=FromHandle(hMyHandle);pWnd->SetWindowText("Hello World!");or CWnd* pWnd; pWnd->Attach(hMyHandle); MFC使用ADO连接ACCESS数据后,发布release版本,到XP系统上就连接不上数据库了~怎么回事呢? MFC在VC6.0里面怎么改程序连接的数据源? DirectX9.0环境下编译8.0的问题 显示仪表状态的组图实现方案请教 还是关于文件编码问题 很菜的问题,急求好心人解答 *o* 如何在工具栏使用256色,24位色图标 请教一个DX的问题 ^_^ view类怎么才能可以伸缩? 各位大侠,能拔刀相助否? C++的if语句使用逗号表达式 如何用libcurl实现ftp断点续传
句柄是控件在数据结构上的外部标识代理,因为不便于通过内存指针暴露(防止用户通过指针越权修改,暴露细节,同时破坏黑盒式的封装)用户,所以便通过一个代理指针,即句柄来代理一个windows对象,可以近似的把句柄理解为一个指针,但是该指针不暴露内存细节,只是一个代理而已。
关于代理的机制,你可以参考设计模式中的代理模式
对于顶级窗口,ID不存在,它的含义变成了HMENU,窗口拥有的菜单句柄。
对于子窗口,ID在创建窗口时就能随意指定,可以相同,也可以不同,可以调用 GetDlgItem 检索ID对应的窗口句柄。但ID在某些特殊情形下有特殊含义,当子窗口是 RADIO 类型时,多个RADIO需要分配相同的ID(且属于同一个GROUP)才被认为是一组单选项,否则这些单选项各自独立。除此之外,ID基本上没有作用。
中了500万彩票是事件;500万现金是对象;
500万支票是指针,指向500万现金这个对象;那张彩票是句柄,因为不便于暴露500万支票那根指针;
彩票句柄兑换到支票指针后,可以不要了;你买一张彩票,开奖前不知道是否中奖,因为彩票句柄是查看不了的。
中了500万彩票这个事件,是通过彩票句柄,找到了500万支票那根指针,指向了500万现金那个对象;可是,这是谁中的呢?500万现金给谁呢?就需要身份证ID了。
句柄和指针最大的不同是:给你一个指针,你可以通过这个指针做任何事情,也许是好事,也许是通过这个指针破坏内存,干一些捣乱的事情。这个我想大家都会碰到过,因为乱用指针导致程序崩溃。
句柄就没有这个缺点,通过句柄,你只能干一些windows让你干的事情(调用一些api函数等等),没有了指针的坏处。
另外,关于lz的的提问:SendMessage这个函数中,第一个参数是句柄,我想将消息传到某个窗口,在VC++6.0中如何获得句柄这个参数?指针和句柄之间是可以相互转换的:
a.由指针获得句柄
CWnd * pWnd;
CWnd HWnd;
HWnd = pWnd->GetSafeHWnd();b.由句柄得到指针:
CWnd* pWnd=FromHandle(hMyHandle);
pWnd->SetWindowText("Hello World!");
or CWnd* pWnd; pWnd->Attach(hMyHandle);