форматирование mfc richedit2

Я пытаюсь использовать элемент управления rich edit для вывода текста на экран:

понедельник Нажмите 1.
Твой день понедельник
вторник Нажмите 2.

Я не могу найти простых примеров того, как это сделать. все, что я смог разобраться, это установить текст окна (setWindowText), но все остальное ускользает от меня.
Есть короткие примеры?

0

Решение

Несмотря на комментарии, я собираюсь ответить на заданный вами вопрос о том, как форматировать данные в элементе управления Rich Edit. Несколько лет назад я должен был сделать это и придумал что-то, что я мог бы немного трактовать как IOstream (если бы я делал это сегодня, я бы, вероятно, сделал это немного по-другому, но такова жизнь).

Во-первых, код для работы как IOstream, но запись в элемент управления rich-edit:

// rich_stream.h:
#ifndef RICH_STREAM_H
#define RICH_STREAM_H

class rich_stream {
CRichEditCtrl &ctrl;
public:
rich_stream(CRichEditCtrl &ctrl_) : ctrl(ctrl_) { }

void add_text(char const *txt) {
ctrl.SetSel(-1,-1);
ctrl.ReplaceSel(txt);
}

void add_int(int val) {
CString temp;
temp.Format("%d", val);
add_text(temp);
}

void set_char_format(CHARFORMAT &fmt) {
ctrl.SetSelectionCharFormat(fmt);
}
};

inline rich_stream &operator<<(rich_stream &s, char const *t) {
s.add_text(t);
return s;
}

inline rich_stream &operator<<(rich_stream &s, CHARFORMAT &fmt) {
s.set_char_format(fmt);
return s;
}

inline CString nl() {
return CString("\n\n");
}

inline rich_stream &operator<<(rich_stream &s, CString (*f)()) {
s.add_text(f());
return s;
}

inline rich_stream &operator<<(rich_stream &s, int val) {
s.add_int(val);
return s;
}
#endif

Затем я бы использовал это что-то вроде:

CHARFORMAT bold;

memset(&bold, 0, sizeof(bold));
bold.cbSize = sizeof(bold);
bold.dwMask = CFM_BOLD | CFM_FACE | CFM_SIZE;
bold.dwEffects = CFE_BOLD;
strcpy(bold.szFaceName, "Times");
bold.yHeight = 14 * 20;

CHARFORMAT normal;
memset(&normal, 0, sizeof(normal));
normal.cbSize = sizeof(normal);
normal.dwMask = CFM_BOLD | CFM_FACE | CFM_SIZE;
normal.dwEffects = 0;
strcpy(normal.szFaceName, "Times");
normal.yHeight = 14 * 20;

// ...

rich_stream txt(GetRichEditCtrl());

txt << bold << "Heading 1: " << normal << info1 << nl
<< bold << "Heading 2: " << normal << info2 << nl
<< bold << "Heading 3: " << normal << info3;

Если бы я делал это сегодня, я почти наверняка создал бы небольшой класс в качестве оболочки для CHARFORMAT так что я мог бы построить объекты форматирования немного более чисто. Я бы, по крайней мере, тоже подумал о том, чтобы реализовать его как обычный iostream с буфером потока, который вставлял данные в элемент управления rich edit (но в то время я не знал потоков достаточно хорошо, чтобы понять, что мне следует это делать).

Взглянув на это, есть еще несколько вещей, которые на самом деле не совсем верны — add_text использования SetSel(-1, -1);, Это должно действительно извлечь текущую длину текста (например, с GetWindowTextLengthи установите выбор сразу после окончания.

3

Другие решения

Используйте Wordpad, это тоже элемент управления RichEdit. Он будет генерировать ваш RTF способом, который естественно совместим с вашим контролем.

1

По вопросам рекламы [email protected]