怎么实现 弹出菜单TPopupMenu,在 鼠标右键点击弹出时,无论在什么位置点都是向上弹出。
有知道的吗,谢谢。

解决方案 »

  1.   

    这个估计的修改vcl的核心代码了。:)
      

  2.   

    控制好弹出菜单左下角那一点坐标procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var P:TPoint;
    begin
      if Button=mbRight then
      begin
         GetCursorPos(P);
         PopupMenu1.Popup(P.X,P.Y-18*(PopupMenu1.Items.Count+1)+12);
      end;
    end;如果弹出菜单里面含有分界线,就要再修改一下弹出时的Y坐标
      

  3.   

    你这想法可真有意思,人家Windows做的挺好,根据鼠标位置以及菜单的高度来判断。没想过、没试过。也不知道有啥必要。^_^
      

  4.   

    自己控制菜单弹出的恐怕难度较大。其实“开始”按钮也不是这样做的,它只是控制了
    菜单弹出的位置而已,而菜单如何弹出根本不必去管,把任务栏拖放到屏幕四周就知道
    了。下面是向上弹出的例子,注意PopupMenu的MainAnimation设置为maTopToBottom,
    按钮位置在靠近屏幕下端附近,Button1为TSpeedButton,AllowAllUp设为True,
    GroupIndex设为1。
    procedure TForm1.Button1Click(Sender: TObject);
    var
         Pos: TPoint;
    begin
         if Button1.tag=0 then
         begin
              Pos :=Button1.ClientToScreen(Point(0,0));
              Button1.Down :=true;
              p1.Popup(Pos.x, Pos.y);
              Button1.tag :=1;
         end
         else
         begin
              Button1.Down :=false;
              Button1.tag :=0;
         end;
    end;
      

  5.   

    参考如下代码:
    var
      P: PTPMParams;
    begin
      if Button = mbRight then
      begin
        GetMem(P, sizeof(TTPMParams));
        P^.cbSize := sizeof(TTPMParams);
        P^.rcExclude := Rect(Mouse.CursorPos.X, Mouse.CursorPos.Y,
          Screen.Width, Screen.Height);
        TrackPopupMenuEx(PopupMenu1.Handle, TPM_CENTERALIGN or TPM_VERTICAL, Mouse.CursorPos.X,
          Mouse.CursorPos.Y, Handle, P);
        FreeMem(P);
      end;
    end;
    默认是向上的,但当你的菜单高出屏幕上方时,系统会自动将菜单变向向下,因为它要保证菜单看得到。
    不过在屏幕的大部分范围都可以是向上的了。
      

  6.   

    另:该段代码是OnMouseUp事件中写的。