Win32 выбрать все при редактировании ctrl (текстовое поле)

Я создаю свое текстовое поле с этими параметрами. Я могу Копировать / Вырезать / Вставить / Отменить, но когда я нажимаю Выбрать все, он не выбирает все. Я могу щелкнуть правой кнопкой мыши и нажать Выбрать все, но 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);
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
8 484
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

Вот код 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.

мой говорит, что "не содержит определения для" выберите ВСЕ "и не может быть найден метод расширения, принимающий аргумент типа"

sheldonhull 19.06.2009 18:18

Я тоже получаю такое же сообщение об ошибке, как указано выше. Куда мне нужно вставить этот фрагмент?

nawfal 05.05.2011 13:52

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

Ответ принят как подходящий

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

The edit control uses WM_CHAR for accepting characters, not WM_KEYDOWN etc. You must Translate() your messages or you ironically won't be able to edit the text in the edit control.

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

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

вау, спасибо, я хотел выделить все, чтобы быстрее копировать текст. Эта ссылка показала мне WM_COPY, который копирует необходимый текст. Благодарность!

user34537 15.11.2008 06:37

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

Думаю, я мог бы, но это еще код, который мне нужно написать и научиться делать. Кстати, вместо этого я использовал WM_COPY, чего я хотел. Чтобы скопировать текст в буфер обмена :)

user34537 18.11.2008 02:47

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 (сравнение строк имени класса) глупой, и я хочу обвинить ее.

Этот код взят из приложения MFC. Мне пришлось переопределить функцию PreTranslateMessage, чтобы это произошло в диалоговом классе MFC. В обычном цикле сообщений win32 вы должны выполнить эту же задачу для каждого полученного там сообщения непосредственно перед вызовом TranslateMessage. Но тогда вам нужно будет перевести функции GetFocus и SetSel в их примитивы win32-api. Извините за путаницу.

phord 20.05.2011 00:10

Странно то, что Ctrl + A ДЕЙСТВИТЕЛЬНО работает (как выбрать все), если вы НЕ указываете ES_MULTILINE

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

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

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

Согласно MSDN,

If the start is 0 and the end is –1, all the text in the edit control is selected. If the start is –1, any current selection is deselected.

так,

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

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

Другие вопросы по теме