首页

说说模态化3:设置正确的所有者窗口的重要性  

如果你决定显示一个模态化界面,则要当心了:一定要设置正确的所有者窗口(Owner Window)。如果你不注意这个规则,你发发现自己一直被一些非常奇怪的Bug所困扰。 让我们回到我们的例子程序,并故意设置错误的所有者窗口,看看将会发生什么。 运行这个程序,按空格键,这个时候会显示一个模态对话框,然后单击主窗口右上角的的关闭按钮。 请注意,在程序退出之前你会听到扬声器的声音。 为什么会这样? 扬声...

说说模态化2:关于WM_QUIT消息  

经过一些对模态化的简要介绍之后,今天我们来深入研究研究。 模态化的诀窍在于,当调用一个模态函数时,消息调度的责任由该函数处理,而不是由主程序处理。因此,如果你自定义了主程序的消息循环,那么一旦你失去对模态循环的控制,这些自定义的部分就会丢失。 关于模态的另一个重要的事情是:WM_QUIT消息总是会打破模态循环。 在你自己的模态循环中一定要记住这一点! 如果你调用 PeekMessage 函数Get...

说说模态化1:用户界面的模态化和代码的模态化  

从最终用户的体验来看,模态性是指,用户开始了一项操作后,他要么完成这项任务,或者取消整个任务。 例如,打开一个文件就是一个模态性的操作:一旦”打开”菜单被点击后,用户只能选择一个文件来打开,或者取消整个操作。 另外一个例子是,当准备打开一个文件的时候,用户就不能和现有已经打开的文档做任何的交互操作,例如,用户不能滚动现有文档来查看一些内容来帮助他回忆应该打开哪个文件。 从程...

说说MsgWaitForMultipleObjects和队列状态  

MsgWaitForMultipleObjects的危险之处在于,如果调用它的时候还有消息等待处理,这个时候调用就会挂起,因为MsgWaitForMultipleObjects只会在队列中出现一个新的事件的时候才会返回。 换句话说,让我们考虑下面的情景: > PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)调用返回了TRUE,表明队列中有一个消息。...

说说Shell动画控件的限制  

在桌面外壳(Shell)通用控件库中,有一个大家不怎么用到的动画控件(Animation Control)。但是,动画控件只能支持很少一部分的AVI文件,也即:在动画控件中能使用的AVI文件必须符合下列要求: > AVI文件必须是非交叉的(Non-Interleaved)。 > AVI文件只能包含一个视频流。 > AVI文件最好不要带上音频流。 > AVI文件最好不要使用调...

为什么不能分配一块全局性的用户模式内存空间?  

有那么一个偶然时刻,有朋友问起我,有没有一种方法,可以保留一块用户模式下的全局性的内存空间。换句话说,他们是希望分配一块全系统里所有进程都可以访问的一块公用内存块,这里,所有的进程不仅包括现在正在运行的,也包含了将来即将运行的那些进程。 他们这样问的原因大抵在于,他们希望将一些用户模式的内存数据映射到系统的每一个进程中,并且不想自己设计一种共享内存机制来实现这个场景。 显然,这不大可行。为什么显然...

LoadLibraryEx(DONT_RESOLVE_DLL_REFERENCES)的缺陷  

如果你认真瞧过LoadLibraryEx函数的文档,就会发现它有这样一个标志DONT_RESOLVE_DLL_REFERENCES。关于此标志,文档是这样描述的: 如果使用了此标志,并且加载的是一个DLL模块,系统在进程和线程初始化/退出的时候,不会调用DllMain,同时,系统也不会加载该模块引用的其他模块。 如果你系统仅仅是访问DLL模块中的数据或者是资源的话,则使用LOAD_LIBRARY_...

过滤窗口消息的时候请谨慎  

有两个API,大家一定十分熟悉:GetMessage和PeekMessage。 我们可以向它们传递一个过滤器,就可以限制函数将从消息队列中检索的窗口句柄或消范围。 虽然可以使用这些过滤器,但请确保你最终要执行一次未过滤消息的调用,以便任何其他未处理的消息都可以得到妥善处理。 一个比较常见的错误是,在GetMessage消息循环中使用了一个基于窗口句柄的过滤器,例如之前我们的例子程序: 虽然在我们...

说说DS_SHELLFONT这个对话框风格  

如果在对话框模板中用到了DS_SHELLFONT,则表明你希望使用Windows 2000 默认的外壳字体(Default Shell Font)。但是这并不意味着这一定可以实现。如果你希望你的对话框具备Windows 2000的风格样式,则你需要做好下面的3件事情,如果第4件事情也能实现,则更好: 1. 使用DIALOGEX对话框模板,而不是DIALOG。 2. 在对话框风格中设置DS_SHEL...

如何判断当前是否运行在64位的Windows?  

如果你想使用代码的方式来判断一个32位的程序是否运行在一个64位的Windows系统上,你可以使用这个API: IsWow64Process。今天我们来仔细看看。 请不要轻易详细网上其他人的一些说法,将64位处理器的列表硬编码到你的程序中。 你可能会认为,在第一次修改64位处理器的硬编码列表(例如,将 x64 添加到 ia64 时)之后,人们会吸取教训。 但是,如何从 64 位进程中以编程方式检测...