对于加速键我有点乱,比如我创建一个加速键(Ctrl+Z),他是用来加速菜单项"aaa"的,那么我在视图类中又定义了一个CEdit m_edit;的控件.我要求当焦点落在Edit里是,也可以用加速键(Ctrl+Z)来处理撤销这个操作,1.现在要怎么做??
2.一个加速键可不可以对应多个不同的对象(比如既用来加速菜单项又用来加速其他东西)???如果可以的话,不会乱掉吗??
我也不知道要怎么说了.
2.一个加速键可不可以对应多个不同的对象(比如既用来加速菜单项又用来加速其他东西)???如果可以的话,不会乱掉吗??
我也不知道要怎么说了.
if (pMsg->message == WM_KEYDOWN)
{
if (pMsg->hwnd == Edit句柄 && (GetAsyncKeyState(VK_CONTROL) & 0x8000) && pMsg->wParam == 'Z')
{
TranslateMessage(pMsg);
return TRUE;
}
}
return 基类::PreTranslateMessage(pMsg);
不知道理解得对不对.
WM_KEYDOWN('Z')应该不会再发给CEdit窗口了吧,发给他的是紧接下来的WM_CHAR('Z')吧,
{
_AFX_THREAD_STATE *pState = AfxGetThreadState(); ::GetMessage(&(pState->m_msgCur), NULL, NULL, NULL))
if (!AfxPreTranslateMessage(&(pState->m_msgCur)))
{
::TranslateMessage(&(pState->m_msgCur));
::DispatchMessage(&(pState->m_msgCur));
}
return TRUE;
}BOOL PASCAL CWnd::WalkPreTranslateTree(HWND hWndStop, MSG* pMsg)
{
ASSERT(hWndStop == NULL || ::IsWindow(hWndStop));
ASSERT(pMsg != NULL); for (HWND hWnd = pMsg->hwnd; hWnd != NULL; hWnd = ::GetParent(hWnd))
{
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
if (pWnd != NULL)
{
// target window is a C++ window
if (pWnd->PreTranslateMessage(pMsg))
return TRUE; // trapped by target window (eg: accelerators)
}
// got to hWndStop window without interest
if (hWnd == hWndStop)
break;
}
return FALSE; // no special processing
}
从上面的代码可以看到只要返回TRUE,那么是不会调用
::TranslateMessage(&(pState->m_msgCur));
::DispatchMessage(&(pState->m_msgCur));
那么怎么发给他呢??
{
if (pMsg->hwnd == Edit句柄 && (GetAsyncKeyState(VK_CONTROL) & 0x8000) && pMsg->wParam == 'Z')
{
TranslateMessage(pMsg); //产生WM_CHAR('Z'),即下一个GetMessage所获得的消息
return TRUE; //返回TRUE,所以本消息即WM_KEYDOWN("z")不会在继续处理.
}
}
return 基类::PreTranslateMessage(pMsg);
}
这样理解应该没错把