模态对话框最小化问题

        目前做的一个东西,在一个窗体中显示模态窗体,当模态窗体最小化时,不见了,主窗体依然在那。查了一些资料,处理办法都不太明确,现在谈谈如何解决这种情况。

产生这种情况主要是模态窗体最小化后,应用程序丢失焦点,只有再次点击主窗体才会是模态窗体获得焦点,看到它在出现在主窗体的左下角。

       那我如何使模态窗体最小化后,主窗体最小化到任务栏,并使模态窗体出现在桌面的左下角呢?或者模态窗体和主窗体一起最小化到任务栏呢?

        窗体最小化、最大化等窗体形状的改变最终是有操作系统完成的。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; 还原到原来大小和位置。

至此就完成目标了,欢迎大家一起讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值