给ToolButton关联一个PopupMenu, 点击ToolButton就弹出PopupMenu。如果不用鼠标去点击,而是通过给ToolButton发消息让PopupMenu弹出来,可以做到吗?怎么做?

解决方案 »

  1.   

    PopupMenu1.Popup(ToolButton.Top,ToolButton.Left);
      

  2.   

    楼上的菜单位置可能有出入:
    var
      pt: TPoint;   GetCursorPos(pt);
      PopupMenu1.Popup(pt.X,pt.Y);
      

  3.   

    感谢上面两位朋友的回复,不过我是想知道如何给ToolButton发消息,让PopupMenu弹出来,而不是直接去操作PopupMenu。
      

  4.   

    没有点
    toolbuttonclick(nil);
      

  5.   

    不知道你说的是哪种发消息,看下面的中意不?
    定义:
    const
       MY_MSG = WM_USER+100;procedure MyMsg(var Msg: TMessage);message MY_MSG;
    begin
      toolbuttonclick(nil);
    end;响应:
     postmessage(Handle,MY_MSG,0,0);
      

  6.   

    调用ToolButton的Click方法,无法弹出PopupMenu。ToolButton没有Handle, 所以无法通过PostMessage来发消息。
    ToolButton有个Perform方法,可以用来处理消息,就不知道怎么用,我试了几个常用的消息,都没反应。
      

  7.   

    handle是当前窗体的handle,此窗体包含了消息定义,和响应.....unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus, ComCtrls, ToolWin, StdCtrls;
    const
      MY_MSG = WM_USER+100;type
      TForm1 = class(TForm)
        ToolBar1: TToolBar;
        ToolButton1: TToolButton;
        PopupMenu1: TPopupMenu;
        OK1: TMenuItem;
        Button1: TButton;
        procedure ToolButton1Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        procedure MYMSG(var MSG: TMessage);message MY_MSG;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.MYMSG(var MSG: TMessage);
    begin
      ToolButton1Click(nil);
    end;procedure TForm1.ToolButton1Click(Sender: TObject);
    begin
      PopupMenu1.Popup(ToolButton1.Left,ToolButton1.Top);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      PostMessage(Handle,MY_MSG,0,0);
    end;end.
      

  8.   

    追踪的TToolButton的源代码,终于找到答案,原来是这样with Message do
        case NMHdr^.code of
          TBN_DROPDOWN:
            with PNMToolBar(NMHdr)^ do
              { We can safely assume that a TBN_DROPDOWN message was generated by a
                TToolButton and not any TControl. }
              if Perform(TB_GETBUTTON, iItem, Longint(@tbButton)) <> 0 then
              begin
                Button := TToolButton(tbButton.dwData);
                if Button <> nil then
                  Button.CheckMenuDropDown;
              end;
    ............感谢cnzzlp(啊*菠萝)的解答。
      

  9.   

    一个最简单的方法
    ToolBar1.TrackMenu(ToolButton1)
    如果要控制消息的话需要向ToolBar发送SYSCOMMAND消息