什么是加速键表,什么时候用他,怎么用? 什么是加速键表,什么时候用他,怎么用? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在本文的例子为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,就什么都不用担心了。 当然对于MFC来说, 你也可以在相应的窗口或app里使用PreTranslateMessage来处理快捷键 关于listctrl控件选中的问题 怎样获取指定ftp服务器下的虚拟目录? 高分悬赏一个非常简单的问题! 江湖救急:如何静态引入MSVCP60.DLL 巨难的问题,如何在控件里使用自画的滚动条? 救命啊!!怎么把VC中的函数提示弄出来?? vc6 下 如何把LPCTSTR类型转换成const char* 如何在MFC中使用Shockwave Flash Object控件 求助:在一个单文档程序中,怎样判断鼠标是否进入了状态栏中?? 大家来看一个有关对话框的问题。 我该怎么办? 如何在程序窗口显示之后,显示一个对话框,好像“每日一帖”
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货