0

我正在尝试在 CEdit 控件中实现全选(通过 ctrl-a)。我通过创建一个继承 CEdit 的类并为 WM_KEYDOWN 添加一个处理程序来做到这一点,如下所示:

void CEditExtended::OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags )
{   
  if((nChar == 0x41) && (GetKeyState(VK_CONTROL) & 0x8000) != 0))
    SetSel(0, -1);

  CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}

在网络上环顾四周,这应该可以工作,但它永远不会同时注册 ctrl 和 a ,无论是其中一个。

4

3 回答 3

3

试试这个代码:

void CEditExtended::PreTranslateMessage(MSG* pMsg)
{
 if(pMsg->message == WM_KEYUP )
    {
        if ( (LOWORD(pMsg->wParam) & VK_CONTROL) == VK_CONTROL )
        {

         /// blah

        }
    }

    return CEdit::PreTranslateMessage(pMsg);
}
于 2011-11-22T10:00:27.003 回答
2

要为窗口中的所有编辑控件实现 Ctrl+A,请覆盖CWnd::PreTranslateMessage以检查键序列以及焦点是否在编辑控件上。如果是这样,请选择其文本。

BOOL CMyWindow::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_KEYDOWN && pMsg->wParam == 'A' && GetKeyState(VK_CONTROL) < 0) {
        if (auto edit = dynamic_cast<CEdit*>(GetFocus())) {
            edit->SetSel(0, -1, FALSE);
            return TRUE;
        }
    }
    return __super::PreTranslateMessage(pMsg);
}
于 2018-06-15T19:41:24.313 回答
0

在不扩展 CEdit 类的情况下实现 CTRL+A 的另一种方法。

覆盖具有编辑控件的对话框的 PreTranslateMessage() 成员函数。

BOOL CMyDialog::PreTranslateMessage(MSG* pMsg)
{
    if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == 'A')
       && GetKeyState(VK_CONTROL) < 0)
    {
        CWnd *pWnd = GetFocus();
        if (pWnd != NULL)
        {
            CString className;

            GetClassName(pWnd->GetSafeHwnd(), className.GetBuffer(80), 80);
            className.ReleaseBuffer();
            if (className.CompareNoCase(_T("edit")) == 0)
            {
                pWnd->SendMessage(EM_SETSEL, 0, -1);
                return TRUE;
            }
        }
    }

    return CDialogEx::PreTranslateMessage(pMsg);
}
于 2015-11-21T06:53:30.797 回答