首页

思维调试:为什么FormatMessage提示找不到资源?  

在不调试的情况下解决下面的问题,说明你的思维调试能力又进阶了。 问题 我在调用 FormatMessage 函数加载一个插入的资源字符串,由于某种未知的原因,它没能按预期那样工作。 我要加载的字符串类似于这样的 “Blah blah blah %1. Blah blah blah.” FormatMessage 调用失败了,通过 GetLastError,我得到了具体的错误...

MFC 模态对话框退出机制的探究  

一位读者问了这样一个问题: ” 如果我创建了一个可见的模态对话框,却对用户来说不可用。举个例子,假设我在程序中的其他位置收到一个事件,并且我从事件中调用模态 CDialog 上的 DestroyWindow。我注意到 OnDestroy 是在 CDialog 上调用的,但在将 WM_QUIT 消息发送到模态对话框的消息循环之前,DoModal 永远不会退出。这会导致什么问题?不幸的是,...

傻傻分不清楚:WINVER,_WIN32_WINNT等  

今天就是要弄明白! 所以,经过上一篇的文章的洗礼,你应该知道如何指定 Windows 头文件的具体版本了。如下,你可以看到我们定义了四种不同的宏,是不是有点像孔乙己中不同的”茴”的写法? #define WINVER 0x0400 #define _WIN32_WINNT 0x0400 #define _WIN32_WINDOWS 0x0400 #define _WIN32...

我们需要先弄明白头文件的默认版本  

对于 Windows 头文件来说,一个通用的规则是:如果你没有指定要包含的头文件的具体版本,则默认情况下,你包含的是最新版本的头文件。 举个例子 如果你安装了 Windows XP 平台 SDK,并在你的代码里包含了 ,则你将使用 Windows XP 系统对应的函数原型,结构体以及函数标志位等。 但除非你特别小心的设置各种细节,否则,你的程序将只会在 Windows XP 上运行。 如果你在代码...

谨慎行事,请编写面向阅读的代码  

编写易于阅读的代码 你可能想着,我代码不是给其他人看的,所以没必要写的那么容易理解。 但是有可能的是,不管怎样,还是会有人在机缘巧合之下研究你的代码,并努力搞明白代码的意图。 而这个人,非常有可能就是编写代码 1 年后之后的你。 我曾经在一篇文章中写道,在设计函数原型的时候,尽量不要使用布尔类型作为函数的参数。有人就说了,”这个应该问题不大吧,你看现在的集成开发环境的 Intellis...

为什么不能在一个禁用的窗口上显示工具提示?  

前段时间,有人问了我这样一个问题,今天来说道说道。 他是这样问的: “当我将鼠标悬停在一个已经被禁用的窗口上时,窗口上对应的工具提示并没有出现? 这个是预期的行为吗?为什么在文档中没有说明?” 实际上,我想你应该已经知道答案了,文档中确实已经有描述过这个行为了,但是你需要将这些片段联合在一起来理解。 当一个窗口被禁用时,它将不会收到任何键盘和鼠标输入的消息。如果你研究一下 ...

小知识:UAC 对话框的颜色所代表的含义  

如果 Windows Vista 启用了用户账户控制(UAC, User Account Control)之后,如果你对一个可执行程序右键,并以管理员身份运行,则会弹出一个权限提升对话框,上面会显示一段警告信息并带有不同的颜色。 下面我们来看看各种不同的颜色所代表的含义 蓝绿色: 如果对话框是蓝绿色,则表明当前应用程序是一个 Windows 内置组件,这种情况请不用过分担心,问题不大。 灰色: ...

对 GetFileVersionInfo 参数的理解  

首先,我们看看官方对 GetFileVersionInfo 的原型: 它的第三个参数 dwLen 指定了客户方提供的缓冲区 (由第四个参数 lpData 指定)大小,以字节为单位。 真的是这样吗? 微软的应用程序兼容团队发现:有一款流行的游戏开发商对这个 dwLen 参数没有透彻的理解。开发人员将这个参数理解为:我希望加载的版本资源长度,并采用了如下的方式进行调用: 他们是这样想的:̶...

两种相同的垂直工具栏标志以及为什么  

可能你很少碰到这样的开发需求,所以本文属于”课外阅读”级别。 有两种方式启用垂直工具栏,一种是指定通用的 CCS_VERT 标志,另外一种,比较罕见:指定工具栏所特有的扩展属性 TBSTYLE_EX_VERTICAL。 问题来了,为什么会存在两个标志来做同一件事情? 因为我们搞砸了。 当初设计 TBSTYLE_EX_VERTICAL 的人没有意识到其实已经有一种通用而简单的...

技法和原理:如何找到你需要的菜单项?  

你一定碰到过查找某个菜单项的场景,通常我们会使用类似于 GetMenuItemInfo 这样的菜单函数, 在这类函数中,有一个参数允许你指定要查找的菜单项目的信息:MF_BYPOSITION 或者 MF_BYCOMMAND。 至此,是不是很眼熟了。今天就来给大伙儿讲讲这个。 从字面意思来理解,MF_BYPOSITION 是根据菜单的位置来进行查找,而 MF_BYCOMMAND 是根据菜单的命令 I...