如何在子类化控件中使用快捷键表?
How to use accelerator table in a subclassed control?
我正在对控件进行子类化,此时我想为其添加一些键盘快捷键。在资源的加速器表中定义了大约十几个。
我知道我可以从主应用程序中利用这些加速器,方法是调用TranslateAccelerator
然后从其主循环中TranslateMessage
和DispatchMessage
。
但是,我可以检查快捷键序列是否从WndProc
本身的子类化控件中按下吗?
编辑:换句话说,做这样的事情会不好吗?
LRESULT CSubclassedWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if(message == WM_KEYDOWN ||
message == WM_CHAR ||
message == WM_SYSKEYDOWN ||
message == WM_SYSCHAR)
{
if(hAccel)
{
CRect rcThis;
this->GetWindowRect(&rcThis);
this->ScreenToClient(&rcThis);
POINT pnt = {(rcThis.right + rcThis.left) / 2, (rcThis.bottom + rcThis.top) / 2};
MSG msg = {this->GetSafeHwnd(), message, wParam, lParam, ::GetTickCount(), pnt};
if(::TranslateAccelerator(this->GetSafeHwnd(), hAccel, &msg))
{
//Accelerator was recognized and sent as WM_COMMAND message to the same window
return 0;
}
}
}
switch(message)
{
case WM_COMMAND:
{
//Special accelerator commands
if(HIWORD(wParam) == 1 &&
lParam == 0)
{
//See which command was it
switch(LOWORD(wParam))
{
case ID_MY_ACCELERATOR_ID1:
{
//Do work...
}
return 0;
case ID_MY_ACCELERATOR_ID2:
{
//Do work...
}
return 0;
}
}
}
break;
case WM_ERASEBKGND:
//process it
return TRUE;
case WM_PAINT:
//process it
return TRUE;
case WM_KEYDOWN:
//process it
break;
//etc.
}
return CWnd::WindowProc(message, wParam, lParam);
}
我相信标准的Windows控件只使用WM_KEYDOWN/CHAR和GetKeyState
但我不明白为什么你不能使用TranslateAccelerator
。
TranslateAccelerator
在某些方面更好,因为它知道如何处理Alt.Gr但如果捕获鼠标(IIRC(,它也会忽略该键,因此这取决于您的需求。
在GetMessage
之后在顶级窗口调用TranslateAccelerator
当然是最好的选择,因为它会检查窗口菜单以查看该命令是否被禁用......
相关文章:
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- 如何更改窗体上所有控件的标题?[C++生成器]
- 双击更改 mfc 中列表控件中的行的颜色
- 派生的 wxPanel 控件如何访问其中包含 wxDialog 中的数据?
- 如何从代码本身向 wxwidgets 中的文本控件插入字符?
- 如何在子类化控件中使用快捷键表?
- 在 MFC 中,当 CEdit 控件达到最大字符数时,退格键不起作用
- 如何在列表控件中创建右键单击菜单
- Win32 API:如何在编辑控件中捕获转义键?
- 如何防止基于 MFC 对话框的应用在 ESC 键后关闭,但允许其他控件处理它
- 如何使wxWidgets控件接受中键单击
- Tab 键在子控件中不起作用
- 如何处理 Win32 多行编辑控件中的输入键
- 如何检查用户是否按下了编辑控件内的键
- 是否可以在 MFC 按钮控件上检测到鼠标右键单击事件
- 如何通过TAB键在窗口中的控件之间导航
- 在哪里处理特定 mfc 编辑控件的"Enter"键事件?
- 在不使用tab键的情况下在Windows Mobile中的对话框控件之间移动