The EM_GETSELTEXT message retrieves the currently selected text in a rich edit control. Return Values This message returns the number of characters copied, not including the terminating null character. Так всё-таки, копирует EM_GETSELTEXT текст из ричедита, или вырезает? Написано что копирует, глазами вижу - вырезает... Текст в ричедите укорачивается на длину выделенного куска при получении его в буфер. Это ошибка msdn, или richedit'а ? Код (Text): FINDTEXTA ft; char buffer[256]; SendMessage(hActiveEdit,EM_EXGETSEL,0,(LPARAM) & ft.chrg); int start_pos = ft.chrg.cpMin; int end_pos = ft.chrg.cpMax; _repeat: ft.chrg.cpMin = ft.chrg.cpMin - 256; if (ft.chrg.cpMin < 0) ft.chrg.cpMin =0; SendMessage(hActiveEdit,EM_EXSETSEL,0,(LPARAM) & ft.chrg); Sleep(1000);//наблюдается выделенный текст SendMessage(hActiveEdit,EM_GETSELTEXT, 0,(LPARAM) & buffer); Sleep(1000);//наблюдается текст без куска, который был выделен //после SendMessage текст укорачивается на 256 байт int i=255; while (i){ MessageBox(0, & buffer[i],0,0); if (buffer[i]==13) break; i--; } if (i==-1) { i=0; if (ft.chrg.cpMin) goto _repeat; }
Конечно, копирует! Возможно, что-то не так задаешь в параметрах, скорее всего, в chrg. _1158417424__RichEdit_EM_GETSELTEXT.rar
в chrg я ничего не задаю. Он сам заполняется после посылки richedit'у EM_EXGETSEL. Твой пример работает, если версия 1.0. Если richedit версии 2.0, то MessageBox на старте пустой, при том, что текст в richedit'е выделен. А если ещё и использовать вместо CHARRANGE структуру FINDTEXTA, содержащую в себе CHARRANGE, то в мессаджбоксе один символ '"'. И выделение съезжает: вместо "толоконный" в ричедите выделяется "лоб.Пошел" .
Ох, да, русский текст не копирует в буфер . С английским - все okay, так что это глюки ричедита (глюков у него немало, если будешь постоянно работать с этим контролом - еще столкнешься с кучей ошибок). Причем если ричедит версии 2.0 и если объявить #define UNICODE, то русский текст копируется нормально. Так что это проблема с кодировками. Ее можно обойти, если вызвать SendMessage(hRTF, EM_SETTEXTMODE, TM_SINGLECODEPAGE, 0); Тогда все заработает нормально. Почему же? Вот так все работает: Код (Text): FINDTEXT ft; ft.chrg.cpMin = 14; // Выделить слово "Толоконный" ft.chrg.cpMax = 24; SendMessage(hRTF, EM_EXSETSEL, 0, (LPARAM)&ft.chrg); И никаких проблем здесь быть не должно, ибо два DWORD'а cpMin и cpMax в структуре ft.chrg - это такие же два DWORD'а, что и в отдельной CHARRANGE. Хм, не очень понятно, зачем ты вычитаешь 256. Возможно, где-то там и зарыта ошибка, из-за которой Richedit начинает вырезать вместо того, чтобы копировать. Я попытался сделать EM_EXGETSEL-EM_EXSETSEL (см. вложение), но не уверен, что именно это тебе нужно. Если нужно что-то другое, напиши, в чем состоит задача и что собственно должна делать программа. 1923105372__RichEdit_EM_GETSELTEXT2.rar
Это был способ (несколько кривой) найти индекс первого слева от курсора перевода строки. Чтобы реализовать замену Tab на пробелы. В принципе сейчас переделал на такое: Код (Text): BOOL Replace_Tab(HWND hwnd, LPARAM lParam){ FINDTEXTA ft; char buffer[6]={0,0,0,0,0,0}; int tab_align; if ( ! RegGetDwordValue(szKeyName, szTab, (LPDWORD)&tab_align)){ return FALSE; } else { if (!tab_align)return FALSE; SendMessage(hActiveEdit,EM_EXGETSEL,0,(LPARAM) & ft.chrg); int start_pos = ft.chrg.cpMin; //начало выделенного int end_pos = ft.chrg.cpMax; //конец выделенного int str_offset= SendMessage(hActiveEdit,EM_LINEINDEX,-1,0); //если не первая строка, добавляем 4 на перенос строки if (str_offset) str_offset=str_offset+4; end_pos = start_pos - str_offset; //позиция курсора от начала строки //позиция курсора от начала строки до ближайшего кратного 4 end_pos = ((end_pos + 4)>>2)<<2; end_pos = end_pos - start_pos + str_offset; //позиция курсора от начала текста int undo_count = ((end_pos == 1) ? 0 : 1); buffer[end_pos] = 0; while (end_pos > 0) {buffer[end_pos-1] = 32; end_pos--;} SendMessage(hActiveEdit, EM_REPLACESEL, TRUE,(LPARAM) &buffer[0]); if (undo_count) PostMessage(hActiveEdit,EM_UNDO,0,0); return TRUE; } } Это чтобы "таб" заменялся на количество пробелов, необходимое для доведения позиции курсора до кратной 4 от начала строки. (для лучшей читаемости текста). Оказалось, с EM_LINEINDEX можно сделать проще и надёжней. А вот глюки так и остались. Один из которых: если в строке кроме символа перевода строки есть другие символы, то перевод строки richedit воспринимает как 1 символ. Если других символов нет (пустая строка) то как 2 символа. Или это может такая "фича" у него Ну в общем решил с заменой табов на пробелы. Спасибо за участие.