Начало выбора всего (ctrl-a) для работы с элементом управления CEdit - PullRequest
0 голосов
/ 22 ноября 2011

Я пытаюсь реализовать выделение всех (через ctrl-a) в элементе управления CEdit.Я делаю это, создавая класс, который наследует 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 ]

2 голосов
/ 22 ноября 2011

Попробуйте этот код:

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

         /// blah

        }
    }

    return CEdit::PreTranslateMessage(pMsg);
}
0 голосов
/ 15 июня 2018

Чтобы реализовать 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);
}
0 голосов
/ 21 ноября 2015

Еще один способ реализации CTRL + A без расширения класса CEdit.

Переопределить функцию-член 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);
}
...