win32 выбрать все при редактировании Ctrl (текстовое поле) - PullRequest
4 голосов
/ 15 ноября 2008

Я создаю текстовое поле с этими параметрами. Я могу скопировать / вырезать / вставить / отменить, но когда я нажимаю кнопку «Выбрать», он не выбирает все. Я могу щелкнуть правой кнопкой мыши и выбрать все, но ctrl a ничего не делает, почему?

        wnd = CreateWindow("EDIT", 0,
            WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL,
            x, y, w, h,
            parentWnd,
            NULL, NULL, NULL);

Ответы [ 7 ]

6 голосов
/ 25 ноября 2008

Ctrl + A не является встроенным ускорителем, как Ctrl + C и Ctrl + V . Вот почему вы видите сообщения WM_CUT, WM_PASTE и WM_COPY, но WM_SELECTALL не определено.

Вы должны реализовать эту функцию самостоятельно. Я сделал это в своем приложении MFC следующим образом:

static BOOL IsEdit( CWnd *pWnd ) 
{
    if ( ! pWnd ) return FALSE ;
    HWND hWnd = pWnd->GetSafeHwnd();
    if (hWnd == NULL)
     return FALSE;

    TCHAR szClassName[6];
    return ::GetClassName(hWnd, szClassName, 6) &&
         _tcsicmp(szClassName, _T("Edit")) == 0;
}

BOOL LogWindowDlg::PreTranslateMessage(MSG* pMsg) 
{
    if(pMsg->message==WM_KEYDOWN)
    {
        if ( pMsg->wParam=='A' && GetKeyState(VK_CONTROL)<0 )
        {
            // User pressed Ctrl-A.  Let's select-all
            CWnd * wnd = GetFocus() ;
            if ( wnd && IsEdit(wnd) )
                ((CEdit *)wnd)->SetSel(0,-1) ;
        }
    }   
    return CDialog::PreTranslateMessage(pMsg);
}

Обратите внимание, я украл IsEdit с этой страницы: http://support.microsoft.com/kb/145616

Я отмечаю это отчасти потому, что хочу отдать должное, а отчасти потому, что считаю, что функция IsEdit (сравнение строк с именами классов) глупа, и я хочу обвинить.

3 голосов
/ 31 декабря 2011

Странно то, что Ctrl + A РАБОТАЕТ (как выбрать все), если вы НЕ указываете ES_MULTILINE

Но это не поможет, если вам нужна многострочная

Документация MSDN для ES_MULTILINE , похоже, ничего об этом не говорит.

3 голосов
/ 15 ноября 2008

Вам нужно запечатлеть это нажатие клавиши и выбрать все самостоятельно.

Вот код C # для использования с RichTextBox:

    protected override void OnKeyDown(KeyEventArgs e)
    {
        // Ctrl-A does a Select All in the editor window
        if (e.Control && (e.KeyCode == Keys.A))
        {
            this.SelectAll();
            e.Handled = true;
        }
    }

Извините, у меня нет кода Win32 для вас.

2 голосов
/ 05 апреля 2013

Вы можете просто использовать сообщение EM_SETSEL для текстового поля,

По данным MSDN,

Если начало равно 0, а конец равен -1, выбирается весь текст в элементе управления редактированием. Если начало –1, любой текущий выбор отменяется.

так

SendMessage(hwndEdit,EM_SETSEL,0,-1);

Будет работать нормально.

2 голосов
/ 15 ноября 2008

Я склонен использовать MFC (простите меня) вместо win32, поэтому я не могу ответить на этот вопрос окончательно, но я заметил, что этот комментарий добавлен на страницу на сайте MS, касающуюся общения с элементом управления Edit (простой редактор внутри элемента управления Edit) :

Элемент управления редактирования использует WM_CHAR для принятие символов, а не WM_KEYDOWN и т. д. Вы должны перевести () ваш сообщения или вы по иронии судьбы не будете возможность редактировать текст в редактировании управление.

Я не знаю, относится ли это к ответу BoltBait, но я подозреваю, что это так.

(я нашел это в http://msdn.microsoft.com/en-us/library/bb775462(VS.85).aspx)

0 голосов
/ 17 ноября 2008

Почему бы не добавить ускоритель для Ctrl + a до SelectAll?

0 голосов
/ 15 ноября 2008

Может быть, что-то еще крадет Ctrl + A ? Используйте Spy ++, чтобы убедиться, что он достигает вашего элемента управления редактирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...