Duilib 中的快捷键实现方式也很简单,为控件添加属性 shortcut
即可,值设置为某个字母,当按下 Alt+字母时,窗口会接收到 WM_SYSCHAR
消息,然后找到对应的控件进行响应。
代码如下:
case WM_SYSCHAR:
{
if( m_pRoot == NULL ) return false;
// Handle ALT-shortcut key-combinations
FINDSHORTCUT fs = { 0 };
fs.ch = toupper((int)wParam);
CControlUI* pControl = m_pRoot->FindControl(__FindControlFromShortcut, &fs, UIFIND_ENABLED | UIFIND_ME_FIRST | UIFIND_TOP_FIRST);
if( pControl != NULL ) {
pControl->SetFocus();
pControl->Activate();
return true;
}
}
break;
wParam
中存放的是按下的字母,然后调用 m_pRoot->FindControl(__FindControlFromShortcut, &fs, UIFIND_ENABLED | UIFIND_ME_FIRST | UIFIND_TOP_FIRST)
查找对应的控件
- FindControl 的调用者是
m_pRoot
代表从根结点开始查找 - UIFIND_ENABLED 只查找非禁用状态的控件
- UIFIND_ME_FIRST 从当前控件开始查找
- UIFIND_TOP_FIRST 从最上层的控件开始查找。 有可能多个控件的位置有覆盖的情况,最上层的控件即是最后绘制的控件。
找到对应的控件后,调用 SetFocus()
设置焦点并响应此控件的事件 : Activate()