EVC長按滑鼠左鍵的訊息處理解決辦法

2021-04-13 13:13:31 字數 1096 閱讀 6846

今天在弄evc(我的環境是evc4.0 sp4)下編寫應用程式,其中需要用到長按滑鼠左鍵彈出選單的訊息處理(因為對於智慧型手機來說沒有滑鼠,該事件對應觸筆長點螢幕),在網上找了一些資料,都說用wm_rbuttondown這個訊息來做,但是這樣做後只相應滑鼠右鍵的訊息,不響應長按滑鼠左鍵的訊息。同事說過載cdialog的pretranslatemessage()函式來捕獲wm_contextmenu訊息來處理,通過evc的classwizard過載了pretranslatemessage(),函式測試實現部分如下:

bool cmediafilelist::pretranslatemessage(msg* pmsg)

編譯鏈結都通過了,在模擬器上一執行,長按滑鼠左鍵,終於看到彈出的選單了,但是很快我就發現這樣處理後每次長按滑鼠左鍵後會連續彈出四次該選單,通過將彈出選單用afxmessagebox()彈出提示資訊可更加直觀。

後來想想既然有wm_contextmenu訊息,為什麼不直接用呢,於是去看dialog已經定義的訊息佇列是否有wm_contextmenu,找到後看了幫助看這個訊息的使用。通過evc的classwizard給你需要新增該訊息處理的類新增wm_contextmenu訊息的function,在該類的.cpp檔案中就會生成函式oncontextmenu,但是編譯時候就有錯誤:提示的是說oncontextmenu()沒有定義,感到很納悶,evc的mfc既然已經定義了該訊息,而且我也已經鏈結好了mfc的庫了,為什麼這裡會報沒有定義訊息處理函式的錯誤,後來想到自己自定義訊息的時候在訊息對映宣告中的宣告方法,於是做出如下處理:

1、在該類的.cpp檔案中的訊息對映宣告中將on_wm_contextmenu()刪除

2、在訊息對映宣告中新增:on_message( wm_contextmenu, oncontextmenu)

3、在onconte**enu()中新增彈出選單的處理**

再次編譯沒有錯誤,鏈結也很順利的通過了,在模擬器上執行該應用程式,長按滑鼠左鍵終於實現了預期的結果,不會想過載pretranslatemessage()函式時會一次彈出四次的現象了,過載pretranslatemessage()會彈出四次的原因我想是因為mfc本來已經預處理了這個訊息,我又重新處理了一次在其中可以就會重複的呼叫相關的函式,具體的原因還在深究中。

evc 長按左鍵訊息

步驟一 系統必須支援aygshell,在stdafx.h最開始包含aygshell.h標頭檔案 步驟二 在project setting 的link中新增鏈結庫aygshell.lib 步驟三 在對話方塊中處理wm lbuttondown訊息,新增如下 彈出選單 shrginfo shrg shrg...

eVC程式設計遇到的各種問題之 各種訊息

wm close與wm destroy區別 wm close 先於wm destroy收到 case wm close postquitmessage 0 break case wm destroy messagebox null,text 123 text 123 0 這樣的話,messagebo...

取得滑鼠點選處的物體

在box2d源 test.as中有個getbodyatmouse函式是用來取得滑鼠點選處的物體的,自己修改了一下看如下 private function getbodyatmouse includestatic boolean false b2body return body 4 8行 在滑鼠點選處...