技术开发 频道

RichTextBox的非常好的实践


   一个图形环境从图元文件被创建,然后图像将绘制到这个环境上。
...
// 从增强图元文件中获取图形对象
using(_graphics = Graphics.FromImage(_metaFile))
{
// 绘制图像到增强文件上
_graphics.DrawImage(_image, new Rectangle(0, 0, _image.Width, _image.Height));
}
...
    通过带有一个null缓存参数的方法调用EmfToWmfBits函数将返回要存储Windows图元文件的缓存大小。这个将用于创建一个足够大的内存来存储Windows图元文件。

...
// 获取字节数
uint _bufferSize = GdipEmfToWmfBits(_hEmf, 0, null, MM_ANISOTROPIC,
EmfToWmfBitsFlags.EmfToWmfBitsFlagsDefault);

// 创建一个字节数组来存储文件
byte[] _buffer = new byte[_bufferSize];
...
   调用EmfToWmfBits来将图元文件拷贝到一个缓存中并返回已拷贝的字节数。

...
// 获取文件
uint _convertedSize = GdipEmfToWmfBits(_hEmf, _bufferSize, _buffer,
MM_ANISOTROPIC, EmfToWmfBitsFlags.EmfToWmfBitsFlagsDefault);
...
   创建一个关于图像的十六进制数组并准备插入到RichTextBox中。

// 追加位数到RTF字符串
for(int i = 0; i < _buffer.Length; ++i)
{
_rtf.Append(String.Format("{0:X2}", _buffer[i]));
}

return _rtf.ToString();
...
RTF图片目标文件

    最少的控制字被用于定义图片和图像在RTF文档是这样的{\pict\wmetafile8\picw[N]\pich[N]\picwgoal[N]\pichgoal[N] [BYTES]}”。其中
\pict - 图片和图像的其实标签
\wmetafile[N] - 指定一个Windows图元文件的图像类型。[N]=8指示图元文件的坐标轴能够被独立设置。
\picw[N] 和\pich[N] - 定义图片大小,[N]的单位是0.01mm。
\picwgoal[N]和\pichgoal[N] -定义目标图像的大小
[BYTES] - 图像的十六进制描述
在ExRichTextBox显示时,水平和垂直方位上的比率值必须先被计算出来。这些值可以由ExRichTextBox的默认构造函数从图形对象和存储的如xDpi和yDpi中获取(在大多数系统这些值是96Dpi,但是为什么呢?)。
图元文件的面积可以使用下面的公式来换算。
1英寸 = 2.54厘米
1英寸 = 25.4豪米
[N] = 目标图元文件的1/20
= 图像宽度的英寸值*n/20屏幕比率
= (图像宽度的像素值/图形环境垂直方向的比率)*1440
= (图像宽度的像素值/图形对象的DpiX)*1440

...
// 计算图像的目标宽度
int picwgoal = (int)Math.Round((_image.Width / xDpi) * TWIPS_PER_INCH);

// 计算图像的目标高度
int pichgoal = (int)Math.Round((_image.Height / yDpi) * TWIPS_PER_INCH);
...
    在图像的RTF描述被创建后,图像插入到RTF文档中就像插入纯文本那样简单。如果文本被选中,那么插入时就被替换,同样如果没被选中那么图像就插入到光标位置。

使用代码

    使用ExRichTextBox比较简单只要像ExRichTextBox工程那样包含已编译的.dll到你的工程并添加它到.Net工具条中就可以。这里有两个公有的属性用于设置:TextColor,设置插入文本的颜色如果在插入时没有指定颜色的话;HighlightColor,设置插入文本的背景颜色如果插入时没指定的话。默认情况下它们被设置为黑和白。在下载的工程中包含了两个例子:第一个模拟聊天窗口,用户通过点击表情符号或键入":)"来插入表情图像。它也展示了如何去插入纯文本到RTF。具体如下:

..
// 当一个表情图像被点击,插入一个图像到RTF
private void cmenu_Emoticons_Click(object _sender, EventArgs _args)
{
rtbox_SendMessage.InsertImage(_item.Image);
}
...

private void btn_SendMessage_Click(object sender, System.EventArgs e)
{
// 添加伪装信息
rtbox_MessageHistory.AppendTextAsRtf("Local User Said\n\n",
new Font(this.Font, FontStyle.Underline | FontStyle.Bold),
RtfColor.Blue, RtfColor.Yellow);

// 将表情符号转换成图像
int _index;
if ((_index = rtbox_SendMessage.Find(":)")) > -1) {
rtbox_SendMessage.Select(_index, ":)".Length);
rtbox_SendMessage.InsertImage(new Bitmap(typeof(IMWindow),
"Emoticons.Beer.png"));
}

// 添加一个消息到历史记录中
rtbox_MessageHistory.AppendRtf(rtbox_SendMessage.Rtf);

// 添加一个新行
rtbox_MessageHistory.AppendTextAsRtf("\n");

// 焦点历史记录
rtbox_MessageHistory.Focus();

// 查看最新的
rtbox_MessageHistory.Select(rtbox_MessageHistory.TextLength, 0);
rtbox_MessageHistory.ScrollToCaret();

// 返回焦点消息框
rtbox_SendMessage.Focus();

// 添加RTF代码到窗口
frm_RtfCodes.AppendText(rtbox_SendMessage.Rtf);

// 清除一个发送消息框内容
rtbox_SendMessage.Text = String.Empty;
}
...
    第二个例子包含了如何使用ExRichTextBox处理大图片。用户可以通过菜单插入bitmap, JPEG, GIF,Icon,PNG和TIFF格式的图像或者是纯文本。
0
相关文章