龙空技术网

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

漫漫开发路 143

前言:

而今各位老铁们对“模态转换例题”都比较注重,朋友们都想要知道一些“模态转换例题”的相关内容。那么小编在网摘上搜集了一些有关“模态转换例题””的相关内容,希望同学们能喜欢,小伙伴们快快来了解一下吧!

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

上面的代码没有新意,你可能觉着没什么大不了的。它只是显示了一个对话框并根据用户点击的按钮来返回对应的值。我们对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》

标签: #模态转换例题