什么是加速键表,什么时候用他,怎么用?

解决方案 »

  1.   

    在本文的例子为VK_RETURN创建了一个加速键,将它映射到命令ID_MY_ENTER,并写一个命令处理器来做你想做的事情。 BEGIN_MESSAGE_MAP(CMyDlg, CDialog)     ON_COMMAND(ID_MY_ENTER, OnMyEnter)     ...... END_MESSAGE_MAP() void CMyDlg::OnMyEnter() {     NextInTabOrder(); }     下图是本文例子的对话框和代码,代码中的NextInTabOrder是实际起作用的函数。 它使用GetNextDlgTabItem来获得Tab顺序的下一个控制焦点。     如果你细心的话会发现另外一个还没有得到解决的问题,那就是在MFC对话框不自动处理加速键,你必须自己编写代码来做这件事情。为了理解弄清楚这是为什么,让我们回首Windows开发的历程,在使用C和原始的Windows API的年代,每一个Windows程序中都有一个叫做消息泵的中枢循环: while (GetMessage(...)) {     TranslateMessage(...);     DispatchMessage(...); }     在这里细节不是重要的,重要的是消息并不到达程序的流程,你必须请求消息。这是一种人为的非抢先式多任务方法,这种方法通过每一个任务精诚协作来仿造多任务环境,随着增加的功能越来越多,有人想到了加速键表的主意,这个表用来映射按键和命令IDs。为了实现这个目的,他们发明了一个叫TranslateAccelerator的函数。现在这个消息泵变成了如下的样子: while (GetMessage(...)) {     if (TranslateAccelerator(hAccel...)) {         // handled, continue looping     } else {         TranslateMessage(...);         DispatchMessage(...);     } }     hAccel是个加速键表句柄,在这里细节同样不是重要的,重要的是如何利用加速键表,也就是要有一个专门的函数将按键消息解释为WM_COMMAND消息。TranslateAccelerator寻找WM_KEYDOWN,WM_CHAR,WM_KEYUP序列与表中键值匹配的字符。如果找到,它插入一条WM_COMMAND到消息队列,在消息队列中的命令ID可以是加速键表定义的任何入口。这样你只要设置加速键表(在资源中)并记住调用对应的函数TranslateAccelerator,就什么都不用担心了。 
      

  2.   

    当然对于MFC来说, 你也可以在相应的窗口或app里使用PreTranslateMessage来处理快捷键