一:建立加速鍵表。
在本文的例子為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...