基于对话框的MFC程序怎么在任务栏实现最小化和还原的切换?
我最近用MFC写了一个基于对话框的随机点名程序。缺省情况下,这种程序是没有最小化功能的。但是我有一个朋友希望我这个程序能够最小化,我答应了。我在程序里通过修改窗口Style把最小化按钮加进去了。点击最小化按钮,窗口能够最小化,只剩下任务栏上的任务按钮,然后如果点击这个任务按钮,可以重新还原这个窗口。不过我发现一个问题:一般的程序可以通过点击任务按钮,使得窗口在还原和最小化之间切换。但是凡是MFC基于对话框的程序都是没有这个功能的,表现在:不能通过点击任务按钮的方式实现最小化;在窗口还原显示的情况下,点击该程序的任务按钮只能使得窗口变灰而不是最小化。
为了让我的程序和普通CWnd程序一样,我尝试了两条途径。第一,我修改了对话框窗口的 STYLE乃至EXSTYLE,让它和非对话框窗口一样,结果发现还是不行。第二,我怀疑是不是CDialog窗口对于某些消息的处理方式和CWnd不一样,导致基于CDialog的窗口失去了CWnd窗口所具有的这个功能。但是我看来看去,还是找不到任何一点蛛丝马迹。所以我只能到这里来求助了。有MFC高手能帮助我吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(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更灵活好用