现在正在做个一局域网的聊天程序,需要在编辑框中插入图片,就向QQ的那样,上网找了很久也得不到很好的解决办法。主要方法应该有两种:
    1:一种是利用粘贴板,个人觉得很不好,因为如果粘贴板里有东西的话就会被冲掉了。
    2:用richTextBox的 rtf 格式。就是把图片弄成rtf流再弄到richTextBox里去。但是,这种方法对于我来说比较难,我也从网上找了一个ExRichTextBox的第三方控件,用是可以用,但是如果插入一个比较大的图片的话,就好象没响应了一样,效率很不好。所以,希望大家出个主意。其实我个人更倾向于用rtf格式来做,但是不知道要怎么做(虽然也下载了很多相关的代码),而且效率好象也不好。各位有什么好的方法?如果有什么比较好用的第三方控件,大家也来说说,刚装了一个Developer Express,里面有么?时间紧迫,时间紧迫啊~~~~~~~!!

解决方案 »

  1.   

    Clipoard无疑是可以解决的如果有第一种情况出现 那就在每次使用到clipboard后clear就OK了。
      

  2.   

    复制粘贴肯定不好的 因为假设用户现在粘贴了一些文字 然后插入图片的话 那不是把他粘贴的那些东西给搞没了 
    我原来也是用那个EXRichTextBox 也出现这种问题 有点无奈
      

  3.   

    rtf 格式,原本就不是一个很完善的东西——我个人的理解;
    我自己也做了一个扩展的Richtextbox我的控件插入表情,走的就不是粘贴板,可是表情图片也小啊;
    至于自定义图片,我也是走剪切板,呵呵,保证速度~~
    你要知道,一个大的图片解析成为rtf格式会好用多大的空间??
    连QQ解决也是降低图片大小和清晰度,然后再插入的;
    如果你想转为rtf格式,建议还是对图片进行处理然后再考虑其他吧!!
    参考我的下载空间的控件;││博客空间:http://blog.csdn.net/lovingkiss
    ││资源下载:http://download.csdn.net/user/lovingkiss
    ││Email:loving-kiss@163.com [MSN也是这个]
    ││联系方式:Q66840199 项目、聊天、咨询、探讨、统统收费,呵呵......
    ╚---------------------------------------------------------------------------------------------------------ō*︻$▅▆▇◤ 
      

  4.   

    说错了:
    QQ解决是截图降低图片清晰度,BMP的似乎都降低了清晰度;
    插入的时候不是——它里面内嵌了自己的OLE图像控件,可以解析Gif文件的;
      

  5.   

    建议用第三方控件来解决
    或者在输入区域插入一个WORD的控件
      

  6.   

    算了,用粘贴板就用粘贴板...时间很紧,也要求不了那么多了..对了,那个ExRichTextBox,好象不怎么好用啊...exRichTextBox1.AppendTextAsRtf("中国"); // 这句的话,会出现乱码...exRichTextBox1.AppendTextAsRtf(exRichTextBox2.Rtf); // 但是这句却不会出现乱码大家说说怎么解决?之前好象在哪里看到一篇文章是解决这个问题的,说是什么这个控件的作者没把中文字体弄进去(作者是老外,可能忽略了),还是怎么搞的,忘记了,大家说说怎么解决?最好能给我一个已经解决好了字体问题的ExRichTextBox控件,呵呵..时间比较紧,不想再弄了,分不够的话大家说下,我再加...
      

  7.   

    如果不考虑图片插入问题的话, ExRichTextBox这个控件还是不错的,就是字体这点比较烦人..所以我还是倾向于用这个控件, 就等着大家的解决方案了,呵呵~~
      

  8.   

    "中国"压根就不是rtf的格式,当然出现乱码了。。
      

  9.   

    参考如下代码:
    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();
                }
            }
        }
    }
      

  10.   

    谢谢楼上的,不过已经找到解决办法了.加载图片的话还是用ClipBoard, 如果大图片要转成rtf的话,速度可能太慢,受不了.而在exRichTextBox中插入了的中文变成乱码的问题,也解决了, 方法如下:
    主要思想是首先把你要插入的文字转换成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 格式的, 然后再进行插入, 这样就不会出现乱码了..
      

  11.   

    确实ExRichTextBox这个东东有好也有坏,这个帖子挺不错的,我正在搞类似QQ的软件,也遇到这些问题,很恼火的.还有一个问题就是:ExRichTextBox插入gif文件有点恼火要让文本动起来
      

  12.   

    实验了这个方法...貌似gif图像不同动了哦..