作了一个托盘程序,  用PopupMenu控件给它作了一个菜单,运行没有问题,但是菜单就是弹不出来,很气人!
   我要做的功能是这样的:
   一.鼠标移到托盘图标上将出现提示,这个提示是变化的,在点击form上的bitbtn之前提示为固定信息;点击之后希望他能提示一个edit中的内容,但是我怎么做,都只能显示一个且固定的信息,怎么回事??
   二.希望在托盘图标上点左键弹出form(程序一运行,这个form在任务栏上没有图标,点bitbtn之后form消失),点右键弹出菜单PopupMenu,但是实现不了,图标好象死了;在上面左右键齐击会弹出系统的任务栏菜单,很怪!实在没辙了,希望高手指点!
谢谢!可以在加分的!

解决方案 »

  1.   

    一)
    响应按钮函数
    shell_notifyicon(nim_delete, @my_tray_icon);
    my_tray_icon.sztip := 'aaaaa';
    shell_notifyicon(nim_add, @my_tray_icon);
    先删掉托盘,再赋值,再添加
    二)
    const
      wm_traynotify=wm_user+1000;type
      TForm1 = class(TForm)
        。。
        。。
        private
        { Private declarations }
        my_tray_icon: TnotifyIconData;
        procedure OnNotify(var msg: Tmessage);
        message wm_traynotify;
      public
        { Public declarations }
      end;。
    procedure TForm1.OnNotify(var msg: Tmessage);
    var
      cursorpos: TPoint;
    begin
      case msg.LParam of
        wm_lbuttondown:
          begin
            visible := not visible;
            application.ShowMainForm := visible;
            setforegroundwindow(application.handle);
          end;
        wm_rbuttondown:
          begin
            GetCursorPos(cursorpos);
            popupmenu1.Popup(cursorpos.x, cursorpos.y);
          end;
      end;
    end;
      

  2.   

    //制作托盘
    unit tp;
    interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, jpeg, ExtCtrls,ShellApi, Menus, StdCtrls;
    const
      ICON_ID  = 1;
      My_ICONEVENT = WM_USER + 1;
    type
      TMyTest = class(TForm)
        Image1: TImage;
        pop1: TPopupMenu;
        showform: TMenuItem;
        N1: TMenuItem;
        Memo1: TMemo;
        Button1: TButton;
        Timer1: TTimer;
        procedure FormCreate(Sender: TObject);
        procedure N1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure showformClick(Sender: TObject);
      private
        procedure InitIcon;
        procedure UnInstallIcon;
        procedure IConOnclick(var Myss:TMessage);message My_ICONEVENT;
        procedure WMSysCommand(var Sysss: TWMSysCommand);message WM_SYSCOMMAND;
      public
      end;
    var
      MyTest: TMyTest;
    implementation
    {$R *.dfm}
    procedure TMyTest.WMSysCommand(var Sysss: TWMSysCommand); //拦截系统消息
    begin
      with Sysss do
      begin
        if (CmdType and $FFF0 = SC_MINIMIZE) or (CmdType and $FFF0 = SC_CLOSE) then
        begin
          ShowWindow(MyTest.Handle,SW_HIDE);
          Exit;
        end;
        inherited;
      end;
    end;
    procedure TMyTest.ICononclick(var Myss:TMessage);
    var p: TPoint;
    begin
      if (Myss.lParam = WM_RBUTTONDOWN) or (Myss.lParam = WM_LBUTTONDBLCLK) then
      begin
        GetCursorPos(p);
        pop1.Popup(p.x,p.y);
      end;
    end;
    procedure TMyTest.InitIcon;
    Var MyNotify:TNotifyIconData;
    begin
      MyNotify.cbSize:=Sizeof(MyNotify);
      MyNotify.Wnd:=handle;
      MyNotify.uID := ICON_ID;
      MyNotify.uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
      MyNotify.uCallbackMessage:=My_ICONEVENT;
      MyNotify.hIcon :=Image1.Picture.Icon.Handle;
      MyNotify.szTip :='MyTest';
      Shell_NotifyIcon(NIM_ADD,@MyNotify);
    end;    
    procedure TMyTest.FormCreate(Sender: TObject);
    begin
      InitIcon;
      SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
      //设置应用程序状态栏目不显示
    end;
    procedure TMyTest.N1Click(Sender: TObject);
    begin
      close;
    end;
    procedure TMyTest.UnInstallIcon; //卸载图标
    var IconData: TNotifyIconData;
    begin
      IconData.cbSize := SizeOf(IconData);
      IconData.Wnd := Handle;
      IconData.uID := ICON_ID;
      Shell_NotifyIcon(NIM_DELETE,@IconData);
    end;
    procedure TMyTest.FormDestroy(Sender: TObject);
    begin
      UnInstallIcon;
    end;
    procedure TMyTest.Timer1Timer(Sender: TObject);
    begin
      Timer1.Enabled:=False;
      ShowWindow(MyTest.Handle,SW_HIDE);
    end;
    procedure TMyTest.showformClick(Sender: TObject);
    begin
      ShowWindow(MyTest.Handle,SW_SHOWNORMAL);
      SetForegroundWindow(application.handle);//激活应用程序为前台,此处可以省掉
    end;
    end.
      

  3.   

    谢谢上面两位,菜单问题自己已经解决,症结在于接收Tray小图标区鼠标事件的wnd不能用application.handle,只能用handle;只是还有一点不足,菜单弹出后点击别的地方不自动消失,还有就是点击菜单上面的命令就打上了对钩,再点对钩就没了,不知怎么回事?我的图标信息是这样:
    点击Bitbtn之前显示lstrcpy(IconData.szTip,pchar('...............'));
    点击Bitbtn之后显示lstrcpy(IconData.szTip,pchar('.......:'+Datetimetostr(t)));
        其中t是Tdatetime类型的变量,如果只用第二种提示,点击bitbtn之后Edit中的内容已经变化,但是显示的信息还是没有变化,不知怎么回事?谢谢!
      

  4.   

    借用一些代码
    popupmenu1.Popup(cursorpos.x, cursorpos.y);//弹菜单
    pplication.processmessage;//这样可以解决第一个问题第二个没看懂
      

  5.   

    现在仍有两个问题没有解决:
        1,提示不能动态变化;我怎么试,显示HINT的代码只能放到安装TRAY图标的过程里,放到其他任何地方hint显示为一个乱码;到底怎样在Bitbtn按钮down之前显示一个固定信息,在之后显示一个动态信息,这个信息是一个 edit 的内容?
        2,托盘菜单弹出后为何点击桌面或者其他窗口菜单不消失?  好象是必须要执行一个菜单按钮命令才消失,为什么?企求高手的解答!
    谢谢!(分数还可以再加)
      

  6.   

    1,提示不能动态变化;我怎么试,显示HINT的代码只能放到安装TRAY图标的过程里,放到其他任何地方hint显示为一个乱码;到底怎样在Bitbtn按钮down之前显示一个固定信息,在之后显示一个动态信息,这个信息是一个 edit 的内容?
        2,托盘菜单弹出后为何点击桌面或者其他窗口菜单不消失?  好象是必须要执行一个菜单按钮命令才消失,为什么?企求高手的解答!
    谢谢!(分数还可以再加)
      

  7.   

    呵呵  看来这里没有高手了!
    我也出现过一样的问题,不过解决了
    在  大富翁 论坛找到的答案:
        1。application和form的概念要弄清楚,这里往往出现问题;还有一点,你的 TNotifyIconData 类型的变量应该是全局变量,否则不能重新modify图标内容;
        2。应该使程序和图标同属前台才对:
           GetCursorPos(pt);
           //使主窗口进入前台服务
           SetForegroundWindow(form1.Handle);
           PopupMenu1.Popup(pt.x,pt.y);
         这回应该可以了.............
      

  8.   

    又是一个不眠夜,CSDN要戒严了。记得葛优(演的一个人物)曾经说过:“……什么人都可以惹,唯独小人不能沾。”初春的一场小雪,纷纷扬扬地下着,掩饰了大地,掩盖了一切人间的罪恶。上帝说:“有阳光就有黑暗,有善举就有罪过。饶恕他吧。”