右鍵彈出選單和快捷鍵的設定

2021-07-02 01:22:48 字數 3828 閱讀 7996

void cmydlg::onrbuttondown(uint nflags, cpoint point)

其中值得一說的函式是trackpopupmenu函式,簡單的講就是它決定了彈出選單的位置。那麼具體的講呢,此處我引用互動百科上面的解釋如下:trackpopupmenu - 函式功能

該函式在指定位置顯示快捷選單,並跟蹤選單項的選擇。快捷選單可出現在螢幕上的任何位置。

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中新增註冊熱鍵的**:

//註冊熱鍵

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");

其中id_hotkeyftp和id_hotkeytty是我自己定義的兩個巨集。可以在標頭檔案中定義:

#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...