首页

对话框窗口过程的另外一种实现方法  

蝎子 在之前的一篇关于对话框返回值的文章中,有人建议说可以使用另外一种不同的搞法:也即直接调用DefDlgProc这个API函数(就类似于窗口消息过程中调用默认的消息处理函数DefWindowProc一样,而不是直接返回TRUE或者FALSE。 那,让我们试试呗 实际上,我们准备试它两次。 今天我会使用上述所说的方法,过几天,我还会演示另外一种完全不一样的做法。这两种做法中,都包含同一个的内部理念...

关于窗口子类化需要注意的地方  

看看有啥问题 Windows的窗口子类化(Subclassing)是一个比你想象的复杂的一种技术。我们先看看下面的代码有啥问题没有: 我想大部分人应该可以看着里面的问题来。 如果在”…do stuff…”阶段,其他人又一次进行了窗口子类化,将会发生什么呢? 当我们恢复窗口过程的时候,我们会重复执行两次解除子类化(Unsubclassing)操作。第...

使用Visual Studio开发C++应用:增量编译和Shell支持  

两项功能改进 Visual Studio 2019可以支持开发者在单一集成开发环境(IDE)下开发面向Windows和Linux(包括Windows Subsystem for Linux)的应用。 Visual Studio 2019 v16.7 Preview 3进一步在Linux开发中引入了两项新的特性: 1) 针对MSBuild Linux工程的增量编译优化。 2) 增加了更加广泛的Lin...

谈谈开发框架的稳定性

开发框架背后的事 如果某个开发框架向它的客户暴露了一些由底层提供的功能,那么,将客户从底层代码中那些”脏活”和”隐藏限制”的部分隔离开来,到底有多难呢? 你可能凭直觉说,”框架本来就应该将客户完全从底层细节隔离开嘛!这不正是框架应该做的事情吗?” 但是,事情可能没这么美好,特别是当你知道你正在提出的是一个什么样的要求的时候。 ...

对话框窗口过程返回值的解释  

关于对话框窗口过程返回值 有时候,很多朋友会对对话框窗口过程(Dialog Procedure)的返回值感到疑惑,今天我试着使用一种不同的方法来给大家”翻译翻译”。 对话框过程实际上需要向操作系统返回两种信息: 1) 这个消息是否已经得到了处理? 2) 如果得到了处理,返回值应该是什么? 因为在传统的C语言中,一个函数只能返回一个值,但是在对话框窗口过程中需要返回上述提到的...

新的页面保护层级:可读但不可执行

有时候,你可能会偷些懒 在动态生成某些可执行代码(shellcode)的时候,忘记去执行VirtualProtect(PAGE_EXECUTE)。对于i386这样的处理器来说,这样做并没有什么问题。因为这些处理器并没有带有一个”可读但不可执行”的工作模式,所以在页面上任何可以读取的东西,都是可以被执行的。 关于这个VirtualProtect VirtualProtect是...

关于注册表向后兼容的悲伤故事

当你尝试设计一个操作系统的时候,向后兼容性,是其中一个你不得不考虑的问题。 如果新的应用程序依赖那些为旧版应用程序设计的”小技巧”时,你就得发狂了。 在很久很久以前的一个遥远星系(Windows 95的Beta发布版本的代号是”M3″),我们将那些用来描述特定文件夹的位置的信息保存到了名为”Shell Folders”的注册表...

为什么通过翻转颜色值来实现高亮不是一个好主意  

有些人可能会说:”我们可以通过翻转颜色的RGB值来实现高亮显示,很简单嘛?” 这个做法,可能对于那些黑白显示器可能有效,但是在现代的32位色彩世界里,它就不会那么有效了。 考虑下面的一张图片,你能猜出那张图是翻转之后的吗? 答案是:右边那张是经过RGB翻转过的。 左边的图的背景色是灰色,其RGB值为#808080,右边的图是经过翻转之后的,#808080的翻转值为#7F7...

还有一部分人看不懂模拟时钟

在之前的一篇文章的评论中,我提到过这么一件事:我们在任务栏上不显示模拟时钟,而是显示数字时钟的原因是,有一些人(大概占30% ~ 40%左右,我不记得了)看不懂模拟时钟。就是说,如果任务栏显示是的一个模拟时钟,则他们看不懂到底几点钟了。 你可能会问,那在Windows Vista中还有一侧以侧边栏显示的模拟时钟呀?为什么会这样? 你如果仔细的看看这个侧边栏时钟,你会发现,我们还是将数字时钟显示在了...

技法(但请少用):为非活动窗口绘制活动的标题栏

你可能会问:“为什么会有人想这样做呢?” 这个绘制需求通常用于浮动式工具栏。(除此之外,我想不到还有任何其他理由会将一个非活动窗口的标题栏绘制成活动式的) 幸运的是,这个功能很容易实现。只需要在我们的WndProc窗口过程中添加如下的一行代码即可: case WM_NCACTIVATE: if (wParam == FALSE) wParam = TRUE; break; 这就像是在说:̶...