MFC 如何新增快捷鍵

2021-06-03 17:15:41 字數 1921 閱讀 8799

原文:

// 解釋說明

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(),就什麼都不用擔心了。

// 簡化後的 cwinthread 

while (getmessage(...)) else

}  cwinthread::pretranslatemessage()是個虛函式,在應用中,其預設的實現以相同的名字呼叫另乙個虛函式cwnd::pretranslatemessage()。因此,如果需要在訊息迴圈中做些什麼的話,如解釋加速鍵,只要過載pretranslatemessage()函式即可。實際上,這就是程式的框架cframewnd類處理加速鍵的方法。

bool cframewnd::pretranslatemessage(msg* pmsg) 

}  cframewnd類是從**獲得加速鍵表呢?當載入框架時,cframewnd::loadframe()函式使用與文件模板相同的id(如idr_mainframe)查詢加速鍵表,並將它載入到m_hacceltable變數中。所有的處理細節在mfc中都是自動的、隱蔽的,讀者朋友不用去操心。但是上述內容僅僅是對主框架而言,如果是對話方塊,則是另外一種情況,因為cdialog不是從cframewnd派生而來,所以不繼承任何有關加速鍵的內容。對於這個問題不用擔心,我們可以模仿cframewnd的工作,很容易為對話方塊增加加速鍵的功能。第一步是載入加速鍵,載入加速鍵最好的地方是在對話方塊的oninitdialog函式中:

bool cmydlg::oninitdialog() 

在加速鍵表中,可以使用任何id。例如上面的**使用的是對話方塊本身的id,(m_lpsztemplatename既可以是乙個串名,也可以是乙個makeintresource使用的整型id)。

// 本文例子中的加速鍵(in dlgkeys.rc )

idd_mydialog accelerators discardable 

begin 

vk_return, id_my_enter, virtkey, noinvert 

end 

一旦已經載入加速鍵,剩下的事情是過載pretranslatemessage函式,進行訊息映**:

bool cmydlg::pretranslatemessage(msg* pmsg) 

return cdialog::pretranslatemessage(pmsg); 

} 之所以要檢查按鍵類的訊息(從wm_ keyfirst 到 wm_keylast)是為了提高速度。如果你知道不是乙個按鍵訊息,你就不用浪費時間去呼叫translateaccelerator()。再說translateaccelerator()是乙個虛函式,不用增加乙個訊息對映入口。僅僅寫這個函式就可以了。

MFC中新增快捷鍵

首先引入選單資源,命名id,caption open ctrl o 然後引入accelerator 資源,新增相應的快捷鍵,然後定義 protected hicon m hicon 在建構函式中新增 m haccel loadaccelerators afxgetinstancehandle mak...

MFC中新增快捷鍵

mfc中新增快捷鍵 zhangzhe mfc中新增快捷鍵 基於dialog 的mfc 工程中如何新增快捷鍵呢?大致分為以下幾個步驟 1.在資源檢視中新增資源,選擇 accelerator 選項新建即可 2.開啟新建的資料夾下的 idr accelerator1 中編輯,其中包括 id 修飾符 鍵 型...

Win10新增快捷鍵

應用視窗鍵盤快捷鍵 win 上 下 使應用視窗在最大化,正常狀態以及最小化之間進行切換 非新增 win 左 右 使應用視窗在佔據左 右半邊螢幕以及正常狀態之間進行切換 非新增 win 左 右 win 上 下 使應用視窗佔據螢幕四個角落1 4的螢幕區域 多桌面鍵盤快捷鍵 win tab 顯示所有已開啟...