我想实现 当我点了窗口最小化按钮 实行隐藏该窗口

解决方案 »

  1.   

    unit   Unit1;   
      interface   
      uses   
          Windows,   Messages,   SysUtils,     
      Classes,   Graphics,   Controls,   Forms,   
          Dialogs,ShellAPI;   
        
      const   
          WM_BARICON=WM_USER+200;   
        
      type   
          TForm1   =   class(TForm)   
          private   
                procedure   WMSysCommand(var   
        Message:   TMessage);   message   WM_SYSCOMMAND;   
                procedure   WMBarIcon(var   
        Message:TMessage);message   WM_BARICON;   
              {   Private   declarations   }   
          public   
              {   Public   declarations   }   
          end;   
        
      var   
          Form1:   TForm1;   
        
      implementation   
        
      {$R   *.DFM}   
      procedure   TForm1.WMSysCommand   
      (var   Message:TMessage);   
      var   
            lpData:PNotifyIconData;   
      begin   
          if   Message.WParam   =   SC_ICON   then   
          begin   
                //如果用户最小化窗口则将窗口   
                //隐藏并在任务栏上添加图标   
                lpData   :=   new(PNotifyIconDataA);   
                lpData.cbSize   :=   88;   
      //SizeOf(PNotifyIconDataA);   
                lpData.Wnd   :=   Form1.Handle;   
                lpData.hIcon   :=   Form1.Icon.Handle;   
                lpData.uCallbackMessage   :=   WM_BARICON;   
                lpData.uID   :=0;   
                lpData.szTip   :=   'Samples';   
                lpData.uFlags   :=   NIF_ICON     
      or   NIF_MESSAGE   or   NIF_TIP;   
                Shell_NotifyIcon(NIM_ADD,lpData);   
                dispose(lpData);   
                Form1.Visible   :=   False;   
          end   
          else   
          begin   
                //如果是其它的SystemCommand消息则调用系统缺省处理函数处理之。   
                DefWindowProc(Form1.Handle,Message.   
      Msg,Message.WParam,Message.LParam);   
          end;   
      //   
      end;   
        
      procedure   TForm1.WMBarIcon(var   Message:TMessage);   
      var   
            lpData:PNotifyIconData;   
      begin   
          if   (Message.LParam   =   WM_LBUTTONDOWN)   then   
            begin   
                //如果用户点击任务栏图标则将图标删除并回复窗口。   
                lpData   :=   new(PNotifyIconDataA);   
                lpData.cbSize   :=   88;//SizeOf(PNotifyIconDataA);   
                lpData.Wnd   :=   Form1.Handle;   
                lpData.hIcon   :=   Form1.Icon.Handle;   
                lpData.uCallbackMessage   :=   WM_BARICON;   
                lpData.uID   :=0;   
                lpData.szTip   :=   'Samples';   
                lpData.uFlags   :=   NIF_ICON   or   NIF_MESSAGE   or   NIF_TIP;   
                Shell_NotifyIcon(NIM_DELETE,lpData);   
                dispose(lpData);   
                Form1.Visible   :=   True;   
            end;   
      end;   
        
      end.   
      

  2.   

    是不是要托盘啊
    实现托盘程序最大最小化动态效果
        windows本身在最大最小化程序时有动态效果,但只对普通程序有效,而对托盘程序没有类似的效果,然而我们可以通过DrawAnimatedRects函数简单的实现最好效果。这个函数只需要指定窗口句柄和动态起始的和结束的两个矩形区域就可以了。unit TestForm;interfaceuses
      Windows, Classes, Forms, Controls, StdCtrls, ExtCtrls;type
      TZoomAction = (zaMinimize, zaMaximize);
      TfrmTest = class(TForm)
      procedure FormClose(Sender: TObject; var Action: TCloseAction);
      procedure FormShow(Sender: TObject);
      private
      { Private declarations }
      public
      { Public declarations }
      end;var
      frmTest: TfrmTest;implementation{$R *.DFM}procedure ZoomEffect(theForm: TForm; theOperation: TZoomAction);
    var
      rcStart: TRect;
      rcEnd: TRect;
      rcTray: TRect;
      hwndTray : hWnd;
      hwndChild: hWnd;
    begin
      { Find the system tray area bounding rectangle }
      hwndTray := FindWindow('Shell_TrayWnd', nil);
      hwndChild := FindWindowEx(hwndTray, 0, 'TrayNotifyWnd', nil);
      GetWindowRect(hwndChild, rcTray);
      { Check for minimize/maximize and swap start/end}
      if theOperation = zaMinimize then
      begin
      rcStart := theForm.BoundsRect;
      rcEnd := rcTray;
      end
      else
      begin
      rcEnd := theForm.BoundsRect;
      rcStart := rcTray;
      end;
      { Here the magic happens... }
      DrawAnimatedRects(theForm.Handle, IDANI_CAPTION, rcStart, rcEnd)
    end;procedure TfrmTest.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      ZoomEffect(Self, zaMinimize);
    end;procedure TfrmTest.FormShow(Sender: TObject);
    begin
      ZoomEffect(Self, zaMaximize);
    end;
    end.放一个TApplicationEvents的组件,在onminmize事件写入:
      ZoomEffect(Self, zaMinimize);//给你一个例子参考
    //运行后在托盘出现图标,在图标有右键菜单,可以显示,最小化,退出程序。
    unit main;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
       ShellAPI, StdCtrls, Menus;
    const
      WM_MYTRAYICONCALLBACK = WM_USER + 1000;type
      TForm1 = class(TForm)
        PopupMenu1: TPopupMenu;
        N1: TMenuItem;
        N2: TMenuItem;
        N3: TMenuItem;
        N4: TMenuItem;
        procedure N1Click(Sender: TObject);
        procedure N2Click(Sender: TObject);
        procedure N3Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        MyTrayIcon: TNotifyIconData;
        procedure WMMyTrayIconCallback (var Msg: TMessage); message WM_MYTRAYICONCALLBACK;  public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.N1Click(Sender: TObject);
    begin
      Self.Visible := True;
      Application.ShowMainForm := Visible;end;procedure TForm1.N2Click(Sender: TObject);
    begin
    Self.Visible := False;
      Application.ShowMainForm := Visible;end;procedure TForm1.N3Click(Sender: TObject);
    begin
       Application.Terminate;end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      Shell_NotifyIcon(NIM_DELETE,@MyTrayIcon);
    end;procedure TForm1.WMMyTrayIconCallback(var Msg: TMessage);
    var
      pPos: TPoint;
    begin
      case Msg.LParam of
        WM_LBUTTONDBLCLK:
        begin
          Visible := not Visible;
          Application.ShowMainForm := Visible;
          SetForegroundWindow(Application.Handle);
        end;
        WM_RBUTTONDOWN:
        begin
          GetCursorPos(pPos);
          PopupMenu1.Popup(pPos.x,pPos.y);
        end;
      end;end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Inherited;
      Self.Visible := False;
      Application.ShowMainForm := Visible;
      { 创建Tray }
      with MyTrayIcon do
      begin
        cbSize := SizeOf(TNotifyIconData);   { 记录TNotifyIconDataA的大小 }
        Wnd := Self.Handle;          { 接收Tray小图标区鼠标事件的窗口的句柄 }
        uID := 1;          { 图标的ID(Tray小图标区鼠标事件的wPara参数的值)}
        uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;  { 此条消息的有效范围(低三位有效)
              NIF_MESSAGE 0x1: uCallbackMessage参数有效
              NIF_ICON 0x2:    hIcon is valid参数有效
              NIF_TIP 0x4:     szTip is valid参数有效 }
        uCallbackMessage := WM_MYTRAYICONCALLBACK; { 系统回送消息的ID }
        hIcon := Application.Icon.Handle;          { 显示在Tray小图标区上的图标的句柄 }
        szTip := '托盘';          { 鼠标移动到图标上时系统显示的提示信息 }
      end;
      Shell_NotifyIcon(NIM_ADD,@MyTrayIcon);end;end.
      

  3.   

    纯正的窗体最小化做法:Form1.windowState:=wsMinimized;     //看一看窗体属性列表的最下面一个类似地,顺便说一下最大化和还原:Form1.windowState:=wsMaximized;     //最大化Form1.windowState:=wsNormal;        //还原
    隐藏窗体的实现:Form1.visible:=false;       //改变visible属性Form1.hide;                 //方法
    另外,隐藏后要再次显示的实现:Form1.show;
    Form1.windowState:=wsMaximized;        //使窗体最大化;或者用wsNormal,使窗体还原
      

  4.   

    补充:
    隐藏窗体是 Form1.visible:=false; 或者 Form1.hide; 即可实现,而不是两句齐用;
    但显示窗体最好是两句共用。