我用ATL做了一个不需要MFC支持的控件,在调试时可以响应上下左右方向键.但在VB,IE中不响应,其他键正常.我不知道怎么办,请高手指教.

解决方案 »

  1.   

    处理WM_GETDLGCODE消息,返回DLGC_WANTARROWS值。switch(uMsg)
    {
    ...
    case WM_GETDLGCODE:
        return DLGC_WANTARROWS;
    ....
    }要让自己的控件支持方向键,真正的解决方案就是响应WM_GETDLGCODE。
    不管是MFC还是SDK。实际上在Windows的标准控件中就是这个方案实现的。
      

  2.   

    对不起,我太笨了,verybigbug 我写了如下代码试验 还不行,请指教
    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;
    }
      

  3.   

    在onkeydown事件中是肯定不行的,我也试过这种情况,在测试容器里面可以,但是如果放到IE的其他的控件容器中就没有作用了,主要原因是keydown消息根本在到达你的处理程序之前就已经被拦截了,我看了前面有位老大的帖子,他的方法是修改PreTranslateMessage。应该能够行,而且比用hook的方法好。你可以到前面去搜索一下看看
    相关信息可以去看看“深入潜出MFC”的第四篇,中间描述了消息在mfc程序中的传递路线
      

  4.   

    我也不知道为什么。这种方法在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;
       } 
      

  5.   

    谢谢 verybigbug
    谢谢 turnmissile
    我现在总分还没有200分,所以只能少给一点,非常感谢。