GetDlgItem的用法小结
GetDlgItem用于获得指定控件ID的窗体指针,函数原型如下:
HWND GetDlgItem(
HWND hDlg,
int nIDDlgItem
);
CWnd* GetDlgItem(int nID) const;
它的使用说明中有这样一行字,**The returned pointer may be temporary and should not be stored for later use.
**,那说明,它返回的指针有可能是有效的,有可能是无效的,不建议保存留给后续来使用。那么问题来了,
为什么通过GetDlgItem返回的指针有时稳定,有时不稳定?
在实际应用中,如何正确处理GetDlgItem的返回值?
先回答第一个问题, GetDlgItem返回的数据类型是CWnd*类型,它内部有一个 HWND m_hWnd 句柄成员,该句柄成员是一个4字节(64位程序中为8字节)的无符号整形,它代表内存中对象物理地址列表的索引,索引对应保存的内容是特定对象的物理地址。由于Windows的内存管理策略会定时对空闲内存进行释放、移动等操作,当应用程序再次使用时,系统会重新申请物理内存,所以对象的物理地址会变化,Windows通过句柄来对应用程序屏蔽这种变化。当应用程序要访问对象时,只需要将对应的句柄传递给系统,系统内部会根据句柄检索指向对象的最新地址。
C++中的指针也代表地址。对于应用程序中的不同对象和同类中的不同实例来说,Windows不允许直接通过其地址来访问内核对象,而是通过标识或者索引指针的句柄(HANDLE)来访问对象信息。
上面提到了Windows的内存管理策略会对空闲对象内存进行相关操作,据此推测,在Windows认为应用程序空闲时,就会对应用程序的空闲对象进行操作。
GetDlgItem实际上是调用CWnd::FromHandle函数来实现功能的,先看CWnd::FromHandle函数
CWnd::FromHandle(HWND hWnd)
-->CHandleMap* pMap = afxMapHWND(TRUE); //create map if not exist
-->AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
-->pState->m_pmapHWND = new CHandleMap
-->CWnd* pWnd = (CWnd*)pMap->FromHandle(hWnd);
-->pWnd->AttachControlSite(pMap);
再看下CWinApp::OnIdle函数,OnIdle函数的官方解释:
CWinApp::OnIdle
OnIdle is called in the default message loop when the application's message queue is
empty. Use your override to call your own background idle-handler tasks.
MFC程序中对Idle状态的处理:

基于MFC的OnIdle相关流程如下:
CWinApp::OnIdle
--> CWinThread::OnIdle(lCount)
-->AfxUnlockTempMaps()
--> AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
--> pState->m_pmapHWND->DeleteTemp();
对CWinApp:OnIdle进行重载,返回非零代表还有Idle Task要处理,这样下次OnIdle仍然会继续执行。返回0,表示无Idle任务需要处理。具体详细的参考MFC框架程序中的OnIdle
很多函数,如FromHandle、FindWindow都用到了临时对象技术,这些临时对象即用即取,不能保存后另作他用。默认情况下,MFC框架会在空闲时间把临时对象给清空掉。
最后解答开头提出的问题:
当默认Idle流程执行时,会删除临时对象句柄。
对于GetDlgItem这类的函数,随用随取,不要保存另作它用
GetDlgItem的用法小结的更多相关文章
- 转载:Hadoop排序工具用法小结
本文转载自Silhouette的文章,原文地址:http://www.dreamingfish123.info/?p=1102 Hadoop排序工具用法小结 发表于 2014 年 8 月 25 日 由 ...
- [No000010]Ruby 中一些百分号(%)的用法小结
#Ruby 中一些百分号(%)的用法小结 #这篇文章主要介绍了Ruby 中一些百分号(%)的用法小结,需要的朋友可以参考下 what_frank_said = "Hello!"#% ...
- C++ typedef用法小结 (※不能不看※)
C++ typedef用法小结 (※不能不看※) 第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // 这多数不 ...
- 函数fgets和fputs、fread和fwrite、fscanf和fprintf用法小结 (转)
函数fgets和fputs.fread和fwrite.fscanf和fprintf用法小结 字符串读写函数fgets和fputs 一.读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符 ...
- 1:CSS中一些@规则的用法小结 2: @media用法详解
第一篇文章:@用法小结 第二篇文章:@media用法 第一篇文章:@用法小结 这篇文章主要介绍了CSS中一些@规则的用法小结,是CSS入门学习中的基础知识,需要的朋友可以参考下 at-rule ...
- 英语语法最终珍藏版笔记- 21it 用法小结
it 用法小结 it 在英语中的意思较多,用法较广,现总结如下. 一.it作句子的真正主语 1.it 指前面已经提到过的人或事物,有时指心目中的或成为问题的人或事物,作真正主语. 例如: What’s ...
- [转]ssh常用用法小结
ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...
- 结构体定义 typedef struct 用法详解和用法小结
typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便.具体区别在于:若struct node {}这样来定义结构体的话.在申请node 的变量时,需要这样写,stru ...
- typedef用法小结
typedef用法小结- - 注意:本文转自网络,版权归原作者所有. typedef typedef用法小结- - 这两天在看程序的时候,发现很多地方都用到typedef,在结构体定义,还有一些数组等 ...
随机推荐
- 基于jQuery点击图像居中放大插件Zoom
分享一款基于jQuery点击图像居中放大插件Zoom是一款放大的时候会从原图像的位置以动画方式放大到画面中间,支持点击图像或者按ESC键来关闭效果.效果图如下: 在线预览 源码下载 实现的代码. ...
- 基于jQuery实现的腾讯互动娱乐网站特效
分享一款基于jQuery实现的腾讯互动娱乐网站特效.腾讯互动娱乐网站jQuery特效是一款右侧带伸缩选项卡,支持鼠标滚轮滚动切换特效代码.效果图如下: 在线预览 源码下载 实现的代码. html代 ...
- Android 仿微信的朋友圈发布(1)
想自己做一个APP,然后等做到类似发布朋友圈的,微博状态的时候,遇到问题了,完全不知道咋下手. 什么访问相册,列出照片,选择照片进行回传,完全不懂,咋办,自己写?自己写是不可能自己写的,打屎都不可能自 ...
- Linux 下 less 命令
less 命令功能强大,上能搜索,下能动态加载查看日志,并且每一屏内容都是预加载,不会加载整个文件,所以不会由于搜索内容过多把机器卡死 语法 less [参数] 文件地址 参数说明 -N:显示行号 f ...
- 【WPF】屏幕右下角消息提示框
WPF做一个仿QQ的右下角消息提示窗,网上找到几个Demo后,选了一个比较好用的. 博客 http://blog.csdn.net/huangli321456/article/details/5052 ...
- 【WPF】拖拽ListBox中的Item
整理了两个关于WPF拖拽ListBox中的Item的功能.项目地址 https://github.com/Guxin233/WPF-DragItemInListBox 需求一: 两个ListBox,拖 ...
- Mac OS下 Redis2.6.14部署记录
Mac OS下 Redis2.6.14部署记录 部署一个Redis作为缓存进行验证,记录部署过程. 官网:http://redis.io/,目前最近稳定版为2.6.14 解压,进入目录.按照READ ...
- adi 程序烧写
3.2 U-Boot Console Output Here we need set up minicom to open target board serial console. sudo mini ...
- Linxu安装Tomcat与Jdk并卸载自带OpenJdk
下载安装tomcat 1.下载apache-tomcat-7.0.47.tar.gz tomcat压缩包上传到linxu服务器 2.cd到文件存放目录使用(tar -xvzf apache-tomca ...
- [开发笔记]-C#判断文件类型
判断文件真实的类型,不是通过扩展名来判断: /// <summary> /// 判断文件格式 /// http://www.cnblogs.com/babycool /// </su ...