当前位置: 首页 > 编程语言 > C#

在富文本框中的光标位置插入图像分享

时间:2023-04-10 18:29:07 C#

在富文本框中的光标位置插入图像我知道有各种各样的问题,但我问是因为我无法理解所有答案。我有一个RichTextBox,我希望用户能够在当前光标位置插入图像。我尝试使用剪贴板设置图像,然后将其粘贴到富文本框中。这行得通,但有人告诉我这是不好的做法,因为它会在不通知用户的情况下更改剪贴板中的数据。这就是我尝试过的privateboolCheckIfImage(stringfilename){if(filename.EndsWith(".jpeg")){returntrue;}elseif(filename.EndsWith(".jpg")){返回真;}elseif(filename.EndsWith(".png")){返回真;}elseif(filename.EndsWith(".ico")){返回真;}elseif(filename.EndsWith(".gif")){返回真;}elseif(filename.EndsWith(".bmp")){返回真;}elseif(filename.EndsWith(".emp")){返回真;}elseif(filename.EndsWith(".wmf")){返回真;}elseif(filename.EndsWith(".tiff")){返回真;}else{返回错误;}}privatevoidopenFileDialog2_FileOk(objectsender,CancelEventArgse){if(CheckIfImage(openFileDialog2.FileName.ToLower())==true){Imageimg=Image.FromFile(openFileDialog2.FileName);字符串setData=(String)Clipboard.GetData(DataFormats.Rtf);剪贴板.SetImage(img);rtbType.Paste();Clipboard.SetData(DataFormats.Rtf,setData);}else{MessageBox.Show("选择的图像文件无效");}}请问还有没有更好的办法?我已经为您准备了一个功能齐全的示例,供您使用此处发布的解决方案,利用RTF功能正如HansPassant所写:该解决方案很棘手,并且有一些有效的替代方案可以实现它。顺便说一句话,这是你的代码(重写):privateboolCheckIfImage(stringfilename){varvalids=new[]{".jpeg",".jpg",".png",".ico",".gif",".bmp",".emp",".wmf",".tiff"};返回valids.Contains(System.IO.Path.GetExtension(文件名));}privatevoidopenFileDialog2_FileOk(objectsender,CancelEventArgse){if(CheckIfImage(openFileDialog2.FileName.ToLower())==true)embedImage(Image.FromFile(openFileDialog2.FileName));elseMessageBox.Show("选择的图像文件无效");}这是embedImage方法:privatevoidembedImage(Imageimg){varrtf=newStringBuilder();//附加RTF头rtf.Append(@"{rtf1ansiansicpg1252deff0deflang1033");//使用RichTextBox的当前字体创建字体表并将其附加到//RTF字符串rtf.Append(GetFontTable(this.Font));//创建图像控制字符串并将其附加到RTF字符串rtf.Append(GetImagePrefix(img));//创建Windows图元文件并以十六进制格式附加其字节rtf.Append(getRtfImage(img));//关闭RTF图像控制字符串rtf.Append(@"}");richTextBox1.SelectedRtf=rtf.ToString();}这里这里所有必要:私人枚举privatestructRtfFontFamilyDef{publicconststringUnknown=@"fnil";publicconststringRoman=@"froman";publicconststringSwiss=@"fswiss";publicconststringModern=@"fmodern";publicconststringScript=@"fscript";publicconststringDecor=@"fdecor";publicconststringTechnical=@"ftech";publicconststringBiDirect=@"fbidi";}[DllImport("gdiplus.dll")]privatestaticexternuintGdipEmfToWmfBits(IntPtr_hEmf,uint_bufferSize,byte[]_buffer,int_mappingMode,EmfToWmfBitsFlags_flags);privatestringGetFontTable(Fontfont){varfontTable=newStringBuilder();//追加表控件字符串fontTable.Append(@"{fonttbl{f0");fontTable.Append(@"");varrtfFontFamily=newHybridDictionary();rtfFontFamily.Add(FontFamily.GenericMonospace.Name,RtfFontFamilyDef.Modern);rtfFontFamily.Add(FontFamily.GenericSansSerif,RtfFontFamilyDef.Swiss);rtfFontFamily.Add(FontFamily.GenericSerif,RtfFontFamilyDef.Roman);rtfFontFamily.Add("未知",RtfFontFamilyDef.Unknown);//如果字体系列对应于RTF系列,则附加//RTF系列名称,否则,附加未知字体系列的RTF。fontTable.Append(rtfFontFamily.Contains(font.FontFamily.Name)?rtfFontFamily[font.FontFamily.Name]:rtfFontFamily["UNKNOWN"]);//fcharset指定字体表中字体的字符集。//0用于ANSI。fontTable.Append(@"fcharset0");//追加字体的名称fontTable.Append(font.Name);//关闭控制字符串fontTable.Append(@";}}");返回fontTable.ToString();}privatestringGetImagePrefix(Image_image){floatxDpi,yDpi;变种RTF=新的StringBuilder();使用(Graphicsgraphics=CreateGraphics()){xDpi=graphics.DpiX;yDpi=图形.DpiY;}//计算图像的当前宽度(0.01)mmvarpicw=(int)Math.Round((_image.Width/xDpi)*2540);//以(0.01)mm为单位计算图像的当前高度varpich=(int)Math.Round((_image.Height/yDpi)*2540);//以缇为单位计算图像的目标宽度varpicwgoal=(int)Math.Round((_image.Width/xDpi)*1440);//以缇为单位计算图像的目标高度varpichgoal=(int)Math.Round((_image.Height/yDpi)*1440);//将值附加到RTF字符串rtf.Append(@"{pictwmetafile8");rtf.Append(@"picw");rtf.Append(picw);rtf.Append(@"pich");rtf.Append(图片);rtf.Append(@"picwgoal");rtf.Append(picwgoal);rtf.Append(@"pichgoal");rtf.Append(pichgoal);rtf.Append("");返回rtf.ToString();}privatestringgetRtfImage(Imageimage){//用于存储增强元文件MemoryStreamstream=null;//用于创建图元文件并绘制图像Graphicsgraphics=null;//增强元文件MetafilemetaFile=null;尝试{varrtf=newStringBuilder();流=新的内存流();//使用(graphics=CreateGraphics())从RichTextBox获取图形上下文{//从图形上下文获取设备上下文IntPtrhdc=graphics.GetHdc();//从设备上下文创建一个新的增强型图元文件metaFile=newMetafile(stream,hdc);//释放设备上下文graphics.ReleaseHdc(hdc);}//使用(graphics=Graphics.FromImage(metaFile))从增强型图元文件中获取图形上下文{//在增强型图元文件上绘制图像graphics.DrawImage(image,newRectangle(0,0,image.Width,image。高度));}//获取增强型图元文件的句柄IntPtrhEmf=metaFile.GetHenhmetafile();//使用空缓冲区调用EmfToWmfBits会返回存储WMF位所需的//缓冲区大小。使用它来获取缓冲区//size.uintbufferSize=GdipEmfToWmfBits(hEmf,0,null,8,EmfToWmfBitsFlags.EmfToWmfBitsFlagsDefault);//创建一个数组来保存位varbuffer=newbyte[bufferSize];//使用有效缓冲区调用EmfToWmfBits会将位复制到//缓冲区中并返回WMF中的位数。uint_convertedSize=GdipEmfToWmfBits(hEmf,bufferSize,buffer,8,EmfToWmfBitsFlags.EmfToWmfBitsFlagsDefault);//将位附加到每个(字节t缓冲区)的RTF字符串{rtf.Append(String.Format("{0:X2}",t));}返回rtf.ToString();}finally{if(graphics!=null)graphics.Dispose();如果(metaFile!=null)metaFile.Dispose();如果(流!=null)stream.Close();我建议你把它包装到你自己的UserControl中RichTextBox对OLE(对象链接和嵌入)的支持是一个历史性的意外。OLE是一种过时的技术,多年来基本上已被弃用。它的消亡可以肯定.NET根本不支持它。从本机RichEdit控件中删除OLE支持本来是明智的,但它会破坏太多古老的应用程序。.NETRichTextBox类本身只是本机组件的一个小包装器,不会增加或减少该组件的功能。因此,没有任何简单的方法可以在.NET中使用OLEapi。通过剪贴板复制/粘贴仍然有效的事实只是一个意外,.NET没有参与其中,所以没有什么可以阻止它。所以是的,它仍然可以通过剪贴板工作,并且是使用该功能的唯一正确方法。当然,还有更好的替代方案,如WebBrowser或Wordinterop,它们提供了更大的灵活性。PDF包装器很受欢迎。WPF很好地支持复合文档。等。您可以尝试使用WPFRichTextBox并将其托管在WinForms窗口中。您将能够使用WPF非常轻松地在光标位置插入图像。以上就是C#学习教程:在富文本框中光标位置插入图片分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: