首页

一种穷人式的内存泄露检测方式  

对于检测程序代码中的资源泄露问题,市面上已经有很多工具了,但是今天我再来介绍一种新的方式,这种方式不需要安装任何工具或者特定的编译器开关,也不需要第三方库。 那就是:一直保持程序运行,直到泄露的原因自动水落石出。这是什么意思? 每日自动压力测试通常是工程开发中的一个常规部分。有一些软件开发团队使用屏幕保护程序作为触发器,其他团队使用自定义程序,还有一些团队需要手动启动压力测试,但无论如何,在你下班...

为什么Windows错误报告叫作”Dr. Watson”?  

应该有一部分人可能会知道,Windows 错误报告有一个昵称,叫做”Dr. Watson”(华生医生),没事,你不知道,也没关系。 今天的文章主要是讲讲,这个”Dr. Watson”名称的来历。 和你所猜想的一样,Dr. Watson 来自柯南道尔的小说<<福尔摩斯探案集>>中的灵感,在小说中,Dr. Watson 是神探福尔...

处理WM_KILLFOCUS消息时需要注意的地方  

之前我在一篇文章中曾经提过,不应该利用 WM_KILLFOCUS 消息中对表单的字段进行有效性校验。 今天的文章,我将介绍另外一个反面例子,来表现当使用 WM_KILLFOCUS 消息处理焦点相关的问题时所带来的混乱。 假设,有一个编辑框控件使用了气球提示来显示反馈信息。举个例子,对于一个密码输入控件,当键盘上的 CapsLock 按键按下时,它会提示用户,以防止用户输入错误的密码。作为开发者,你...

在单选按钮上实现双击效果  

如果想让你的用户体验更加极致,可以考虑在对话框上的单选按钮上实现双击效果,以此作为”选中 + 确定”(或者是选中 + 下一页,或者是选中 + 完成等)的快捷方式。 看看我们需要怎么做 下面是一个对话框模板以及它对应的对话框窗口过程。 上面展现了一个非常”乏味”的对话框,它允许用户从单选按钮中选择一项。 请注意,如果在单选框上执行双击操作,不会有任...

绘制一张透明背景的单色位图  

在上一篇文章中,我留下了一个谜题:如何使用透明背景绘制一张单色位图。今天我们来揭晓谜底。 丑话说前头,我不是一名 GDI 方面的专家,所以,除了下面讲述的两种方法之外,可能还有我所不知道的更好的解决方案。为了演示透明背景的效果,我先将窗口的背景色设置成工作区颜色。 方法1:采用 MaskBlt API 上面的方法所需要编写的代码量最少,但我个人觉得有些矫枉过正了。它使用一个所谓的四元光栅操作,...

绘制菜单符号的技法  

在上一篇文章中,我们了解了如何绘制主题化的和原始未主题化的单选按钮,我曾提到,绘制菜单符号会更加复杂一些。复杂之处在于,这些符号是通过单色位图实现的,而不是漂亮的全彩色位图。 首先,我们将通过一种错误的做法来看看实际的效果,然后我们将展示如何修复它。 请看下面的代码: 在上面的代码中,我们使用了 DrawFrameControl 这个 API 函数,往菜单项上绘制一个勾选符号。如果你正在运行的是...

使用Win32 API 渲染一个标准界面元素  

有这么一个Win32 API,名叫 DrawFrameControl,它可以用来在你的自定义控件上渲染一些标准的窗口元素。 下面我们举一个简单的例子来说明。 在下面的例子中,我们会使用这个 API 函数来绘制一个已选择的单选按钮。具体方法是,在我们之前的例子程序中做出如下的修改。 当运行修改后的程序,你会看到在窗口的角落有一个单选按钮。Woo-hoo。 可能你会发现,这个单选按钮是没有带主题的。...

一个进程只能最多创建2000个线程吗?  

我经常听到有人说,为什么不能创建一个包含2000个线程的进程。 原因不是Windows中固有的任何特定限制。相反,程序员没有考虑每个线程使用的地址空间量。 线程由内核模式下的一些内存(内核堆栈和对象管理)和用户模式下的一些内存(线程环境块、线程本地存储等)及其堆栈组成。(如果你使用的是安腾系统,则为多个堆栈。) 通常,限制因素是线程堆栈大小。 请看下面的代码: 此程序通常会打印一个大约 2000...

窗口销毁消息 WM_DESTROY 的正确处理方式  

上次,我提到了可能导致正常的消息循环被破坏的怪异之处。 有一位读者 Adrian 指出,WM_GETMINMAXINFO 消息在顶级窗口 WM_NCCREATE 之前到达。这确实很不幸,但(无论是否错误)十多年来一直如此,现在修改它会引入严重的兼容性风险。 但这不是我想到的怪异之处。 前段时间,我正在帮助调试一个使用 ListView 控件的程序的问题,该问题可追溯到 ListView 控件子类化...

说说WM_DESTROY和WM_NCDESTROY的区别  

在一个 Windows 窗口被销毁的时候,你会发现有两个比较类似的消息:WM_DESTROY和WM_NCDESTROY,那么,这俩兄弟之间有什么区别呢?今天就来讲讲。 不同之处在于,WM_DESTROY消息在窗口销毁序列的开头发送,而WM_NCDESTROY消息在结束时发送。当你有子窗口时,这会是一个重要的区别。如果你有一个带有子窗口的父窗口,那么消息流程(在没有奇怪的事情发生的情况下)将如下所示...