目前做的一个东西,在一个窗体中显示模态窗体,当模态窗体最小化时,不见了,主窗体依然在那。查了一些资料,处理办法都不太明确,现在谈谈如何解决这种情况。
产生这种情况主要是模态窗体最小化后,应用程序丢失焦点,只有再次点击主窗体才会是模态窗体获得焦点,看到它在出现在主窗体的左下角。
那我如何使模态窗体最小化后,主窗体最小化到任务栏,并使模态窗体出现在桌面的左下角呢?或者模态窗体和主窗体一起最小化到任务栏呢?
窗体最小化、最大化等窗体形状的改变最终是有操作系统完成的。Windows系统中有这么一个东西:WM_SYSCOMMAND
它定义了一组消息,这里部分列举如下:
SC_SIZE = 61440;
SC_MOVE = 61456;
SC_MINIMIZE = 61472;
SC_MAXIMIZE = 61488;
SC_NEXTWINDOW = 61504;
SC_PREVWINDOW = 61520;
SC_CLOSE = 61536;
SC_VSCROLL = 61552;
SC_HSCROLL = 61568;
SC_MOUSEMENU = 61584;
......
所以,如果要达到上述效果,可以拦截Windows中的这些消息。下面使用程序来说明:
首先,在模态窗体中定义如下过程(delphi6):
procedure WmSysCommand(var msg: TMessage);message WM_SYSCOMMAND;
实现如下:
procedure WmSysCommand(var msg: TMessage);
begin
if msg.WParam = SC_MINIMIZE then
begin
Application.Minimize;
end
else if (msg.WParam = SC_MAXIMIZE) or (msg.WParam = SC_RESTORE) OR (msg.WParam = SC_CLOSE) then
begin
Application.Restore; //如果不加此句,最小化再还原将看不到主窗体,关闭后,主窗体才出来
end;
inherited; //必须加,否则模态窗关闭最大化还原将不能用
end;
程序也可以直接else inherited;
区别就是前者模态窗体最小化后,主窗体最小化到任务栏,并使模态窗体出现在桌面的左下角;后者模态窗体和主窗体一起最小化到任务栏。
这里Application其实是一个工程以创建就有的窗体,只不过他的大小是0*0,所以我们看不到,它是一个全局变量,它的类型是TApplication。TApplication封装了一些属性和方法,有的方法用于创建应用程序的主窗体、激活应用程序,处理消息,添加上下文敏感的帮助以及处理异常。Application.Minimize;对其最小化,Application.Restore; 还原到原来大小和位置。
至此就完成目标了,欢迎大家一起讨论。