对话框管理器第五章:将非模态对话框转为模态

对话框管理器第五章:将非模态对话框转为模态

作者:BlogUpdater |  时间:2022-08-05 |  浏览:179 |  评论已关闭 条评论

今天,让我们应用上次学到的知识,将一个非模态对话框转换为模态对话框。 与往常一样,还是在我们的基础例子代码上添加如下内容:

上面的代码没有新意,你可能觉着没什么大不了的。它只是显示了一个对话框并根据用户点击的按钮来返回对应的值。我们对DoModal的调用,系统会调用底层的DialogBox来做实际的工作。

现在,让我们将DoModal转换一下,来实现一个模态对话框消息循环。但是且慢,为什么要这样做呢?
不为别的,我们只是想看看如何实现这个功能。在真实的项目中,我们当然没有任何理由去这样造轮子,系统的对话框管理器会为我们做这件事,且会做的更好。

首先,我们需要找到一个地方来存放我们调用”活动的对话框”的标志。我们将把它保存在我们挂起对话框的 DWLP_USER 窗口字节的结构中。 (我提前计划了这一点,让 DlgProc 函数在对话框初始化时将 lParam 存储到 DWLP_USER 额外字节中。)

EndManualModalDialog 代替了 EndDialog 函数:而不是更新对话管理器的内部“对话框关闭了吗?” 标志,我们更新我们自己的标志。

我们所要做的就是将我们的 DlgProc 从使用对话框管理器的模态循环转换为我们的自定义模态循环,然后,将调用 EndDialog 改为调用我们的函数。

剩下的就是编写自定义对话框消息循环。

鉴于我们在过去几天中学到的东西,其中大部分应该是有意义的。

我们首先以无模式的方式创建对话框,将指向对话框状态的指针作为创建参数传递,正如我们前面提到的,我们的对话框过程隐藏在 DWLP_USER 窗口字节中以供 EndManualModalDialog 使用。

接下来我们禁用所有者窗口; 这是在创建无模式对话框后完成的,遵守启用和禁用窗口的规则。 然后我们进入我们的消息循环,它看起来就像我们所说的那样。 我们所做的只是用 !ds.fEnded 代替伪代码。

模态循环完成后,我们继续进行标准流程:重新发布WM_QUIT消息,在销毁对话框之前重新启用所有者窗口,然后返回结果。

如你所见,模态对话框的基础知识真的没有那么令人复杂。 但是现在你有了这个基本框架,你可以开始修改它了。

然而,上面的代码中隐藏着一个错误,且错的相当微妙。
提示:仔细观察 EndManualModalDialog 和模态消息循环之间的交互。

总结
研究事物本质的好办法:重新造一造轮子,体验下造轮子过程中的酸甜苦辣。
上一次我看到这样做的人,还是十来年前侯捷的深入浅出MFC。
你必须 100% 投入。

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《The dialog manager, part 5: Converting a non-modal dialog box to modal》

最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

评论已关闭。