现在正在做个一局域网的聊天程序,需要在编辑框中插入图片,就向QQ的那样,上网找了很久也得不到很好的解决办法。主要方法应该有两种:
1:一种是利用粘贴板,个人觉得很不好,因为如果粘贴板里有东西的话就会被冲掉了。
2:用richTextBox的 rtf 格式。就是把图片弄成rtf流再弄到richTextBox里去。但是,这种方法对于我来说比较难,我也从网上找了一个ExRichTextBox的第三方控件,用是可以用,但是如果插入一个比较大的图片的话,就好象没响应了一样,效率很不好。所以,希望大家出个主意。其实我个人更倾向于用rtf格式来做,但是不知道要怎么做(虽然也下载了很多相关的代码),而且效率好象也不好。各位有什么好的方法?如果有什么比较好用的第三方控件,大家也来说说,刚装了一个Developer Express,里面有么?时间紧迫,时间紧迫啊~~~~~~~!!
1:一种是利用粘贴板,个人觉得很不好,因为如果粘贴板里有东西的话就会被冲掉了。
2:用richTextBox的 rtf 格式。就是把图片弄成rtf流再弄到richTextBox里去。但是,这种方法对于我来说比较难,我也从网上找了一个ExRichTextBox的第三方控件,用是可以用,但是如果插入一个比较大的图片的话,就好象没响应了一样,效率很不好。所以,希望大家出个主意。其实我个人更倾向于用rtf格式来做,但是不知道要怎么做(虽然也下载了很多相关的代码),而且效率好象也不好。各位有什么好的方法?如果有什么比较好用的第三方控件,大家也来说说,刚装了一个Developer Express,里面有么?时间紧迫,时间紧迫啊~~~~~~~!!
我原来也是用那个EXRichTextBox 也出现这种问题 有点无奈
我自己也做了一个扩展的Richtextbox我的控件插入表情,走的就不是粘贴板,可是表情图片也小啊;
至于自定义图片,我也是走剪切板,呵呵,保证速度~~
你要知道,一个大的图片解析成为rtf格式会好用多大的空间??
连QQ解决也是降低图片大小和清晰度,然后再插入的;
如果你想转为rtf格式,建议还是对图片进行处理然后再考虑其他吧!!
参考我的下载空间的控件;││博客空间:http://blog.csdn.net/lovingkiss
││资源下载:http://download.csdn.net/user/lovingkiss
││Email:loving-kiss@163.com [MSN也是这个]
││联系方式:Q66840199 项目、聊天、咨询、探讨、统统收费,呵呵......
╚---------------------------------------------------------------------------------------------------------ō*︻$▅▆▇◤
QQ解决是截图降低图片清晰度,BMP的似乎都降低了清晰度;
插入的时候不是——它里面内嵌了自己的OLE图像控件,可以解析Gif文件的;
或者在输入区域插入一个WORD的控件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Collections.Specialized;
using System.IO;namespace WindowsApplication8
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ContextAdder.InsertImage(richTextBox1, Image.FromFile(@"c:\temp\temp.gif"));
}
}
public class ContextAdder
{
public const int
EmfToWmfBitsFlagsDefault = 0x00000000,
EmfToWmfBitsFlagsEmbedEmf = 0x00000001,
EmfToWmfBitsFlagsIncludePlaceable = 0x00000002,
EmfToWmfBitsFlagsNoXORClip = 0x00000004; [DllImport("gdiplus.dll")]
public static extern uint GdipEmfToWmfBits(IntPtr _hEmf, uint _bufferSize, byte[] _buffer, int _mappingMode, int _flags); private struct RtfFontFamilyDef
{
public const string Unknown = @"\fnil";
public const string Roman = @"\froman";
public const string Swiss = @"\fswiss";
public const string Modern = @"\fmodern";
public const string Script = @"\fscript";
public const string Decor = @"\fdecor";
public const string Technical = @"\ftech";
public const string BiDirect = @"\fbidi";
} private const int MM_ISOTROPIC = 7;
private const int MM_ANISOTROPIC = 8;
private const int HMM_PER_INCH = 2540;
private const int TWIPS_PER_INCH = 1440; private const string FF_UNKNOWN = "UNKNOWN"; private const string RTF_HEADER = @"{\rtf1\ansi\ansicpg1252\deff0\deflang1033";
private const string RTF_DOCUMENT_PRE = @"\viewkind4\uc1\pard\cf1\f0\fs20";
private const string RTF_DOCUMENT_POST = @"\cf0\fs17}";
private const string RTF_IMAGE_POST = @"}"; private static HybridDictionary rtfFontFamily; static ContextAdder()
{
rtfFontFamily = new HybridDictionary();
rtfFontFamily.Add(FontFamily.GenericMonospace.Name, RtfFontFamilyDef.Modern);
rtfFontFamily.Add(FontFamily.GenericSansSerif.Name, RtfFontFamilyDef.Swiss);
rtfFontFamily.Add(FontFamily.GenericSerif.Name, RtfFontFamilyDef.Roman);
rtfFontFamily.Add(FF_UNKNOWN, RtfFontFamilyDef.Unknown);
} private static string GetFontTable(Font _font)
{
StringBuilder _fontTable = new StringBuilder();
_fontTable.Append(@"{\fonttbl{\f0");
_fontTable.Append(@"\");
if (rtfFontFamily.Contains(_font.FontFamily.Name))
_fontTable.Append(rtfFontFamily[_font.FontFamily.Name]);
else
_fontTable.Append(rtfFontFamily[FF_UNKNOWN]);
_fontTable.Append(@"\fcharset0 ");
_fontTable.Append(_font.Name);
_fontTable.Append(@";}}");
return _fontTable.ToString();
} /// <summary>
/// 在RichTextBox当前光标处插入一副图像。
/// </summary>
/// <param name="rtb">多格式文本框控件</param>
/// <param name="image">插入的图像</param>
public static void InsertImage(RichTextBox rtb, Image image)
{
StringBuilder _rtf = new StringBuilder();
_rtf.Append(RTF_HEADER);
_rtf.Append(GetFontTable(rtb.Font));
_rtf.Append(GetImagePrefix(rtb, image));
_rtf.Append(GetRtfImage(rtb, image));
_rtf.Append(RTF_IMAGE_POST);
rtb.SelectedRtf = _rtf.ToString();
} private static string GetImagePrefix(RichTextBox rtb, Image _image)
{
float xDpi;
float yDpi;
using (Graphics _graphics = rtb.CreateGraphics())
{
xDpi = _graphics.DpiX;
yDpi = _graphics.DpiY;
} StringBuilder _rtf = new StringBuilder();
int picw = (int)Math.Round((_image.Width / xDpi) * HMM_PER_INCH);
int pich = (int)Math.Round((_image.Height / yDpi) * HMM_PER_INCH);
int picwgoal = (int)Math.Round((_image.Width / xDpi) * TWIPS_PER_INCH);
int pichgoal = (int)Math.Round((_image.Height / yDpi) * TWIPS_PER_INCH);
_rtf.Append(@"{\pict\wmetafile8");
_rtf.Append(@"\picw");
_rtf.Append(picw);
_rtf.Append(@"\pich");
_rtf.Append(pich);
_rtf.Append(@"\picwgoal");
_rtf.Append(picwgoal);
_rtf.Append(@"\pichgoal");
_rtf.Append(pichgoal);
_rtf.Append(" ");
return _rtf.ToString();
} private static string GetRtfImage(RichTextBox rtb, Image _image)
{
StringBuilder _rtf = null;
MemoryStream _stream = null;
Graphics _graphics = null;
Metafile _metaFile = null;
IntPtr _hdc;
try
{
_rtf = new StringBuilder();
_stream = new MemoryStream();
using (_graphics = rtb.CreateGraphics())
{
_hdc = _graphics.GetHdc();
_metaFile = new Metafile(_stream, _hdc);
_graphics.ReleaseHdc(_hdc);
}
using (_graphics = Graphics.FromImage(_metaFile))
{
_graphics.DrawImage(_image, new Rectangle(0, 0, _image.Width, _image.Height));
}
IntPtr _hEmf = _metaFile.GetHenhmetafile();
uint _bufferSize = GdipEmfToWmfBits(_hEmf, 0, null, MM_ANISOTROPIC, EmfToWmfBitsFlagsDefault);
byte[] _buffer = new byte[_bufferSize];
uint _convertedSize = GdipEmfToWmfBits(_hEmf, _bufferSize, _buffer, MM_ANISOTROPIC, EmfToWmfBitsFlagsDefault);
for (int i = 0; i < _buffer.Length; ++i)
{
_rtf.Append(String.Format("{0:X2}", _buffer[i]));
} return _rtf.ToString();
}
finally
{
if (_graphics != null)
_graphics.Dispose();
if (_metaFile != null)
_metaFile.Dispose();
if (_stream != null)
_stream.Close();
}
}
}
}
主要思想是首先把你要插入的文字转换成rtf格式的, 然后在把转换后的rtf格式追加到 exRichTextBox.Rtf 后面.
至于实现的方法嘛, 可以自己写代码, 但是我不大熟悉rtf格式, 所以就用了下面的方法:// 首先定义一个richTextBox
RichTextBox rtb = new RichTextBox();
// 把你想要的文字插入到rtb中;
rtb.AppendText("中国");
// 然后把rtb.Rtf 追加到 exRichTextBox.Rtf 后面
exRichTextBox1.AppendRtf(trb.Rtf); // AppendRtf 函数在 exRichTextBox中已经实现了,用起来很方便就这样子, 通过一个richTextBox作为中介, 把需要插入到exRichTextBox中的文字首先转换为 rtf 格式的, 然后再进行插入, 这样就不会出现乱码了..