VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1969|回复: 6

[求助] GetDlgItem为什么能封装句柄并返回指针?

[复制链接]
72_avatar_middle
在线会员 发表于 2015-10-20 11:08:40 | 显示全部楼层 |阅读模式
50驿站币
本帖最后由 新手学习中 于 2015-10-20 11:11 编辑

在syc 基础班  第七讲 里。

在一个对话框里,我们 想对里面 的控件  进行  MFC封装(这个子控件 是资源编辑器里拖入的

那么只需要:(比如按钮控件)


pButton = (CButton *)GetDlgItem(IDC_BUTTON1); // 这个我很不能理解!



为什么我不能理解呢?这MFC函数 无非是 通过 ID 跟父窗口句柄 得到 子控件 句柄 ,然后得到指针


我们知道,窗口句柄是句柄,跟指针没什么关系。 有指针是因为 MFC把他封装在了类对象里。


那么GetDlgItem内部到底有没有对这个子控件窗口句柄进行封装呢?

如果没有封装,那么:响应1:
pButton = (CButton *)GetDlgItem(IDC_BUTTON1);
响应2:
pButton->EnableWindow(FALSE);


以上有效果。这说明GetDlgItem直接把句柄给封装在c++类里了,但是呢?很奇怪为什么指针指向的内容还是有效的。(对象出了作用域就被释放了,除非是动态,但是也不可能)

如果已经封装了:
那么到底是在哪里封装的,因为没有这个子控件对应的具体的对象啊

而且GetDlgItem只是去获取具体封装的那个对象的指针(但是怎么获取呢?可以判断句柄是否被封装了,通过回调判断,但是怎么知道是具体哪个对象呢?难道封装的时候把指针放在额外空间里了?)


最佳答案

查看完整内容

明白你的意思了,这个肯定是MFC内部帮忙维护了,具体就得看 CWnd::FromHandle 的源码了,到里面一探究竟




上一篇:JS调用在64位下的支持问题
下一篇:MFC里,为何attach不调用detach就运行错误?
51_avatar_middle
online_admins 发表于 2015-10-20 11:08:41 | 显示全部楼层
新手学习中 发表于 2015-10-20 11:42
恩 句柄一直在我明白,但是对象不会一直在啊。对象就是指 pButton =(CButton*) getdlgitem(ID);

  ...

明白你的意思了,这个肯定是MFC内部帮忙维护了,具体就得看 CWnd::FromHandle 的源码了,到里面一探究竟
51_avatar_middle
online_admins 发表于 2015-10-20 11:16:55 | 显示全部楼层
将一个窗口句柄跟 CWnd 类进行关联在一起的函数是:CWnd::FromHandle
所以,关键点也是这个函数了。
72_avatar_middle
ico_lz  楼主| 发表于 2015-10-20 11:26:01 | 显示全部楼层
Syc 发表于 2015-10-20 11:16
将一个窗口句柄跟 CWnd 类进行关联在一起的函数是:CWnd::FromHandle
所以,关键点也是这个函数了。

但是怎么解释 指针指向的对象没被释放呢?

getdlgitem 返回指针。 但是指针指向的类对象他离开了作用域,不是应该被析构了吗?

但是呢,我们的指针(保存为成员变量),还能在其他响应中使用。

这又是为什么啊
51_avatar_middle
online_admins 发表于 2015-10-20 11:32:08 | 显示全部楼层
新手学习中 发表于 2015-10-20 11:26
但是怎么解释 指针指向的对象没被释放呢?

getdlgitem 返回指针。 但是指针指向的类对象他离开了作用 ...

你说的对象是什么对象?
控件被拖拽到界面上之后,程序一启动,控件就被实例化出来了,只要界面不销毁,上面的控件就一直存在,其控件的句柄就是一直有的
72_avatar_middle
ico_lz  楼主| 发表于 2015-10-20 11:42:24 | 显示全部楼层
本帖最后由 新手学习中 于 2015-10-20 11:44 编辑
Syc 发表于 2015-10-20 11:32
你说的对象是什么对象?
控件被拖拽到界面上之后,程序一启动,控件就被实例化出来了,只要界面不销毁, ...


恩 句柄一直在我明白,但是对象不会一直在啊。对象就是指 pButton =(CButton*) getdlgitem(ID);

pButton 不是一个指向对象的指针么,他肯定指向一个对象啊,这个对象就是封装了句柄的对象吧(以后就可以操作这个对象来操作子控件)

但是这个对象在哪里被创建出来的呢?是在getdlgitem里被创建出来的吗?

这个对象的生命周期呢  

为何他不会被析构,而这个对象的指针可以总是使用而不会指向无效,但问题是我们pButton是指针成员变量 不是对象成员变量来保存啊,如果我们是成员对象变量,那生命周期跟对话框一样。但我们是pButton指针作为成员变量啊,他指向的对象的生命周期怎么会这么长



72_avatar_middle
ico_lz  楼主| 发表于 2015-10-20 14:30:23 | 显示全部楼层
Syc 发表于 2015-10-20 13:46
明白你的意思了,这个肯定是MFC内部帮忙维护了,具体就得看 CWnd::FromHandle 的源码了,到里面一探究竟

原来是这样  多谢老大了~~~ syc老大真有耐心跟热心GetDlgItem为什么能封装句柄并返回指针?
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-8-21 22:55

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表