窗体关闭和最小化的事件。

时间:2021-10-10 23:44:55
现有Form1和Form2,其中form1是启动窗体,form1中有button,点击事件代码:
this->Hide();
Form2->Show();

现在在任务栏上,右键点击会出现 窗体关闭和最小化的事件。
如何才能,实现选择“关闭”后,执行窗体最小化的事件。(现在点击‘关闭’,应用程序会结束)

12 个解决方案

#1


void __fastcall TForm2::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  CanClose = false;
  Application->Minimize();
}

但这时用Close()就退不出程序了,得搞个按钮或菜单来执行Application->Terminate();

#2


引用 1 楼 samchoy 的回复:
C/C++ code
void __fastcall TForm2::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  CanClose = false;
  Application->Minimize();
}

但这时用Close()就退不出程序了,得搞个按钮或菜单来执行Application->Terminate()……


点击关闭,仍然要退出应用程序....

#3


说明下,我的环境是BCB6,谢谢。

#4


恩,应该写Form1的OnCloseQuery才对

#5


然后再Form2的OnCloseQuery中写
Application->Terminate();
就能退出程序了
窗体关闭和最小化的事件。

#6


截获窗体的WM_SYSCOMMAND消息,判断Msg.WParam == SC_CLOSE时执行最小化操作,并且直接返回。
设一个全局的bool标志,当需要关闭时,将此标志设为true,并且在截获消息中判断一下。

#7


引用 6 楼 ccrun 的回复:
截获窗体的WM_SYSCOMMAND消息,判断Msg.WParam == SC_CLOSE时执行最小化操作,并且直接返回。
设一个全局的bool标志,当需要关闭时,将此标志设为true,并且在截获消息中判断一下。

妖哥的意思是:

如果要form2的任务栏右键“关闭”事件实现隐藏该窗体(不结束应用程序),要这样写?

void __fastcall TForm2::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
   if(Msg.hwnd==Application->Handle)
   {
     if(Msg.message==WM_SYSCOMMAND && Msg.wParam==SC_CLOSE)
      {
        Hide();
        Handled=true;
      }
   }

}

#8


这样一来,form2的任务栏右键“关闭”能实现该窗体隐藏,并不结束应用程序;但程序启动的时候(不点击form1中的button之前),form1的任务栏右键“关闭”却不起作用了。

#9


你应该把ApplicationEvents组件放到主窗体也就是Form1上,然后相应的,把OnMessage事件的处理函数也写到Form1的单元中。

#10


引用 9 楼 ccrun 的回复:
你应该把ApplicationEvents组件放到主窗体也就是Form1上,然后相应的,把OnMessage事件的处理函数也写到Form1的单元中。

按照上面做了后,form2的的任务栏右键“关闭”却不起作用了。

#11


我现在用Win7,没有办法测试你说的情况。那你在两个Form里都加入ApplicatinEvents试试。

#12


恩,我就是在2个窗体都加了ApplicatinEvents,才正常了。多谢大家了

#1


void __fastcall TForm2::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  CanClose = false;
  Application->Minimize();
}

但这时用Close()就退不出程序了,得搞个按钮或菜单来执行Application->Terminate();

#2


引用 1 楼 samchoy 的回复:
C/C++ code
void __fastcall TForm2::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  CanClose = false;
  Application->Minimize();
}

但这时用Close()就退不出程序了,得搞个按钮或菜单来执行Application->Terminate()……


点击关闭,仍然要退出应用程序....

#3


说明下,我的环境是BCB6,谢谢。

#4


恩,应该写Form1的OnCloseQuery才对

#5


然后再Form2的OnCloseQuery中写
Application->Terminate();
就能退出程序了
窗体关闭和最小化的事件。

#6


截获窗体的WM_SYSCOMMAND消息,判断Msg.WParam == SC_CLOSE时执行最小化操作,并且直接返回。
设一个全局的bool标志,当需要关闭时,将此标志设为true,并且在截获消息中判断一下。

#7


引用 6 楼 ccrun 的回复:
截获窗体的WM_SYSCOMMAND消息,判断Msg.WParam == SC_CLOSE时执行最小化操作,并且直接返回。
设一个全局的bool标志,当需要关闭时,将此标志设为true,并且在截获消息中判断一下。

妖哥的意思是:

如果要form2的任务栏右键“关闭”事件实现隐藏该窗体(不结束应用程序),要这样写?

void __fastcall TForm2::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
   if(Msg.hwnd==Application->Handle)
   {
     if(Msg.message==WM_SYSCOMMAND && Msg.wParam==SC_CLOSE)
      {
        Hide();
        Handled=true;
      }
   }

}

#8


这样一来,form2的任务栏右键“关闭”能实现该窗体隐藏,并不结束应用程序;但程序启动的时候(不点击form1中的button之前),form1的任务栏右键“关闭”却不起作用了。

#9


你应该把ApplicationEvents组件放到主窗体也就是Form1上,然后相应的,把OnMessage事件的处理函数也写到Form1的单元中。

#10


引用 9 楼 ccrun 的回复:
你应该把ApplicationEvents组件放到主窗体也就是Form1上,然后相应的,把OnMessage事件的处理函数也写到Form1的单元中。

按照上面做了后,form2的的任务栏右键“关闭”却不起作用了。

#11


我现在用Win7,没有办法测试你说的情况。那你在两个Form里都加入ApplicatinEvents试试。

#12


恩,我就是在2个窗体都加了ApplicatinEvents,才正常了。多谢大家了