基于对话框的MFC程序怎么在任务栏实现最小化和还原的切换?

发布于 2022-09-05 22:48:56 字数 634 浏览 20 评论 0

我最近用MFC写了一个基于对话框的随机点名程序。缺省情况下,这种程序是没有最小化功能的。但是我有一个朋友希望我这个程序能够最小化,我答应了。我在程序里通过修改窗口Style把最小化按钮加进去了。点击最小化按钮,窗口能够最小化,只剩下任务栏上的任务按钮,然后如果点击这个任务按钮,可以重新还原这个窗口。不过我发现一个问题:一般的程序可以通过点击任务按钮,使得窗口在还原和最小化之间切换。但是凡是MFC基于对话框的程序都是没有这个功能的,表现在:不能通过点击任务按钮的方式实现最小化;在窗口还原显示的情况下,点击该程序的任务按钮只能使得窗口变灰而不是最小化。

为了让我的程序和普通CWnd程序一样,我尝试了两条途径。第一,我修改了对话框窗口的 STYLE乃至EXSTYLE,让它和非对话框窗口一样,结果发现还是不行。第二,我怀疑是不是CDialog窗口对于某些消息的处理方式和CWnd不一样,导致基于CDialog的窗口失去了CWnd窗口所具有的这个功能。但是我看来看去,还是找不到任何一点蛛丝马迹。所以我只能到这里来求助了。有MFC高手能帮助我吗?

clipboard.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

哭了丶谁疼 2022-09-12 22:48:56

花了几天时间,我自己解决了。

问题的关键是:MFC dialog-based app 采用的是有模式对话框,它的整个运行就是在CDialog::DoModal中,而DoModal是一个循环,其代码做死了没法改。该循环会不断地显示窗口。

现在我已经改为采用彻底的无模式对话框作为主窗口。我的具体方案是,以CWnd为基类编写了一个CDlgWnd类,该类用::CreateDialog函数创建窗口。代码的编写参考两个地方,第一是Petzold的书的HexCalc例子,第二是MFC的CWnd::Create源码。代码虽短,但细节需要注意之处甚多,尤其是其中的WM_INITDIALOG怎么处理需要思量,我觉得我的处理挺妙的,和MFC的CDialog不太一样。

InitInstance代码需要自己写,不能用Wizard生成的代码,其实就四条语句。

现在已经彻底实现和原来功能一样,而且可以自如地切换最小化状态。因为我这个窗口就是一个OVERLAPPED窗口,而不是一般对话框的POPUP窗口。另外,各种数据交换机制也没有问题,因为DataExchange机制在CWnd级别就支持了。

简单气质女生网名 2022-09-12 22:48:56

qt更灵活好用

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文