您的位置:首页 > 编程语言 > C语言/C++

[win32][c++]如何覆盖winAPI控件自带的加速键

2016-06-22 00:01 239 查看
在win32设计学习中,用edit控件实现简易文本编辑器,在设置加速键时遇到了问题,在edit编辑框获得焦点时,自定义加速键表不起作用(按下加速键后无错误消息提示音,

说明程序识别了加速键,但没有进入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);
}
}


也就是把消息句柄直接设置成主窗口句柄,当在窗体中按下加速键,该函数会分发消息给窗体处理,可以在全局使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  winapi win32 c++