其中值得一說的函式是trackpopupmenu函式,簡單的講就是它決定了彈出選單的位置。那麼具體的講呢,此處我引用互動百科上面的解釋如下:trackpopupmenu - 函式功能void cmydlg::onrbuttondown(uint nflags, cpoint point)
該函式在指定位置顯示快捷選單,並跟蹤選單項的選擇。快捷選單可出現在螢幕上的任何位置。
trackpopupmenu - 函式原型
bool trackpopupmenu(hmenu hmenu,uint uflags,int x,int y,int nreserved,hwnd hwnd,const rect」prcrect);
trackpopupmenu - 主要引數
hmenu:被顯示的快捷選單的控制代碼。此控制代碼可為呼叫createpopupmenu建立的新快捷選單的控制代碼,也可以為呼叫getsubmenu取得的與乙個已存在選單項相聯絡的子選單的控制代碼。
uflags:一種指定功能選項的位標誌。用下列標誌位之一來確定函式如何水平放置快捷選單:
tpm_centerallgn:若設定此標誌,函式將按引數x指定的座標水平居中放置快捷選單。
tpm_leftallgn:若設定此標誌,函式使快捷選單的左邊界與由引數x指定的座標對齊。
tpm_rightallgn:若設定此標誌,函式使快捷選單的右邊界與由引數x指定的座標對齊。
用下列標誌位之一來確定函式如何垂直放置快捷選單:
tpm_bottomallgn:若設定此標誌,函式使快捷選單的下邊界與由引數y指定的座標對齊。
tpm_topallgn:若設定此標誌,函式使快捷選單的上邊界與由引數y指定的座標對齊。
tpm_vcenterallgn;若設定此標誌,函式將按引數y指定的座標垂直居中放置快捷選單
用下列標誌位之一來確定在選單沒有父視窗的情況下使用者的選擇:
tpm_nonotify:若設定此標誌,當使用者單擊選單項時函式不傳送通知訊息。
tpm_returncmd;若設定此標誌;函式將使用者所選選單項的識別符號返回到返回值裡。
用下列標誌位之一來確定在快捷選單跟蹤哪乙個滑鼠鍵:
tpm_leftbutton:若設定此標誌,使用者只能用滑鼠左鍵選擇選單項。
tpm_rightbutton:若設定此標誌,使用者能用滑鼠左、右鍵選擇選單項。
x:在螢幕座標下,快捷選單的水平位置。
y:在螢幕座標下,快捷選單的垂直位置。
nreserved:保留值,必須為零。
hwnd:擁有快捷選單的視窗的控制代碼。此視窗接收來自選單的所有訊息。函式返回前,此視窗不接受來自選單的wm_command訊息。
如果在引數uflags裡指定了tpm_nonotify值,此函式不向hwnd標識的視窗發訊息。 但必須給hwnd裡傳乙個視窗控制代碼,可以是應用程式裡的任乙個視窗控制代碼。
prcrect:未用。
返回值:如果在引數uflags裡指定了tpm_returncmd值,則返回值是使用者選擇的選單項的識別符號。如果使用者未作選擇就取消了選單或發生了錯誤,則退回值是零。如果沒在引數uflags裡指定tpm_returncmd值,若函式呼叫成功,返回非零值,若函式呼叫失敗,返回零。若想獲得更多的錯誤資訊,清呼叫getlasterror。
至此,完成。執行後快捷鍵果然成功了。當然前提是,之前需對選單裡的每乙個選單項新增事件響應函式。if (wm_keyfirst<=pmsg->message&&pmsg->message<= wm_keylast)
簡單的理解就是這個函式具有較高的優先順序,它能首先截獲一些按鍵訊息之類的,所以在截獲後便可以呼叫自己的函式進行訊息響應。
至此,右鍵選單的設定和快捷鍵的設定就完了,當然我的專案中用到的還有其他的快捷鍵設定,還需要除錯。加油!
——————————————————————————————————————————(以下為二次修改內容)
後來,發現好像還有另外一種很方便的方法,即在該選單或者按鈕的caption屬性中,新增
&g就可以實現alt+g鍵的快捷鍵,當然可以把g鍵換成其他的字母鍵。
除了快捷鍵,我也聽說過熱鍵,那麼什麼是熱鍵呢?其實好像就是一樣的意思,我到現在還沒有明白。先不管了,我的重點不是說這個,我的重點是上面的快捷鍵設定方法只是local的,即當應用程式失去焦點後或者沒有被啟用前,快捷鍵是不起作用的。那麼與此相對應的就是global的,即任何時候(不管程式有沒有獲得焦點,或是有沒有被啟用)都可以響應快捷鍵。
那麼如何設定全域性的快捷鍵?
首先,利用類嚮導新增訊息wm _hotkey的響應函式,會在類中自動生成成員函式
afx_msg void onhotkey(uint nhotkeyid, uint nkey1, uint nkey2);
,同時在begin_message_map(cmyplayerdlg, cdialogex)裡也生成衣蛾訊息巨集對映
on_wm_hotkey()
上面兩步不用我們自己操作,類嚮導已經幫我們做好了,接下來我們可以開始真正的編寫設定。
在oninitdialog中新增註冊熱鍵的**:
其中id_hotkeyftp和id_hotkeytty是我自己定義的兩個巨集。可以在標頭檔案中定義://註冊熱鍵
int nret = registerhotkey(getsafehwnd(),id_hotkeyftp,mod_alt|mod_control,'y'); //熱鍵 ctrl+alt+y
if(!nret)
afxmessagebox("registerhotkey 0 false");
nret = registerhotkey(getsafehwnd(),id_hotkeytty,mod_alt|mod_control,'t'); //熱鍵 ctrl +alt + t
if(!nret)
afxmessagebox("registerhotkey 1 false");
關於熱鍵的具體風格可以是如下的組合:(利用』|』進行組合)#define id_hotkeyftp 1001
#define id_hotkeytty 1002
然後在生成的void cmyplayerdlg::onhotkey(uint nhotkeyid, uint nkey1, uint nkey2)函式中編寫**:
還沒有完,還需要在類的析構函式中書寫如下**:void cmyplayerdlg::onhotkey(uint nhotkeyid, uint nkey1, uint nkey2)
else
if (nhotkeyid==id_hotkeytty)
else
cdialogex::onhotkey(nhotkeyid, nkey1, nkey2);
}
到此設定完畢,執行之後就可以看到效果了,不管有沒有獲得焦點,按下組合鍵,都能響應相應的動作。也就是全域性的熱鍵。unregisterhotkey(m_hwnd,id_hotkeyftp);
unregisterhotkey(m_hwnd,id_hotkeytty);
關於熱鍵和快捷鍵,或許可以從字面理解,因為熱鍵可以設定成全域性的,所以應該是哪些經常用到的操作,所以稱之為「熱」嘛。哈哈!
拙見,小記!
彈出選單快捷鍵的使用方法
這種彈出選單或者下拉列表的快捷鍵一般沒什麼用,主要是幫助沒有滑鼠的情況使用的,直接按對應的字母就可以了,但是一般選單要處於調出環境,沒彈出這種選單可能會不能用。而且不能是中文輸入狀內態,因為要輸入英文本母。有滑鼠沒必要用這種快捷鍵。有些環境裡,複製用ctrl c是可以在不出現這種選單時使用,因為這個...
滑鼠右鍵彈出快捷選單的實現
實用,備忘 void ctestdlg onrbuttondown uint nflags,cpoint point cmenu menu cmenu pmenu menu.loadmenu idr menu1 p menu.getsubmenu 0 clienttoscreen point pme...
IntelliJ IDEA 快捷鍵和設定
ctrl 或 ctrl shift 注釋 或者 ctrl d 複製行 ctrl x 刪除行 快速修復 alt enter modify cast 提示 alt ctr g 定位某一行 shift f6 重構 重新命名 ctrl r 替換文字 ctrl f 查詢文字 ctrl e 最近開啟的檔案 ct...