VC 新增加速鍵訊息處理的方法

2021-06-03 14:51:19 字數 2320 閱讀 5472

一:建立加速鍵表。

在本文的例子為vk_return建立了乙個加速鍵,將它對映到命令id_my_enter,並寫乙個命令處理器來做你想做的事情。  

begin_message_map(cmydlg,   cdialog)  

on_command(id_my_enter,   onmyenter)  

......  

end_message_map()  

void   cmydlg::onmyenter()  

下圖是本文例子的對話方塊和**,**中的nextintaborder是實際起作用的函式。  

它使用getnextdlgtabitem來獲得tab順序的下乙個控制焦點。  

如果你細心的話會發現另外乙個還沒有得到解決的問題,那就是在mfc對話方塊不自動處理加速鍵,你必須自己編寫**來做這件事情。為了理解弄清楚這是為什麼,讓我們回首windows開發的歷程,在使用c和原始的windows   api的年代,每乙個windows程式中都有乙個叫做訊息幫浦的中樞迴圈:  

while   (getmessage(...))    

在這裡細節不是重要的,重要的是訊息並不到達程式的流程,你必須請求訊息。這是一種人為的非搶先式多工方法,這種方法通過每乙個任務精誠協作來仿造多工環境,隨著增加的功能越來越多,有人想到了加速鍵表的主意,這個表用來對映按鍵和命令ids。為了實現這個目的,他們發明了乙個叫translateaccelerator的函式。現在這個訊息幫浦變成了如下的樣子:  

while   (getmessage(...))     else    

}  

haccel是個加速鍵表控制代碼,在這裡細節同樣不是重要的,重要的是如何利用加速鍵表,也就是要有乙個專門的函式將按鍵訊息解釋為wm_command訊息。translateaccelerator尋找wm_keydown,wm_char,wm_keyup序列與表中鍵值匹配的字元。如果找到,它插入一條wm_command到訊息佇列,在訊息佇列中的命令id可以是加速鍵表定義的任何入口。這樣你只要設定加速鍵表(在資源中)並記住呼叫對應的函式translateaccelerator,就什麼都不用擔心了。

二:vc++加速鍵的加入方法

第一種:(如果是基於對話方塊的工程,我們先新增選單和加速鍵資源,然後右擊主對話方塊屬性新增選單)

首先在資源檔案accelerator中新增快捷鍵資源 id選擇你要關聯選單項的名稱 然後再設定你的快捷鍵.什麼?下一步?在.h檔案中加入乙個    haccel   haccel;變數 然後在oninitdialog或初始化中加入haccel=::loadaccelerators(afxgetinstancehandle(),makeintresource(idr_accelerator1)); 後面的引數是加速鍵資源檔名.

最後在pretranslatemessage(msg* pmsg) 中加入:

if(::translateaccelerator(getsafehwnd(),haccel,pmsg))  

return   true;

這樣 以後只要在accelerator資源檔案中新增快捷鍵就可以了

注意:新增快捷鍵的id一定要與選單id一樣 這樣才能響應.現在只需要在此選單項中加入oncommand訊息的處理就可以了.

第二種:還是在資源檔案accelerator中新增快捷鍵資源 id自己定義乙個.然後再設定你的快捷鍵.下一步...就是在.h檔案中定義乙個快捷鍵物件

haccel m_haccel;

然後在.cpp檔案中初始

m_haccel = ::loadaccelerators(afxgetinstancehandle(),makeintresource(idr_accelerator1));

idr_accelerator1為你的加速資源名稱.注意不是剛剛定義的加速鍵id.

再新增pretranslatemessage訊息處理 在裡面加入以下**:

//儲存快捷鍵被啟用

if(m_haccel   !=   null)  

再新增oncommand訊息處理 加入以下**:

//響應加速鍵

switch(loword(wparam))  

自己加的:在我看的**中,它是利用對話方塊加選單的,當加了選單後,把選單掛到對話方塊,然後響應乙個選單項.再在對話方塊類中加虛函式pretranslatemessage,在些數里的**如下:

if( pmsg->message==wm_keydown)

return cdialog::pretranslatemessage(pmsg);

這樣我就可以響應f2的加速鍵了!!

vc 新增訊息及訊息處理函式

新增自定義訊息和函式 1.在要新增訊息的類標頭檔案中定義巨集 define wm wm user n n 0 2.在類的宣告中新增訊息處理函式的宣告 afx msg void x wparam wparam,lparam lparam 3.在類的實現檔案中訊息對映部分新增訊息對映 on messag...

VC 中的訊息處理

messagebox 並沒有什麼多少功能,但是能夠在螢幕上顯示乙個視窗,提出乙個問題,並且等候使用者的輸入。下面是messagebox 的原型 int messagebox hwnd hwn,handle of owner window lpctstr lptext,address of text ...

VC 新增自己的訊息函式

有時候我們需要新增自己的訊息函式來完成特定的功能,新增訊息函式有3個步驟 1.在stdafx.h中,新增訊息函式的巨集定義 define wm my message wm user 102 其中wm user是vc提供給我們定義自己的訊息函式的。2.在要使用的類的.h檔案裡面新增函式宣告 lresu...