2009-10-19 33 views
1

我目前有一些工具欄按鈕,側面有一個小箭頭(TBSTYLE_EX_DRAWDDARROWS),點擊後會導致彈出的上下文菜單顯示在按鈕下方。這是通過構建自定義彈出式菜單並調用TrackPopupMenu來完成的。「粘滯」的MFC彈出菜單

客戶端現在希望能夠從菜單中選擇多個選項關閉之前,使多個選項,可以無需重新打開菜單,並等待一箇中間每一個變化之間的重繪進行修改。

例如:

  1. 用戶點擊下拉按鈕
  2. 出現下拉菜單(模態,無限期用戶動作等待)
  3. 用戶點擊一些項(例如,切換標記)
  4. 定時器(例如,500ms)開始
  5. 如果計時器到期,則關閉菜單並執行所有選定的動作。
  6. 用戶點擊其他項目之前計時器到期後,回到4

我能想出是通過調用TrackPopupMenu多次以重新顯示菜單最好的。這使菜單「閃爍」,當你選擇一個項目,並可能需要我啓動一個線程,以執行超時,我寧願避免。

回答

2

而不是一個菜單,把一個對話框上的選項。對話框可以輕鬆完成所有必需的操作。

單擊它時不會關閉的菜單看起來是錯誤的。一個單獨關閉的對話框似乎也是錯誤的,但它可能是兩個弊端中最小的一個。

編輯:如果有任何我與微軟學到的東西,它不會試圖抵抗默認行爲。如果你這樣做,你會問問題。

如果您正在動態構建菜單,我可以看到自動調整大小可以如何得心應手,但在對話框中執行操作並不困難 - 使對話框變得非常大並且在變得可見之前,列舉子項並採取行動所有矩形的聯合,然後調整大小。如果使用OffsetRect語句,檢查邊界以確保它們在屏幕上。複選框是微不足道的;圖標更少,但仍然不錯。

另一個易於添加的增強功能是在雙擊時立即關閉對話框。

+0

我也不完全賣這個想法,意圖是合理的。至少在這個應用程序中,不得不重新打開每個更改的菜單都很乏味。我考慮過使用除菜單之外的東西,這是一個選項,但菜單提供了相當多的功能,例如自動調整大小以適應其內容,將其自身放置在屏幕上以確保其可見,顯示覆選框/單選按鈕圖標或自定義圖標等,我將不得不手動構建。 – 2009-10-19 22:58:00

1

以下@Mark Ransom的回答,你應該建立一個對話框。但是當你點擊它之外時,你可以使對話框變爲無模式,並使其自動關閉(即對話框失去焦點)。這樣它可以更像一個菜單。

請注意,正常的菜單永遠不會自行消失,您必須單擊菜單(或其選項之一)外的某處以使其消失。

+0

感謝您提出我忘記的一個方面。當你這樣做時,我應該警告你有棘手的邊緣情況,當你失去焦點時依靠消息可能是不夠的。抱歉,我不記得具體情況,但我必須經歷一次,這很痛苦。 – 2009-10-21 18:09:06