目前共有1篇帖子。 字体大小:较小 - 100% (默认)▼  内容转换:不转换▼
 
点击 回复
451 0
【解决办法】在Win32窗口程序中,当主窗口中的控件(子窗口)获得焦点时,快捷键无效的解决办法
一派护法 十九级
1楼 发表于:2016-1-23 16:33
【症状】
以ListView控件为例。在Win32中默认的窗口中用CreateWindow创建一个ListView子窗口。运行程序,发现刚开始的时候快捷键是有反应的,但是一旦鼠标指针点了那个ListView的内部,快捷键就再也没有反应了。

【解决办法】
在WinMain函数中的消息循环中,将TranslateAccelerator后面的第一个参数msg.hwnd改为hWnd(也就是消息循环前用CreateWindow创建主窗口时返回的句柄)。
如图所示:




这是我的快捷键表。运行程序经过测试,无论是普通快捷键还是带Ctrl或Alt的快捷键都是有效的。
所有的快捷键都是关联菜单ID,而不是关联默认创建的ID_ACCELERATOR32805之类的快捷键ID。

不过对于ListView来说,如果启用了EditLabel的话,就最好不要在快捷键中加入单独的回车键(不带Ctrl或Alt那种),否则会影响编辑框对回车键的响应。如果要用回车键打开项目的话,最好在ListView控件对应的LVN_KEYDOWN通知中单独对回车键进行处理。当标签编辑模式下按下回车键,ListView并不会发送LVN_KEYDOWN通知,而如果是普通模式下按下回车键则会发送LVN_KEYDOWN通知。
例如:
switch (uMsg)
{
//...
case WM_NOTIFY:
{
    LPNMHDR header = (LPNMHDR)lParam;
    if (header->code == LVN_KEYDOWN)
    {
            LPNMLVKEYDOWN pnkd = (LPNMLVKEYDOWN)lParam;
            if (pnkd->wVKey == VK_RETURN)
                pWndCls->EditItem(); // 当按下回车键时,如果ListView未处于重命名模式,则打开编辑对话框
    }
    return false;
}
break;
//......
}

回复帖子

内容:
用户名: 您目前是匿名发表
验证码:
(快捷键:Ctrl+Enter)
 

本帖信息

点击数:451 回复数:0
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2016-1-23 16:33
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。