2012-07-25 104 views
10

TPopupMenu如何与表单的右侧对齐?问题是在调用Popup(X, Y: Integer)之前似乎没有办法获得弹出式菜单的宽度。将TPopupMenu与表单的右侧对齐?

我试图得到一个类似于Chrome中系统菜单的行为。

enter image description here

+0

重复:[Windows操作系统。更改下拉菜单位置](http://stackoverflow.com/q/4721989) – 2012-07-25 11:37:41

+0

@Sertac - 我不明白这是一个重复的问题。 a)它用Delphi标记。 b)它不是简单地移动弹出窗口。它要求菜单的宽度是已知的,所以可以计算位置。 – norgepaul 2012-07-25 11:46:56

+0

在移动菜单窗口之前,您可以获取其大小/位置。 VCL不提供您要求的功能,因此您必须使用api调用。我认为这使得它是重复的,但也许不是。 – 2012-07-25 11:51:21

回答

12

你也可以只设置AlignmentpaRight,并呼吁

with ClientToScreen(Point(ClientWidth - 1, 0)) do 
    Popup(X, Y); 
+1

非常简单!优秀! – Whiler 2012-07-25 13:56:56

+0

对于纯VCL解决方案+1(如“知道Win API是好的,但知道如何不使用它更好_”) – 2012-07-25 18:00:35

+0

完美。很好的回答:) – norgepaul 2012-07-25 20:19:37

12

最简单的解决办法是将自己推出的弹出式菜单:为TrackPopupMenu或各种标志的意思

procedure TForm1.Panel1ContextPopup(Sender: TObject; MousePos: TPoint; 
    var Handled: Boolean); 
var 
    PopupPt: TPoint; 
begin 
    PopupPt := ClientToScreen(Point(ClientWidth, 0)); 
    TrackPopupMenu(PopupMenu1.Handle, TPM_RIGHTALIGN or TPM_TOPALIGN, 
     PopupPt.X, PopupPt.Y, 0, PopupList.Window, nil); 
end; 

见文档TrackPopupMenuEx

+1

+1一如既往的出色工作 – 2012-07-25 12:19:15

+0

+1,塞尔特克 - 大卫说。 :-) – 2012-07-25 12:20:35

+0

+1 - 肯说,大卫说:) – Shambhala 2012-07-25 15:47:29