在需要弹出菜单的控件的onmousedown事件中加入语句
procedure TFrmprice.Button2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then
PopupMenu1.Popup((Button2.Left+Button2.Width+Left+8),(Button2.Top+Button2.Height+Panel1.Top+Top+4));
end;
procedure TFrmprice.Button2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then
PopupMenu1.Popup((Button2.Left+Button2.Width+Left+8),(Button2.Top+Button2.Height+Panel1.Top+Top+4));
end;
var
p: TPoint;
begin
GetCursorPos(p);
PopupMenu1.Popup(p.x ,p.y);想在哪儿弹出来都可以
我想让它在BitBtn(或Button)的正上方弹出呢?
正如,系统的开始菜单。
一般PopupMenu是在(left,top)弹出的,默认的
bitbtn按钮,其余一样。
popupmenu1.autopopup:=false;
procedure TForm1.BitBtn1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
pt:tpoint;
begin
pt.x:=bitbtn1.Left;
pt.y:=bitbtn1.top+bitbtn1.Height;
pt:=clienttoscreen(pt);//坐标转换
if button=mbleft then
popupmenu1.popup(pt.x,pt.y);
end;
期待回音...
p: TPoint;
begin
GetCursorPos(p);
PopupMenu1.Popup(p.x ,p.y);
弟兄,我查了资料,但没查到,正在寻求方法。
用api函数能否实现,我再查查。
//定位的,并且要二次单击,第一次单击弹出点在BitBtn的(left,top)处,
//程式还在完善当中。//如果能重载PopupMenu中的方法,实现弹出点在PopupMenu的左下角或者右下
//角,问题就好办了,期待高手...//以下是我的实现方式,请改善之,谢过了先unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, StdCtrls, Buttons, fcOutlookList, fcButton, fcImgBtn, fcShapeBtn,
ExtCtrls, fcClearPanel, fcButtonGroup, fcOutlookBar;type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
BitBtn1: TBitBtn;
Open: TMenuItem;
Save: TMenuItem;
N1: TMenuItem;
Exit: TMenuItem;
N2: TMenuItem;
N21: TMenuItem;
N51: TMenuItem;
N61: TMenuItem;
N3: TMenuItem;
N71: TMenuItem;
procedure BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
Function GetPopMenuHeight(Sender: TObject): Integer;
//获得PopupMenu菜单项的总高度
{ Public declarations }
end;var
Form1: TForm1;
tHeight: Integer;implementation{$R *.DFM}//获得PopupMenu菜单项的总高度
Function TForm1.GetPopMenuHeight(Sender: TObject): Integer;
var
i,mHeight,sHeight: Integer;
vRect: TRect;
begin
sHeight := 0;
//mHeight := 0; for i := 0 to PopupMenu1.Items.Count - 1 do
begin
GetMenuItemRect(self.Handle, PopupMenu1.Handle, PopupMenu1.Items[i].MenuIndex, vRect);
mHeight := vRect.Bottom - vRect.Top; //每个菜单项的高度
sHeight := sHeight + mHeight;
end; result := sHeight;
end;procedure TForm1.BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
ScrP: TPoint;
begin
tHeight := self.GetPopMenuHeight(self); x := BitBtn1.Left;
y := BitBtn1.Top - tHeight; ScrP := ClientToScreen(point(x,y));
if Button = mbleft then
PopupMenu1.Popup(scrp.x,ScrP.y);
end;end.// end of the Program
//都往里边拖,说明:真正用到了一个BitBtn和PopupMenu(不过菜单中适当
//加点菜单项,测试用。//以下再贴出:unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, StdCtrls, Buttons, ExtCtrls;type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
BitBtn1: TBitBtn;
Open: TMenuItem;
Save: TMenuItem;
N1: TMenuItem;
Exit: TMenuItem;
N2: TMenuItem;
N21: TMenuItem;
N51: TMenuItem;
N61: TMenuItem;
N3: TMenuItem;
N71: TMenuItem;
procedure BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
Function GetPopMenuHeight(Sender: TObject): Integer;
//获得PopupMenu菜单项的总高度
{ Public declarations }
end;var
Form1: TForm1;
tHeight: Integer;implementation
{$R *.DFM}//获得PopupMenu菜单项的总高度
Function TForm1.GetPopMenuHeight(Sender: TObject): Integer;
var
i,mHeight,sHeight: Integer;
vRect: TRect;
begin
sHeight := 0;
//mHeight := 0; for i := 0 to PopupMenu1.Items.Count - 1 do
begin
GetMenuItemRect(self.Handle, PopupMenu1.Handle, PopupMenu1.Items[i].MenuIndex, vRect);
mHeight := vRect.Bottom - vRect.Top; //每个菜单项的高度
sHeight := sHeight + mHeight;
end; result := sHeight;
end;procedure TForm1.BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
ScrP: TPoint;
begin
tHeight := GetPopMenuHeight(self); x := BitBtn1.Left;
y := BitBtn1.Top - tHeight; ScrP := ClientToScreen(point(x,y));
if Button = mbleft then
PopupMenu1.Popup(scrp.x,ScrP.y);
end;end.
//那位高手救一下,帮我完善楼上的那段代码(要两次单击才能实现,本意
//是一次单击阿!)unit Unit2;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, Menus;type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
BitBtn1: TBitBtn;
Open1: TMenuItem;
Close1: TMenuItem;
N1: TMenuItem;
save1: TMenuItem;
N2: TMenuItem;
Exit1: TMenuItem;
procedure BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
SP: TPoint;
begin
x := BitBtn1.Left;
y := BitBtn1.Top; sp := clientToscreen(point(x,y)); if button = mbleft then
TrackPopupMenu(self.PopupMenu1.Handle,TPM_LEFTALIGN or TPM_BOTTOMALIGN,sp.x,sp.y,0,self.Handle,nil);end;end.