Delphi动态弹出菜单是如何响应WM_COMMAND消息的?? 

解决方案 »

  1.   

    楼主是问的POPUPMUNU实现机制么?要分析也挺容易的..建一个新工程,加点必要东西, 在POPUPMENU事件里设断点.
    断下来后,看CALLSTACKS,就会看到类似如下内容:
    -------------------------------------------------
    TForm1.N11Click($D63A20)
    TMenuItem.Click
    TMenu.DispatchCommand(1)
    TPopupList.WndProc((273, 1, 0, 0, 1, 0, 0, 0, 0, 0))
    TPopupList.MainWndProc((273, 1, 0, 0, 1, 0, 0, 0, 0, 0))
    StdWndProc(199292,273,1,0)
    TApplication.ProcessMessage((199292, 273, 1, 0, 25296687, (514, 299)))
    TApplication.HandleMessage
    TApplication.Run
    Project1
    ------------------------------------------------------
    从底向上,就是函数调用的流程..然后在VCL源码MENUS.PAS里看
    procedure TPopupList.WndProc的定义
    -----------------------------------------------------
    .....
      case Message.Msg of
        WM_COMMAND:
          for I := 0 to Count - 1 do
            if TPopupMenu(Items[I]).DispatchCommand(Message.wParam) then Exit;
    ........
    -----------------------------------------------------这样就可以清楚整个流程.OK?
      

  2.   

    procedure TForm1.aclick(Sender: TObject);
    begin
      showmessage('itema');
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      itema: TMenuItem;
    begin
      itema:=Tmenuitem.Create(self);
      itema.Caption:='a';
      itema.OnClick:=aclick;
      popupmenu1.Items.Add(itema);
    end;