首页

深度理解:WM_UPDATEUISTATE和WM_CHANGEUISTATE  

今天我们来聊一聊Windows里比较少用到的两个消息: WM_UPDATEUISTATE和WM_CHANGEUISTATE。 写这篇文章的原因,也是因为在开发中碰到一个界面绘制的问题,后来发现这个问题和这两个消息有关,当然了,这个问题在这里就不详细展开了,我可能会在另一篇文章里再写。 在讲述这两个消息之前,我先介绍一个概念:keyboard cues。我就先将它翻译成”键盘指示器...

深度理解:struct和class的区别  

C中struct和class的区别 1) 在C语言中,无class关键字,因此,如下的代码片段是无法通过编译的。 2) C语言中的struct不能定义函数,仅能定义数据成员。所以,我们通常使用struct来构建数据结构。 在如下的代码片段中,我们定义了两个数据成员,但是如果在这个结构体中尝试定义一个Play方法,则会编译失败。 C++中struct和class的区别 1) struct默认的...

深度理解:main函数的返回值  

最近碰到这样的一个问题:main函数的返回值的作用。 main函数的前世今生 每一个C程序都会有一个main函数作为入口点,这里所谓的入口点,也即程序一开始就会尝试找到main函数的位置,并从main函数的第一行代码开始执行。 那么,第一个问题:入口点之前是什么?main函数执行完之后,又是什么?这有点像:宇宙大爆炸之前的那一刻是什么状态? 我们来创建一个最简单的C程序,来看看入口点之前是什么? ...

深度理解:外壳剪贴板格式及通知机制

标准的剪贴板格式 在Windows中,标准的剪贴板格式使用了以CF为前缀的统一格式定义,例如: CF_TEXT: 用于传输一段ANSI文本 CF_UNICODETEXT: 用于传输一段UNICODE文本 CF_HDROP: 用于传输一组文件 外壳剪贴板格式大都没有预定义值 值得注意的是,有一些格式是有预定义值的,而有些没有。除了CF_HDROP是有预定义值外,其他的外壳剪贴板格式需要使用Regis...

深度理解:当勤精进,如救头燃,但念无常,慎勿放逸

如河驶流,往而不返;人命如是,逝者不还 是日已过,命亦随减;如少水鱼,斯由何乐 当勤精进,如救头燃;但念无常,慎勿放逸 — 《法句经·无常品》 生命中的每一天的时光,如同河里的流水一样,一去就复返了。 每一天过去了,生命就又少了一天,这就好比一条鱼生活在日渐减少的水中一样,没有什么值得可喜的。 应该抓紧时间,勤奋精进,就像扑灭头顶上的...

深度理解:线程创建后是否需要CloseHandle?  

今天来通过实验,验证一个我一直以来模模糊糊的问题:线程创建后是否需要CloseHandle? 实验 我们首先创建一个Windows控制台程序,然后通过_beginthreadex来创建一个简单的线程。 示例代码如下 unsigned __stdcall TestThread(void * pParam) { int i = 0; for (int i = 0; i < 10; ...

深度理解:使用字符串作为STL中map对象的key  

考察一下两个代码片段: void Fun1() { map<CString, int> test; test[_T("dll")] = 1; test[_T("exe")] = 1; map<CString, int>::const_iterator it = test.find(_T("dll&...

深度理解:CTreeCtrl展开和收起消息探究  

在使用树控件(CTreeCtrl)的过程中,有时候需要捕获树结点的展开(Expand)和收起(Collapse)事件并做一些自定义的操作。 今天就来探究一下树结点的展开和收起这两种消息,我们使用到了微软开发的小工具Control Spy,这个工具可以捕获Windows平台上各个控件的消息流。 TVN_ITEMEXPANDING和TVN_ITEMEXPANDED消息的触发 每当树控件展开之前,树控...

深度理解:赋值与比较的性能分析  

有时候,事情的结果会违反我们的经验常识。 例如,我们设置一个对象的成员值,有两种方式:一种是直接赋值,一种是先比较值是否相等,仅在不相等的情况下,才执行赋值。 日常经验会让我们觉得:第二种可能比较高效,因为在赋值之前先做了一个判断,省去了每次都赋值的成本。真的是这样吗? 我们来做一个实验,验证一下我们的想法。 #include "stdafx.h" class CA ...

深度理解:如何返回一个CString对象  

考察以下程序片段 LPCTSTR GetString1() { CString str(_T("")); str.Format(_T("%s"), _T("Hello")); return str; } CString GetString2() { CString str(_T("&quo...