EM_GETSELTEXT

Тема в разделе "WASM.WIN32", создана пользователем cresta, 7 авг 2005.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    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):
    1.     FINDTEXTA    ft;
    2.     char         buffer[256];
    3.    
    4.     SendMessage(hActiveEdit,EM_EXGETSEL,0,(LPARAM) & ft.chrg);
    5.     int start_pos = ft.chrg.cpMin;
    6.     int end_pos = ft.chrg.cpMax;
    7.    
    8. _repeat:   
    9.     ft.chrg.cpMin = ft.chrg.cpMin - 256;
    10.     if (ft.chrg.cpMin < 0) ft.chrg.cpMin =0;
    11.    
    12.     SendMessage(hActiveEdit,EM_EXSETSEL,0,(LPARAM) & ft.chrg);
    13.     Sleep(1000);//наблюдается выделенный текст
    14.     SendMessage(hActiveEdit,EM_GETSELTEXT, 0,(LPARAM)  & buffer);
    15.     Sleep(1000);//наблюдается текст без куска, который был выделен
    16.     //после SendMessage текст укорачивается на 256 байт
    17.     int i=255;
    18.     while (i){
    19.         MessageBox(0, & buffer[i],0,0);
    20.         if (buffer[i]==13) break;
    21.         i--;
    22.         }
    23.         if (i==-1) {
    24.             i=0;
    25.             if (ft.chrg.cpMin) goto _repeat;
    26.             }
    27.  
     
  2. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    в chrg я ничего не задаю. Он сам заполняется после посылки richedit'у EM_EXGETSEL.



    Твой пример работает, если версия 1.0.

    Если richedit версии 2.0, то MessageBox на старте пустой, при том, что текст в richedit'е выделен.



    А если ещё и использовать вместо CHARRANGE структуру FINDTEXTA, содержащую в себе CHARRANGE, то в мессаджбоксе один символ '"'. И выделение съезжает: вместо "толоконный" в ричедите выделяется "лоб.Пошел" .
     
  4. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia


    Ох, да, русский текст не копирует в буфер :dntknw:. С английским - все okay, так что это глюки ричедита (глюков у него немало, если будешь постоянно работать с этим контролом - еще столкнешься с кучей ошибок). Причем если ричедит версии 2.0 и если объявить #define UNICODE, то русский текст копируется нормально. Так что это проблема с кодировками.



    Ее можно обойти, если вызвать

    SendMessage(hRTF, EM_SETTEXTMODE, TM_SINGLECODEPAGE, 0);

    Тогда все заработает нормально.





    Почему же? Вот так все работает:
    Код (Text):
    1.  
    2.     FINDTEXT ft;
    3.     ft.chrg.cpMin = 14; // Выделить слово "Толоконный"
    4.     ft.chrg.cpMax = 24;
    5.     SendMessage(hRTF, EM_EXSETSEL, 0, (LPARAM)&ft.chrg);


    И никаких проблем здесь быть не должно, ибо два DWORD'а cpMin и cpMax в структуре ft.chrg - это такие же два DWORD'а, что и в отдельной CHARRANGE.





    Хм, не очень понятно, зачем ты вычитаешь 256. Возможно, где-то там и зарыта ошибка, из-за которой Richedit начинает вырезать вместо того, чтобы копировать. Я попытался сделать EM_EXGETSEL-EM_EXSETSEL (см. вложение), но не уверен, что именно это тебе нужно. Если нужно что-то другое, напиши, в чем состоит задача и что собственно должна делать программа.

    [​IMG] 1923105372__RichEdit_EM_GETSELTEXT2.rar
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257


    Это был способ (несколько кривой) найти индекс первого слева от курсора перевода строки. Чтобы реализовать замену Tab на пробелы. В принципе сейчас переделал на такое:


    Код (Text):
    1. BOOL Replace_Tab(HWND hwnd, LPARAM lParam){
    2.     FINDTEXTA         ft;
    3.     char                buffer[6]={0,0,0,0,0,0};
    4.     int                 tab_align;
    5.  
    6.     if ( ! RegGetDwordValue(szKeyName, szTab, (LPDWORD)&tab_align)){
    7.         return FALSE;
    8.         }
    9.     else {
    10.         if (!tab_align)return FALSE;
    11.         SendMessage(hActiveEdit,EM_EXGETSEL,0,(LPARAM) & ft.chrg);
    12.         int start_pos = ft.chrg.cpMin;  //начало выделенного
    13.         int end_pos = ft.chrg.cpMax;    //конец выделенного
    14.  
    15.         int str_offset= SendMessage(hActiveEdit,EM_LINEINDEX,-1,0);
    16.         //если не первая строка, добавляем 4 на перенос строки
    17.         if (str_offset) str_offset=str_offset+4;
    18.    
    19.         end_pos = start_pos - str_offset;       //позиция курсора от начала строки
    20.         //позиция курсора от начала строки до ближайшего кратного 4
    21.         end_pos = ((end_pos + 4)>>2)<<2;
    22.         end_pos = end_pos - start_pos + str_offset; //позиция курсора от начала текста
    23.         int undo_count = ((end_pos == 1) ? 0 : 1);
    24.         buffer[end_pos] = 0;
    25.         while (end_pos > 0) {buffer[end_pos-1] = 32; end_pos--;}
    26.         SendMessage(hActiveEdit, EM_REPLACESEL, TRUE,(LPARAM) &buffer[0]);
    27.         if (undo_count) PostMessage(hActiveEdit,EM_UNDO,0,0);
    28.         return TRUE;
    29.         }
    30. }




    Это чтобы "таб" заменялся на количество пробелов, необходимое для доведения позиции курсора до кратной 4 от начала строки. (для лучшей читаемости текста).

    Оказалось, с EM_LINEINDEX можно сделать проще и надёжней.



    А вот глюки так и остались. Один из которых: если в строке кроме символа перевода строки есть другие символы, то перевод строки richedit воспринимает как 1 символ. Если других символов нет (пустая строка) то как 2 символа.

    Или это может такая "фича" у него :)



    Ну в общем решил с заменой табов на пробелы. Спасибо за участие.