我也不知道为什么。这种方法在VB中就不行,在VC中是可以的。MSDN上也有关于这个的说明。PRB: Accelerator Keys Fail with ATL Control on a VB UserControl 他的解决方案也是用PreTranslateAccelerator.Steps to Resolve the Problem Open the ATL project. In the Class view, expand CMyCtl and then double-click "PreTranslateAccelerator(LPMSG pMsg, HRESULT& hRet)". Now MyCtl.h is opened in the editor window. Replace the PreTranslateAccelerator function with the following code: BOOL PreTranslateAccelerator(LPMSG pMsg, HRESULT& hRet) { if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_LEFT || pMsg->wParam == VK_RIGHT || pMsg->wParam == VK_UP || pMsg->wParam == VK_DOWN)) { hRet = S_OK; m_ctlEdit.SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam); return TRUE; } //TODO: Add your additional accelerator handling code here return FALSE; }
{
...
case WM_GETDLGCODE:
return DLGC_WANTARROWS;
....
}要让自己的控件支持方向键,真正的解决方案就是响应WM_GETDLGCODE。
不管是MFC还是SDK。实际上在Windows的标准控件中就是这个方案实现的。
HRESULT OnDrawAdvanced(ATL_DRAWINFO& di)
{
RECT& rc = *(RECT*)di.prcBounds;
Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom); SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE);
// LPCTSTR pszText = _T("ATL 3.0 : aaa");
TextOut(di.hdcDraw,
(rc.left + rc.right) / 2,
(rc.top + rc.bottom) / 2,
laaa,
lstrlen(laaa)); return S_OK;
}
LRESULT OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
//这里现在还不会响应上下左右方向键 FireViewChange();
return 0;
} LRESULT OnGetDlgCode(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
switch(uMsg)
{
case WM_GETDLGCODE:
return DLGC_WANTARROWS;
}
return 0;
}
相关信息可以去看看“深入潜出MFC”的第四篇,中间描述了消息在mfc程序中的传递路线
Open the ATL project. In the Class view, expand CMyCtl and then double-click "PreTranslateAccelerator(LPMSG pMsg, HRESULT& hRet)". Now MyCtl.h is opened in the editor window.
Replace the PreTranslateAccelerator function with the following code: BOOL PreTranslateAccelerator(LPMSG pMsg, HRESULT& hRet)
{
if(pMsg->message == WM_KEYDOWN &&
(pMsg->wParam == VK_LEFT ||
pMsg->wParam == VK_RIGHT ||
pMsg->wParam == VK_UP ||
pMsg->wParam == VK_DOWN))
{
hRet = S_OK;
m_ctlEdit.SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
return TRUE;
}
//TODO: Add your additional accelerator handling code here
return FALSE;
}
谢谢 turnmissile
我现在总分还没有200分,所以只能少给一点,非常感谢。