2015-07-19 71 views
2

當點擊一個按鈕時,我打開一個彈出式菜單,例如,使用popupMenu.popup()。 要選擇一個項目,我必須首先釋放鼠標按鈕,然後點擊一個菜單項來執行它。當釋放物品上的鼠標按鈕時,使彈出窗口關閉

這是「正常」,但我想要的是我不必額外點擊菜單項的行爲。我希望能夠點擊按鈕,在菜單項上移動(仍然按住按鈕),並在釋放鼠標按鈕後立即執行它。 這與級聯子菜單的工作方式類似。

我試過使用TrackPopupMenu掛鉤消息並在按鈕釋放時執行該項目的方式。這可行,但... 在彈出菜單(位圖或圖像列表項目)中使用圖像和TrackPopupMenu時,菜單不會顯示任何條目。每個條目都有一些像素寬而空。你可以盲目地使用它們,所以它們以某種方式工作,但是繪製不正確。

我正在使用Delphi XE2 Pro。

我也試圖找到一般的文章掛鉤到菜單消息,但沒有找到任何工作,沒有使用TrackPopupMenu。也許有一種方法讓TrackPopupMenu顯示帶有圖像的菜單? 任何幫助,非常感謝。

回答

1

您路由菜單消息發送到錯誤的窗口過程中,要傳遞的形式的手柄TrackPopupMenu(你應該張貼您的代碼,那麼就沒有必要猜測你做錯了什麼。而你可能會收到更快的回覆)。

窗體菜單支持窗口菜單。當表單窗口過程收到一個,比如說WM_DRAWITEM時,它只在該項目屬於窗口菜單時纔會繪製該項目。對於彈出式菜單,VCL使用可通過全球PopupList訪問的實用程序窗口。看下面的例子。

var 
    Pt: TPoint; 
begin 
    Pt := Button1.ClientToScreen(Point(0, Button1.Height)); 
    TrackPopupMenu(PopupMenu1.Handle, TPM_LEFTBUTTON, Pt.X, Pt.Y, 0, 
     PopupList.Window, nil); 
+0

非常好!那是錯誤的。並讓我感覺更加愚蠢:只要您像使用示例一樣使用TrackPopupMenu,它就會按照我所需的方式運行,而無需執行任何額外的消息處理。它打開彈出窗口,當我釋放菜單項上的按鈕時,立即執行它。 非常感謝! –

相關問題