[win32][c++]如何覆盖winAPI控件自带的加速键
2016-06-22 00:01
239 查看
在win32设计学习中,用edit控件实现简易文本编辑器,在设置加速键时遇到了问题,在edit编辑框获得焦点时,自定义加速键表不起作用(按下加速键后无错误消息提示音,
说明程序识别了加速键,但没有进入WM_COMMAND执行同时edit本身自带的ctrl+c等加速键也失效。经过查阅资料与寻找,发现是下面这个接收消息的函数的问题。
首先我们知道,如果在加速键表中定义好加速键,TranslateAccelerator的作用是对照加速键表,将相关的按键消息翻译成WM_COMMAND和WM_SYSCOMMAND消息。
并直接发往窗口,而不在消息队列中等待。而此函数是给主窗口使用的,不能识别控件,所以当在控件中按下自定义的加速键时,该函数无法发送对应消息给控件句柄,所以什么事也不做。
下面要将代码修改为:
也就是把消息句柄直接设置成主窗口句柄,当在窗体中按下加速键,该函数会分发消息给窗体处理,可以在全局使用。
说明程序识别了加速键,但没有进入WM_COMMAND执行同时edit本身自带的ctrl+c等加速键也失效。经过查阅资料与寻找,发现是下面这个接收消息的函数的问题。
while (GetMessage(&msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
首先我们知道,如果在加速键表中定义好加速键,TranslateAccelerator的作用是对照加速键表,将相关的按键消息翻译成WM_COMMAND和WM_SYSCOMMAND消息。
并直接发往窗口,而不在消息队列中等待。而此函数是给主窗口使用的,不能识别控件,所以当在控件中按下自定义的加速键时,该函数无法发送对应消息给控件句柄,所以什么事也不做。
下面要将代码修改为:
while (GetMessage(&msg, nullptr, 0, 0)) { if (!TranslateAccelerator(hWnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
也就是把消息句柄直接设置成主窗口句柄,当在窗体中按下加速键,该函数会分发消息给窗体处理,可以在全局使用。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性