获取全部选择(ctrl-a)以在CEdit控件上工作

时间:2011-11-22 01:26:51

标签: winapi mfc win32gui

我正在尝试在CEdit控件中实现select all(通过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,无论是一个还是另一个。

3 个答案:

答案 0 :(得分:2)

试试这段代码:

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

         /// blah

        }
    }

    return CEdit::PreTranslateMessage(pMsg);
}

答案 1 :(得分: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);
}

答案 2 :(得分:0)

要对窗口中的所有编辑控件实施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);
}