我正在尝试使用富编辑控件在屏幕上输出一些文本:
星期一按 1。
你的日子是星期一
星期二按 2。
我真的找不到任何简单的例子来说明如何做到这一点。我所能解决的只是设置窗口文本(setWindowText),但其他一切都在逃避我。有什么简短的例子吗?
我正在尝试使用富编辑控件在屏幕上输出一些文本:
星期一按 1。
你的日子是星期一
星期二按 2。
我真的找不到任何简单的例子来说明如何做到这一点。我所能解决的只是设置窗口文本(setWindowText),但其他一切都在逃避我。有什么简短的例子吗?
尽管有评论,但我将回答您提出的关于如何在 Rich Edit 控件中格式化数据的问题。几年前,我不得不这样做,并提出了一些我可以将其视为 IOstream 的东西(如果我今天这样做,我可能会做一些不同的事情,但生活就是这样)。
首先,代码表现得像 IOstream,但写入富编辑控件:
// 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;
如果我今天这样做,我几乎肯定会创建一个小类作为 a 的包装器,CHARFORMAT
这样我就可以更简洁地构造格式化对象。我可能至少也会认真考虑将其实现为带有流缓冲区的普通 iostream,该流缓冲区将数据插入富编辑控件(但当时我对流的了解还不够,不知道我应该这样做)。
乍一看,还有一些其他的东西也不是完全正确的——add_text
使用SetSel(-1, -1);
. 这应该真正检索文本的当前长度(例如,使用GetWindowTextLength
, 并将选择设置为刚好在结尾之后。
使用写字板,它也是一个 RichEdit 控件。它将以与您的控件自然兼容的方式生成您的 RTF。