首页

还原窗口位置的微妙之处  

很多应用程序都实现了这样一个特性:它们会记录窗口关闭时最后在屏幕上的位置,并尝试在应用程序重新启动的时候恢复这些位置。如果只是简单的实现这个功能,则大多数开发者会无条件的记录窗口的最后显示位置,并在程序重新启动是恢复窗口到这个位置。 但是,这可能会给你的程序带来可用性方面的问题,此话怎讲? 如果用户运行了你的的程序的两个实例,则两个窗口最终会出现在屏幕上完全相同的位置。 除非用户仔细的观察了任务栏...

以其他组件为代价的性能提升不是好提升  

在操作系统的开发中,我们必须对性能有一个整体的看法。系统设计者的目标是:让整个系统运行得更快,同时在各个应用程序的运行速度上取得一定的平衡。 另一方面,应用程序往往对性能抱有自私的看法:”我会尽一切可能让自己跑得更快。对系统其余部分的影响不是我关心的。” 一些应用程序会将自己放入开机自动启动组中,以便更快地加载。 这并没有真正让系统运行得更快。 它只是在转移启动的阶段而已。...

为什么传递SPIF_SENDCHANGE标志SystemParametersInfo会挂起?  

如果你传递SPIF_SENDCHANGE标志给SystemParametersInfo函数,则它会向系统以广播的形式发送WM_SETTINGCHANGE消息,并将消息的wParam参数设置为你传递给函数的标志。例如,如果你调用: SystemParametersInfo(SPI_SETDOUBLECLICKTIME,500, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHA...

使用SystemParametersInfo访问用户界面设置  

SystemParametersInfo这个函数还挺有用,它可以用来以代码的方式访问操作系统中的用户界面设置,并且它是唯一一个可以用来修改设置的函数。在今天的文章中,我不会列出该函数支持的所有设置参数,如有需要,请直接出门左转看文档,那里才是你需要去的地方。我只是想说几条比较值得注意的: > SPI_GETICONTITLELOGFONT 此参数可以用来获取图标文本的字体信息。对应的,SPI...

一个超时上下文菜单的实现  

和之前的超时对话框系列文章颇为类似,我们可以依葫芦画瓢实现一个超时上下文菜单,实现的手法更加简单一些。具体来说,我们使用了一个Windows消息 WM_CANCELMODE来关闭上下文菜单。 例子代码 在显示上下文菜单之前,我们创建了一个定时器。(这里有一个小细节,我们使用了线程定时器,以为你我们并未拥有任何窗口句柄,因此我们不知道应该使用哪个定时器ID) 如果定时器触发了,则我们通过定时器回调...

说说模态化8:一个更好版本的超时关闭对话框  

在上一篇文章中,我们实现了一个基础版本的超时关闭对话框,但是我们提到那个版本有个限制,就是:它同一时刻,只能在同一个线程中使用。今天,我们来修改下代码,实现一个更好的版本,来去掉这个限制。 如果你还记得的话,上面说的限制的原因在于:我们将”对话框是否超时”这个标志变量保存为了一个全局变量。为了修复这个问题,我们将它保存到实例级别的位置,也就是所谓的一个”帮助窗口...

一种快速创建测试窗口的方法  

有时候,你可能想快速创建一个简单的窗口来测试某些功能,这个时候,你又不想花时间从头到尾一步一步的按标准流程来建立它。例如,你可能需要测试一小段DDE代码,或者只是简单地想测试一下你新实现的消息提示框。那么,有什么好办法吗? 有。 为了帮你省去创建窗口时繁琐的各项工作,你可以简单地注册一个名为”scratch window”的窗口类,然后根据需要对它进行简单的子类化(SubC...

说说模态化7:一个基础版本的超时关闭对话框  

正如我们在第3篇文章的结尾所提到的,既然你已经知道了关于 WM_QUIT 消息的使用技巧,那么,你就可以大胆的使用它们。 如果你希望 TimedMessageBox 函数越健壮,那么需要做的工作就越多。本篇将介绍一个基于知识库中一个示例程序的的简单版本,我们只是添加了一些额外的错误修复。 请看代码: 我们所实现的 CheapTimedMessageBox 函数,和 MessageBox 十分类似...

说说模态化6:与模态对话框的交互原则  

书接上回,之前我们讲述了为模态用户界面(UI)设置正确的所有者窗口的重要性。 在操作一个模态化的窗口时,我们对它所展示的模态性也应当给予相当的”尊重”。 例如,让我们回想一下,在我们在上一篇文章中的例子程序中,它调用了 MessageBox 函数来显示了一个模态对话框。 如果我们想让主该程序退出,采用的方法是:向主窗口(而不是其模态对话框)发送 WM_CLOSE 消息,则主...

说说模态化5:如何设置所有者窗口  

下面,我们先看看之前演示过的一段有问题的代码: 我们通过为模态界面传递正确的所有者窗口来解决了这个问题。因为MessageBox调用是模态化的,之前我们说过,当一个模态化的界面显示的时候,其所有者窗口将会被禁用,从而防止用户在非预期的情况下破坏或更改所有者窗口的状态。 这就是为什么所有可能显示UI(用户界面)的外壳(Shell)函数都会接受窗口句柄作为其参数之一的原因。 为什么? 因为它们需要知...