01 октября 2006

Edit_SelectAll()

Казалось бы, простая задача - при получении фокуса edit box'ом выделить в нем весь текст. У стандартного edit-а в Windows есть даже такое сообщение EM_SETSEL, которое позволяет выделить любую часть текста. Можно и весь текст выделить. Только при любом выделении текста через EM_SETSEL курсор встает после выделения. Таким образом если текст в edit-е введен длинный - то мы увидим хвост этого текста, а не начало. А такой вариант - полный идиотизм: например, при переходе в ячейку, в которую введено "Иванов Петр Григорьевич" мы увидим [етр Григорьевич] вместо [Иванов Петр Гр], хотя последний вариант намного информативный. К слову сказать, в Microsoft Office сделано правильно, но там свои контролы, а у нас - стандартный edit.

Облазив DejaNews Google.Groups я понял, что цивилизоанного способа попросить стандартный edit поставить курсор в начале выделения люди так и не нашли. Пришлось написать свой трехколесный велосипед:
1. Ставим курсор в конец текста
2. Нажимаем Shift-Home

Как я не люблю такие извращения... Давно пора написать свой edit control или перейти на Scintilla.
void Edit_SelectAll(HWND Edit)
{
ATLASSERT(::IsWindow(Edit));

// Move cursor to the end of text
int Len = ::GetWindowTextLength(Edit);
::SendMessage(Edit, EM_SETSEL, Len, Len);

// Set [Shift] key state as pressed
BYTE KeyboardState[256];
::GetKeyboardState(KeyboardState);
BYTE ShiftState = KeyboardState[VK_SHIFT];
KeyboardState[VK_SHIFT] = ShiftState | 0x80;
::SetKeyboardState(KeyboardState);

// Press [Home] key
::SendMessage(Edit, WM_KEYDOWN, VK_HOME, 0x01470001);

// Restore [Shift] key state
KeyboardState[VK_SHIFT] = ShiftState;
::SetKeyboardState(KeyboardState);
}

Комментариев нет: