Сообщений 0    Оценка 29        Оценить  
Система Orphus

Как изменить текст в edit box'е?

Автор: Игорь Вартанов
Опубликовано: 17.07.2001
Исправлено: 13.03.2005
Версия текста: 1.0

Полная замена текста

Поскольку edit box является окном, то для изменения текста в нем вполне подойдет функция SetWindowText() (либо SetDlgItemText(), что, в сущности, дела не меняет). В этом случае произойдет полная замена текста в окне.

// Пример полной замены текста.
LPCSTR szText   = "Полная замена текста в окне редактирования.";
HWND   hwndEdit = GetDlgItem(hDlg, IDC_EDIT);
SetWindowText(hwndEdit, szText);

Вставка/замена фрагмента

В зависимости от ситуации может потребоваться не полная, а частичная замена имеющегося текста, либо присоединение фрагмента текста к уже имеющемуся. И тот, и другой случаи обрабатываются выделением фрагмента текста (посылкой сообщения EM_SETSEL) и посылкой сообщения EM_REPLACESEL окну редактирования.

// Пример вставки фрагмента.
// Если имеется выделение, оно будет заменено фрагментом текста, 
// если выделение отсутствует, фрагмент будет добавлен к концу текста.

int selFirst = 0, selLast = 0;
SendDlgItemMessage ( hDlg,   IDC_EDIT1, EM_GETSEL, 
                    (WPARAM) &selFirst, (LPARAM) &selLast );
if(selFirst == selLast)
{
    // Получим длину текста для многострочного окна редактирования
    selFirst = selLast = lstrlen(
              *(char**) SendDlgItemMessage ( 
                            hDlg, IDC_EDIT1, 
                            EM_GETHANDLE, 0, 0 ) );
}
SendDlgItemMessage ( hDlg, IDC_EDIT1, EM_SETSEL, selFirst, selLast );
SendDlgItemMessage ( hDlg, IDC_EDIT1, EM_REPLACESEL, TRUE, (LONG)szReplace );

Чтобы присоединить фрагмент к уже имеющемуся тексту, необходимо установить указатели начала и конца области выделения на позицию сразу за последним символом текста, для чего необходимо получить его общую длину.

В данном примере использован способ получения указателя на внутренний буфер окна редактирования и определения длины хранящейся в нем строки (Внимание! сообщение EM_GETHANDLE имеет смысл только для окна редактирования, имеющего стиль ES_MULTILINE). Вы, разумеется, можете использовать любые другие способы определения искомой длины. Так, например, для однострочного окна можно использовать сообщение EM_LINELENGTH.

Кроме того, вставку фрагмента можно осуществить посредством операций с буфером обмена (посылкой окну сообщения WM_PASTE), при условии, что вставляемый фрагмент уже находится в буфере. Разумеется, предварительно необходимо установить область выделения в окне редактирования.

// Вставка текста из буфера обмена
SendDlgItemMessage(hDlg, IDC_EDIT1, WM_PASTE, 0, 0);

Удаление фрагмента

Удаление фрагмента текста эквивалентно замене выделенного текста строкой нулевой длины. Следовательно, описанная выше методика позволяет выполнить удаление части (или всего) текста. Опять-таки, для этого необходимо осуществить выделение нужного участка текста и послать сообщение EM_REPLACESEL окну редактирования.

SendMessage(hwndEdit, EM_REPLACESEL, TRUE, (LPARAM)"");

Для той же цели можно воспользоваться посылкой сообщения WM_CLEAR.

SendMessage(hwndEdit, WM_CLEAR, 0, 0);

Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
    Сообщений 0    Оценка 29        Оценить