我在课程设计中想编写一个计划任务的小程序,
遇到两个问题:1  如何制作人性化的窗体——就是不规则的按钮和窗体。
             2  如何将程序缩小后进入到右下角的任务栏。

解决方案 »

  1.   

    某些程序运行启动后并不出现在任务条中,而是缩小为任务条右下角的一个小图标,当鼠标移到这个小图标上时会出现一些提示信息、单击该小图标会执行一些特定的操作。便如任务条右下角的小喇叭图标,单击它会弹出一个简单的音量控制条,双击会启动另一个更大的音量控制程序。
      在Shell32.DLL动态链接库中包括一个函数Shell_NotifyIconA()可通知Windows在任务条右下角加入一个小图标,可惜该函数的详细说明未收入Delphi的帮助文档中,下面以一个简单的实例来说明如果使用该函数。unit Unit1;interface{ 记住在uses部分中包括 ShellAPI}uses
      Windows, Messages, SysUtils, Classes,
      Graphics, Controls, Forms, Dialogs,
      ShellAPI, StdCtrls;{自定义消息,当小图标捕捉到鼠标事件时Windows向回调函数发送此消息}
    const MY_MESSAGE = WM_USER + 100;type
      TForm1 = class(TForm)
      procedure FormCreate(Sender: TObject);
      procedure FormClose(Sender: TObject; var Action: TCloseAction);
      procedure FormPaint(Sender: TObject);
      private
        procedure OnIconNotify(var Message: TMessage);
          message MY_MESSAGE;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}{当小图标捕捉到鼠标事件时进入此过程}
    procedure TForm1.OnIconNotify(var Message: TMessage);
    const
      Busy: Boolean = false;
    begin
      if not Busy then begin    Busy := true;
        if Message.LParam=WM_LBUTTONDOWN then
          if Application.MessageBox('Are you sure',
             'Exit', MB_YESNO)=IDYES then Close;
        Busy := false;
      end;
    end;{当主Form建立时通知Windows加入小图标}
    procedure TForm1.FormCreate(Sender: TObject);
    var
      nid: TNotifyIconData;
    begin
      nid.cbSize := sizeof(nid); // nid变量的字节数
      nid.Wnd := Handle; // 主窗口句柄
      nid.uID := -1; // 内部标识,可设为任意数
      nid.hIcon := Application.Icon.Handle; // 要加入的图标句柄,可任意指定
      nid.szTip := 'This is a test application'; // 提示字符串
      nid.uCallbackMessage := MY_MESSAGE; // 回调函数消息  nid.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE; // 指明哪些字段有效
      if not Shell_NotifyIcon(NIM_ADD, @nid) then begin
        ShowMessage('Failed!');
        Application.Terminate;
      end;
      {将程序的窗口样式设为TOOL窗口,可避免在任务条上出现}
      SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
    end;{程序被关闭时通知Windows去掉小图标}
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    var
      nid: TNotifyIconData;
    begin
      nid.cbSize := sizeof(nid); // nid变量的字节数
      nid.uID := -1; //内部标识,与加入小图标时的数一致
      nid.Wnd := Handle; //主窗口句柄
      Shell_NotifyIcon(NIM_DELETE, @nid); //去掉小图标end;{主窗口初始化完毕并显示时将激活Paint重画事件,此时将主窗口隐藏}
    procedure TForm1.FormPaint(Sender: TObject);
    begin
      Hide;
    end;end.
       上例中将程序的图标放在任务条右下角,然后隐藏自身,当用户移动鼠标至该图标上时会看到提示字符串,如果单击该图标会出现一个对话框,选择Yes退出程序并清除小图标。
      

  2.   

    procedure TForm1.FormClick(Sender: TObject); 
    var 
      R : HRgn; 
    begin 
      if IsRound then 
        begin 
          SetWindowRgn(Handle,0,True); 
          DeleteObject(R); 
          IsRound := False; 
        end 
      else 
        begin 
          R := CreateEllipticRgn(-15,-15,Width+15,Height+15);       SetWindowRgn(Handle,R,True); 
          IsRound := True; 
        end; 
    end; 
      
    procedure TForm1.FormCreate(Sender: TObject); 
    begin 
      IsRound := False; 
    end; 
      
    end. 
    ////////////////////////////////////////////
    四四方方的窗体也会变形,利用win32 API函数setwindowrgn就可以将窗口定义为任何形状,以下是将窗口定义为园角矩形的例子:
    procedure TPortForm.FormCreate(Sender: Tobject);
    var hr :thandle;
    begin
    hr:=createroundrectrgn(0,0,width,height,20,20);//定义园角矩形(win API函数)
    setwindowrgn(handle,hr,true); //设置园角窗口
    end;
    为了使该窗口更好,应在onResize事件处理程序放相同的代码。
    /////////////////////////////////////
    用汉字做窗体形状
    procedure TForm1.FormCreate(Sender: TObject);
    var
    rgn:HRGN;
    begin
     BeginPath(Canvas.Handle);
     SetBkMode( Canvas.Handle, TRANSPARENT );
     Canvas.Font.Name:= '宋体';
     Canvas.Font.Size:=100;
     Canvas.TextOut( 20, 20, '漂亮吗?');//用"漂亮吗?"作为form的形状
     EndPath(Canvas.Handle);
     rgn:= PathToRegion(Canvas.Handle);
     SetWindowRgn( Handle, rgn, true );
    end;
      

  3.   

    showwindows()這個API就可以搞定了。。
    請看“API參考大全”上面有關的詳細描述,或者找MSDN的資料也行。。
      

  4.   

    我告诉你,cooltrayicon是最爽的!
    能满足你所有的需要。可以说吧systray发挥到了及至!
      

  5.   

    Delphi有自带的例子。自己找找看,我记不得了!
      

  6.   

    然后在在POP菜单上加最大化就可以啦
      

  7.   

    感谢(浪子)和大家!
    我在网上找到了一个非常好的Delphi程序员的界面增强VCL组件:
    http://www.sunistudio.com/suipack/kanyi  看一下就知道!
     可惜是试用版!!