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

senator
  • 2
新手上路,请多包涵

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

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

clipboard.png

回复
阅读 4.8k
2 个回答
senator
  • 2
新手上路,请多包涵

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

问题的关键是: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级别就支持了。

qt更灵活好用

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏