Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CRichEdit 2.0 Две проблемы, Остается выделение, Кодировка 
V
    Опции темы
evilWizard
Дата 4.12.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 4.12.2006
Где: Ukraine, Zhitomyr

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



1) Использую данный контрол для своего переводчика, при добавлении слов с расширенной кириллицей вместо букв отображаются знаки вопроса. Как с этим бороться? Слова хранятся и передаются в Unicode. Что странно: при добавлении этих же слов в CEdit - отображаются нормально.

2) Заполняю словами с помощью методов SetSel(), ReplaceSelection(). При отображении, весь текст остается выделенным визуально, хотя методы возвращают, что ничего не выделено. Что это за фича? И как с ней бороться.

Контрол создан на форме диалога (не динамически). 

Пожалуйста, напишите свои соображения, кто сталкивался с чем-то подобным.
PM MAIL ICQ YIM MSN   Вверх
evilWizard
Дата 6.12.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 4.12.2006
Где: Ukraine, Zhitomyr

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



Люди, помогите! Долбусь третий день с этим долбаным контролом.  smile Неужели ни у кого не возникало таких проблем?!? smile 

Могу привести код:
Код

//==== Определения

       CWord *Article

class CWord
{
public:

    ...

    PTSTR m_WordFrom;
    PTSTR* m_WordTo;
        
        ... 
};

//===== Инициализация диалога и текста в контроле
BOOL TransDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    CHARFORMAT cf;

    cf.cbSize = sizeof(CHARFORMAT);
    cf.dwMask = CFM_COLOR | CFM_BOLD; // CFM_SIZE
        cf.dwEffects = cf.dwEffects & !CFE_AUTOCOLOR | CFE_BOLD;
    cf.crTextColor = RGB(0,0,0);

    int stPos = 0;
    int edPos = 0;
    
    m_TransRE.SetWindowText(Article->m_WordFrom);
    edPos = m_TransRE.GetWindowTextLength();
    m_TransRE.SetSel(stPos, edPos);

    m_TransRE.SetSelectionCharFormat(cf);
    m_TransRE.SetSel(edPos, edPos);
    m_TransRE.ReplaceSel(_T("\n "));
    
    stPos = edPos;
    edPos = m_TransRE.GetWindowTextLength()-1; // 1 символ переноса считается как 2
    m_TransRE.SetSel(edPos, edPos);

    TCHAR wt[1024]= {0};

    for (unsigned i=0; i<Article->m_AmTo; i++)
    {
        if (i>0) StrCat(wt, _T("\n "));
        StrCat(wt, Article->m_WordTo[i]);
    }


    m_TransRE.ReplaceSel(wt);

    cf.dwEffects = cf.dwEffects & !CFE_BOLD; // To disable CFE_AUTOCOLOR
    stPos = edPos;
    edPos = m_TransRE.GetWindowTextLength()-1;
    m_TransRE.SetSel(stPos, edPos);
    m_TransRE.SetSelectionCharFormat(cf);
    m_TransRE.SetSel(0, 0);

            
    return TRUE;  
}



PM MAIL ICQ YIM MSN   Вверх
evilWizard
Дата 7.12.2006, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 4.12.2006
Где: Ukraine, Zhitomyr

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



Блин, долбанутый контролл.

Провел исследование перед вставкой в контрол wt содержит Юникод-строку, и метод ReplaceSel, также как и SetWindowText фильтрует строку по какому-то хитровыеб..му майкрософтовскому алгоритму. Так, например, вместо символа с кодом 049Bh в конрол подается 003Fh (знак вопроса). Это касается и метода SetWindowText для окна диалога, если я там пытаюсь прописать расширенные символы (но тут скорее дело в шрифте, потому что вместо вопросов отображается полый квадрат (отсутствует глиф в шрифте)). И как с этим разобраться.... smile  smile  smile

Читал где-то, что Coocky нравится этот контрол.

Coocky, помочь можешь???
PM MAIL ICQ YIM MSN   Вверх
evilWizard
Дата 8.12.2006, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 4.12.2006
Где: Ukraine, Zhitomyr

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



Первая проблема решена: выбрал базовый класс RichEdit20W. 
Вторая еще актуальна.

Это сообщение отредактировал(а) evilWizard - 8.12.2006, 14:03
PM MAIL ICQ YIM MSN   Вверх
evilWizard
Дата 8.12.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 4.12.2006
Где: Ukraine, Zhitomyr

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



На одном из форумов нашел решение: чел говорит что через полсекунды по таймеру срабатывает SetSel(0,0). 
Исследовав этот феномен, я наконец догнал...

В конце события OnPaint вставил вызов своего метода (на будущее) PostPaint:
Код

void TransDlg::PostPaint(void)
{
    m_TransRE.SetSel(0, 0);
}


... и все как рукой сняло. smile Я вот сейчас думаю: "..стоило ли оно того матюгального аппарата..."

Спасибо всем за внимание, с вами приятно пообщаться. Все такие многословные - просто офигеть!

Это сообщение отредактировал(а) evilWizard - 8.12.2006, 16:11
PM MAIL ICQ YIM MSN   Вверх
marra
Дата 25.3.2009, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



evilWizard, спасибо за то, что написал здесь решение этой проблемы с выделением в rich edit. Помогло. =)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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