Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отступы RichEdit, \n 
V
    Опции темы
Ksander1000
Дата 1.9.2010, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 8.8.2009

Репутация: нет
Всего: нет



Скажите пожалуйста - правильно ли получение текста через GetWindowText из RichEdit, и если да, то можно ли заменить на выходе отступы ввиде двух пуcтых символов ( str[5] == '' str[6] == '' так выглядит отступ smile ) на что-то подобное '\n' ?

Это сообщение отредактировал(а) Ksander1000 - 5.9.2010, 10:38
PM MAIL   Вверх
GremlinProg
Дата 1.9.2010, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Ksander1000 @  1.9.2010,  13:46 Найти цитируемый пост)
правильно ли получение текста через GetWindowText из RichEdit

да, правильно, но RichEdit еще позволяет получить текст в разных форматах через EM_STREAMOUT
Цитата(Ksander1000 @  1.9.2010,  13:46 Найти цитируемый пост)
можно ли заменить на выходе отступы ввиде двух пуcтых символов

я так и не понял что тут требуется


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Ksander1000
Дата 1.9.2010, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 8.8.2009

Репутация: нет
Всего: нет



Ну например в RichEdit поле имеються: 
ggg (перенос на слудующию строку)
ggg

и если получить текст из этого поля с этими словами, то вместо ожидаемого отступа '\n' smile я получаю:        

        [0]    103 'g'    char
        [1]    103 'g'    char
        [2]    103 'g'    char
        [3]    13 ''        char        
        [4]    10 ''        char
        [5]    103 'g'    char
        [6]    103 'g'    char
        [7]    103 'g'    char

Можно ли сразу получить \n ? smile


Это сообщение отредактировал(а) Ksander1000 - 1.9.2010, 13:30
PM MAIL   Вверх
GremlinProg
Дата 1.9.2010, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



да, теперь понятно

можно использовать EM_GETTEXTEX, там за  эти 2 символа CR и LF отвечает флаг GT_USECRLF,
т.е. если его не будет указано то, перевод строки, по идее должен быть одним символом


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Ksander1000
Дата 1.9.2010, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 8.8.2009

Репутация: нет
Всего: нет



Спасибо smile
Пожалуйста раскажите ещё о структуре GETTEXTEX:
получаеться cb - это размер принимаемого текста?
codepage - кодировка исходного текста?
lpDefaultChar, lpUsedDefChar вобще что-то не понял ))
PM MAIL   Вверх
GremlinProg
Дата 1.9.2010, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Ksander1000 @  1.9.2010,  16:49 Найти цитируемый пост)
получаеться cb - это размер принимаемого текста?

да, именно размер (не число символов)
Цитата(Ksander1000 @  1.9.2010,  16:49 Найти цитируемый пост)
codepage - кодировка исходного текста?

верно
Цитата(Ksander1000 @  1.9.2010,  16:49 Найти цитируемый пост)
lpDefaultChar, lpUsedDefChar вобще что-то не понял ))

в MSDN все написано, так что просто перевожу:

lpDefaultChar - это спец символ (в кодировке ANSI), который будет подставляться всякий раз, когда в тексте встретится "неопознанный" для выбранной (не юникод) кодировки символ,

lpUsedDefChar - это указатель на булеву переменную, которая после вызова функции будет хранить признак того,
что такой символ хоть раз да встретился в тексте


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Ksander1000
Дата 1.9.2010, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 8.8.2009

Репутация: нет
Всего: нет



Большое спасибо smile
Только как узнать размер текста, ведь вроде GetWindowTextLength возвращает длинну...
Можно неольшой пример получения текста из richedit?  smile 


Это сообщение отредактировал(а) Ksander1000 - 1.9.2010, 16:51
PM MAIL   Вверх
Earnest
Дата 1.9.2010, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Насколько я понимаю, это размер буфера, который ты выделяешь сам и передаешь в lParam. Выделяй с запасом.
Цитата

lParam
Pointer to a null-terminated string that receives the text. The size of this buffer should be placed in the cb member of the GETTEXTEX structure. 



--------------------
...
PM   Вверх
GremlinProg
Дата 2.9.2010, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



я покажу часть враппера для RichEdit'а, это 4 простых метода класса-обертки:
Код

    LRESULT        GetTextLengthEx( GETTEXTLENGTHEX*lpGetTextLengthEx )const{
        return SendMessage( EM_GETTEXTLENGTHEX, (LPARAM)lpGetTextLengthEx, 0 );
    }
    LRESULT        GetTextEx( GETTEXTEX*lpGetTextEx, W( , CHAR )*lpszBuffer )const{
        return SendMessage( EM_GETTEXTEX, (LPARAM)lpGetTextEx, (LPARAM)lpszBuffer );
    }
    LRESULT                GetTextLengthEx( DWORD Flags )const{
        GETTEXTLENGTHEX Params;
        //
        Params.flags        = Flags;
        Params.codepage    = uif( CP_ACP, 1200 );
        return GetTextLengthEx( &Params );
    }
    std::w( , string )    GetTextEx( DWORD Flags )const{
        GETTEXTEX Params;
        std::w( , string )Buffer;
        //
        Params.flags        = Flags;
        Params.lpDefaultChar    = NULL;
        Params.lpUsedDefChar    = NULL;
        Params.codepage    = uif( CP_ACP, 1200 );
        Flags            = GTL_NUMCHARS | ( ( Flags & GT_USECRLF ) ? GTL_USECRLF : 0 );
        if( !( Params.cb = (DWORD)GetTextLengthEx( Flags ) ) ){
            return ucat( , "", , L );
        }
        Buffer.resize( Params.cb );
        //
        ++Params.cb;
        Params.cb    *= sizeof( W( , CHAR ) );
        //
        if( !Buffer.empty() ){
            GetTextEx( &Params, &*Buffer.begin() );
        }
        return Buffer;
    }


Добавлено через 2 минуты и 2 секунды
используемые макросы для трансляции кодировки:
Код

#ifndef UNICODE
    #define ucat( left, right, ansi, unicode )    left ## ansi ## right
    #define uif( ansi, unicode )        ansi
#else
    #define ucat( left, right, ansi, unicode )    left ## unicode ## right
    #define uif( ansi, unicode )        unicode
#endif
//
#define w( left, right )    ucat( left, right, , w )
#define W( left, right )    ucat( left, right, , W )


Добавлено через 12 минут и 17 секунд
использовать - как обычный враппер,
назовем, к примеру этот класс-обертку CRichEditWrapper, тогда получить текст можно так:
Код

CRichEditWrapper Wr = hwnd;
::MessageBox( NULL, Wr.GetTextEx( GT_DEFAULT ).c_str(), NULL, NULL );

hwnd - дескриптор richedit'а


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Ksander1000
Дата 2.9.2010, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 8.8.2009

Репутация: нет
Всего: нет



GremlinProg спасибо, часть врайпера мне много показала smile

Пожалуйста скажите что здесь неправильно:
Код

/////////////////////////////////__Получение размера текста__/////////////////////////////////////////////

UINT GetTextLength(HWND hEdit)
{
    GETTEXTLENGTHEX lg;
    
    lg.codepage = 1200;
    lg.flags = 0;

    return SendMessage(hEdit, EM_GETTEXTLENGTHEX, (WPARAM)&lg, 0);
}

//////////////////////////////////__Получение текста__/////////////////////////////////////////////

wchar_t GetText(HWND *hEdit, UINT length)
{
    GETTEXTEX text;
    wchar_t* buf = new wchar_t[length];

    text.cb = length;
    text.codepage = 1200;
    text.flags = GT_DEFAULT;
    text.lpDefaultChar = 0;
    text.lpUsedDefChar = 0;

    SendMessage(*hEdit, EM_GETTEXTEX, (WPARAM)&text, (LPARAM)&buf);

    return *buf;
}


В *buf что-то вроде этого '棋ꆵᕩĀ○○'
Кодировка юникод
________________________________________________________________________

Кажеться нашёл причину, FindWindowEx не находит главное окно приложения (unused = CXX0030: ошибка: невозможно вычислить выражение), хотя всё указанно правильно smile

________________________________________________________________________

Сейчас запустил несколько раз для теста с остановка программы после поиска описателей окон (при этом код не менял), и 2 раза

 функция нашла описатель, но после этого GetDlgItem не мог найти описатель с той же ошибкой...

Это сообщение отредактировал(а) Ksander1000 - 2.9.2010, 15:44
PM MAIL   Вверх
GremlinProg
Дата 2.9.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



FindWindowEx может и не находит какое-то окно, но он тут видимо ни при чем

если не хочешь использовать STL ( это все, что начинается с std:: ),
то попробуй для начала разобраться в этих вопросах:
1. суть строки в С/С++
2. дескриптора в WinAPI
3. памяти как таковой ( + работа с указателями )

третий пункт - ключевой

а чтобы немного отложить час расплаты, можно пока просто поправить вызов:
Код

SendMessage(*hEdit, EM_GETTEXTEX, (WPARAM)&text, (LPARAM)buf);



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Ksander1000
Дата 3.9.2010, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 8.8.2009

Репутация: нет
Всего: нет



Спасибо, текст получаю из edit поля, наверное FindWindowEx так и должна работать smile
Только осталось одно - за место отступов остаються пустые индексы масива (теперь только 1 на 1 отступ smile ), скажите пожалуйста - что значат эти пустые индексы (пример в 3 сообщении)?

__________________________________________________________________________

Всё понял, это были '\r' smile


Это сообщение отредактировал(а) Ksander1000 - 5.9.2010, 04:26
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0533 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.