2010-02-28 48 views
2

我試圖將上下文菜單添加到我的應用程序中的(大)自定義控件中,但遇到了與何時創建它們有關的許多問題。wxWidgets和上下文菜單

有3種情況需要在按下菜單鍵和Shift + F10時右鍵單擊需要創建上下文菜單(除非我忘了一個...)。在所有情況下,菜單都是通過ContextMenu方法創建和顯示的。

右鍵還有其他一些特殊的東西,所以不應該總是創建一個上下文菜單。我正在處理各種鼠標事件,並根據需要調用ContextMenu,這一切都很好。

問題出在鍵盤生成的上下文菜單上。我在EVT_CONTEXT_MENU的控件中設置了一個處理程序,然後調用ContextMenu。在很多情況下,這兩個組合鍵似乎都被忽略了。有時候Shift + F10可以正常工作,但在相同的情況下,菜單鍵以某種方式調用我的鼠標右鍵單擊處理程序,導致不正確的行爲...

對於菜單鍵,我也嘗試處理鍵事件,菜單鍵似乎從來沒有在wxWidgets中引發這些雖然都是其他按鍵似乎很好地工作......

  1. 所以被莫名其妙的wxWidgets忽略的關鍵方法。只要控制權集中,他們就應該工作。當他們開始「工作」他們繼續工作,直到它再次失去焦點,但我不知道爲什麼他們不開始或導致他們開始工作(我不處理任何其他地方的任何上下文菜單或關鍵事件我的測試應用程序)。

  2. 菜單鍵事件如何進入我的EVT_RIGHT_UP處理程序而不是鍵事件或上下文菜單事件?

我認爲它是某種根本性錯誤我的wxWidgets的是如何處理這些鍵的理解,但是已經看的文檔周圍,在網上有一段時間我還沒有發現關於我的問題的任何信息。

我在Windows Vista上使用wxMSW 2.8.10。

回答

2

wxWidgets是一個抽象出平臺差異的庫,例如鼠標或鍵盤事件應該導致出現上下文菜單。可能存在差異,例如是否出現在鼠標按下,鼠標上或甚至(在Mac上)Ctrl +單擊鼠標按鈕。

因此,您不應直接處理鼠標和鍵盤事件,而應該改爲處理wxContextMenuEvent。請注意,將鼠標和鍵盤事件之後被稱爲:

注意,如果wxContextMenuEvent ::爲getPosition返回wxDefaultPosition,這意味着該事件起源於鍵盤背景下按鈕的事件,你應該計算自己的合適位置例如通過調用wxGetMousePosition()。對他人產生

請注意,您還可以抑制的情況下對一些鼠標事件和有它:

當按下Windows上的鍵盤快捷菜單按鈕,使用默認位置右鍵單擊事件首先發送,如果未處理該事件,則發送上下文菜單事件。所以如果你處理鼠標事件並且你發現你的上下文菜單事件處理程序沒有被調用,你可以調用wxEvent :: Skip()來實現鼠標右鍵事件。

希望用當前處理程序代替上下文菜單的當前代碼。對於所有也應該導致上下文菜單出現的鼠標事件,您需要致電event.Skip(),可能不會這樣做是您現在得到不一致結果的原因。

+0

正如我所說我使用wxContextMenuEvent,但由於某種原因它沒有被調用/觸發。我需要在我的控件中處理其他東西的鼠標事件,但這一點工作正常。它正是爲什麼wxContextMenuEvent不能可靠地調用windows上下文菜單組合鍵的原因。 – 2010-02-28 17:33:45

+0

好吧,這解釋了爲什麼它以某種方式被困在鼠標處理程序中,我想我只需要檢查並跳過(-1,-1)處的任何鼠標事件。但是這並不能解釋爲什麼wxWidgets有時會完全放棄這個事件,也就是說,我的處理程序中沒有一個被調用菜單按鈕或shift + f10? – 2010-02-28 17:43:32

+0

這很難說,我沒有'wxContextMenuEvent'單獨的問題。如果鍵盤事件不起作用,也許這是焦點問題?但是,無論如何,我不會在(-1,-1)處僅跳過(只)事件,除非上下文菜單需要被抑制,然後再爲所有座標,否則我會將它稱爲* all *事件。 – mghie 2010-02-28 17:48:41