Я создаю свое текстовое поле с этими параметрами. Я могу Копировать / Вырезать / Вставить / Отменить, но когда я нажимаю Выбрать все, он не выбирает все. Я могу щелкнуть правой кнопкой мыши и нажать Выбрать все, но 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);





Вам нужно захватить это нажатие клавиши и выбрать все самостоятельно.
Вот код 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.
Я тоже получаю такое же сообщение об ошибке, как указано выше. Куда мне нужно вставить этот фрагмент?
Может быть, что-то еще ворует Ctrl + A? Используйте Spy ++, чтобы убедиться, что он дошел до вашего поля редактирования.
Я склонен использовать MFC (простите меня) вместо Win32, поэтому я не могу ответить на этот вопрос окончательно, но я заметил, что этот комментарий добавлен на страницу на сайте MS, касающийся разговора с элементом управления Edit (простой редактор в элементе управления Edit):
The edit control uses
WM_CHARfor accepting characters, notWM_KEYDOWNetc. You mustTranslate()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, который копирует необходимый текст. Благодарность!
Почему бы не добавить к SelectAll ускоритель для Ctrl + a?
Думаю, я мог бы, но это еще код, который мне нужно написать и научиться делать. Кстати, вместо этого я использовал WM_COPY, чего я хотел. Чтобы скопировать текст в буфер обмена :)
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. Извините за путаницу.
Странно то, что 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);
Будет работать нормально.
мой говорит, что "не содержит определения для" выберите ВСЕ "и не может быть найден метод расширения, принимающий аргумент типа"