2012-07-25 107 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