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

在RichTextBox中重置RTF?分享

时间:2023-04-11 01:09:52 C#

在RichTextBox中重置RTF?我正在尝试“重置”我的RichTextBox(WinForms,而不是WPF)的格式。我用过richTextBox.Text=richTextBox.Text;之前,但这似乎让我大吃一惊。现在无论我将richTextBox.Text设置为richTextBox.Text,它都会保留一些rtf格式。我试过richTextBox.Rtf=richTextBox.Text;但是,抱怨格式不正确。必须有更好的方法来做到这一点。(当然,选择整个东西,然后重置背景颜色、正面颜色和字体是可行的,但这会导致闪烁,因为选择整个东西然后取消选择,而且速度较慢,需要更多代码。)有人有什么想法吗?编辑:我有这个工作:stringtempTxt=richTextBox.Text;richTextBox.Clear();richTextBox.Text=tempTxt;但一定有更好的方法,对吧?编辑2:明确地说,我想在保留文本的同时删除所有格式。看起来第一次编辑中的代码将被发布,除非其他人有更有效/更好的编码方式。编辑3:richTextBox.Text=richTextBox.Text.ToString();似乎不起作用,因为它仍然没有清除所有格式。我不喜欢上面第一次编辑中的方法的原因是,当文本框清除文本框然后重新键入文本时,它会使文本框“闪烁”。看起来它应该只是一个richTextBox.ResetFormatting()方法,或者某种访问相同功能的方法,因为Clear()方法显然(没有双关语)除了简单地清除所有文本之外还进行某种格式重置。总结一下:有没有一种方法(如果是的话,是什么)来重置RichTextBox中文本的格式而不清除上面示例中的文本(因为这会产生不希望的闪烁)?可悲的是,我已经尽力将它缩小到我需要的代码。它仍然很大,但它会起作用。.Net中的RichTextBoxapi非常有限,几乎可以执行Win32库中的任何操作。我围绕这个东西建立了一个完整的库,所以我可以切换粗体并确定是否在选择中实际设置了粗体。用法:RichTextBoxte=...;te.ClearAllFormatting(新字体(“MicrosoftSansSerif”,8.25f));大量的代码:staticclassRichTextExtensions{publicstaticvoidClearAllFormatting(thisRichTextBoxte,Fontfont){CHARFORMAT2fmt=newCHARFORMAT2();fmt.cbSize=Marshal.SizeOf(fmt);fmt.dwMask=CFM_ALL2;fmt.dwEffects=CFE_AUTOCOLOR|CFE_AUTOBACKCOLOR;fmt.szFaceName=font.FontFamily.Name;双倍大小=font.Size;size/=72;//逻辑dpi(每英寸像素)大小*=1440.0;//每英寸缇fmt.yHeight=(int)size;//165fmt.yOffset=0;fmt.crTextColor=0;fmt.bCharSet=1;//默认字符集;fmt.bPitchAndFamily=0;//DEFAULT_PITCH;fmt.wWeight=400;//FW_NORMAL;fmt.sSpacing=0;fmt.crBackColor=0;//fmt.lcid=???fmt.dwMask&=~CFM_LCID;//不知道如何得到这个...fmt.dwReserved=0;fmt.sStyle=0;fmt.wKerning=0;fmt.bUnderlineType=0;fmt.bAnimation=0;fmt.bRevAuthor=0;fmt.bReserved1=0;SendMessage(te.Handle,EM_SETCHARFORMAT,SCF_ALL,reffmt);私人常量UInt32WM_USER=0x0400;私有常量UInt32EM_GETCHARFORMAT=(WM_USER+58);私人常量UInt32EM_SETCHARFORMAT=(WM_USER+68);私有常量UInt32SCF_ALL=0x0004;私有常量UInt32SCF_SELECTION=0x0001;[DllImport("user32.dll",CharSet=CharSet.Auto,SetLastError=false)]staticexternIntPtrSendMessage(IntPtrhWnd,UInt32Msg,UInt32wParam,refCHARFORMAT2lParam);[StructLayout(LayoutKind.Sequential,Pack=4,CharSet=CharSet.Auto)]structCHARFORMAT2{publicintcbSize;公共uintdwMask;公共单位dwEffects;公共intyHeight;公共intyOffset;公共intcrTextColor;公共字节bCharSet;公共字节bPitchAndFamily;[MarshalAs(UnmanagedType.ByValTStr,SizeConst=32)]publicstringszFaceName;公共空头权重;公共短间距;公共intcrBackColor;公共intlcid;公共诠释dwReserved;公共短sStyle;公共短期警告;公共字节bUnderlineT类型;公共字节bAnimation;公共字节bRevAuthor;公共字节bReserved1;}#regionCFE_//CHARFORMAT效果constUInt32CFE_BOLD=0x0001;constUInt32CFE_ITALIC=0x0002;常量UInt32CFE_UNDERLINE=0x0004;常量UInt32CFE_STRIKEOUT=0x0008;常量UInt32CFE_PROTECTED=0x0010;常量UInt32CFE_LINK=0x0020;常量UInt32CFE_AUTOCOLOR=0x40000000;//注意:这对应于//CFM_COLOR,它控制它//为CHARFORMAT2定义的蒙版和效果--(*)表示//数据由RichEdit2.0/3.0存储,但不显示constUInt32CFE_SMALLCAPS=CFM_SMALLCAPS;constUInt32CFE_ALLCAPS=CFM_ALLCAPS;常量UInt32CFE_HIDDEN=CFM_HIDDEN;constUInt32CFE_OUTLINE=CFM_OUTLINE;constUInt32CFE_SHADOW=CFM_SHADOW;常量UInt32CFE_EMBOSS=CFM_EMBOSS;constUInt32CFE_IMPRINT=CFM_IMPRINT;constUInt32CFE_DISABLED=CFM_DISABLED;constUInt32CFE_REVISED=CFM_REVISED;//CFE_AUTOCOLOR和CFE_AUTOBACKCOLOR对应分别响应CFM_COLOR和//CFM_BACKCOLOR,它们控制它们constUInt32CFE_AUTOBACKCOLOR=CFM_BACKCOLOR;#endregion#regionCFM_//CHARFORMAT掩码constUInt32CFM_BOLD=0x00000001;constUInt32CFM_ITALIC=0x00000002;constUInt32CFM_UNDERLINE=0x00000004;constUInt32CFM_STRIKEOUT=0x00000008;constUInt32CFM_PROTECTED=0x00000010;常量UInt32CFM_LINK=0x00000020;//交换超链接扩展constUInt32CFM_SIZE=0x80000000;constUInt32CFM_COLOR=0x40000000;constUInt32CFM_FACE=0x20000000;constUInt32CFM_OFFSET=0x10000000;常量UInt32CFM_CHARSET=0x08000000;常量UInt32CFM_SMALLCAPS=0x0040;//(*)constUInt32CFM_ALLCAPS=0x0080;//由3.0显示constUInt32CFM_HIDDEN=0x0100;//被3.0隐藏constUInt32CFM_OUTLINE=0x0200;//(*)constUInt32CFM_SHADOW=0x0400;//(*)constUInt32CFM_EMBOSS=0x0800;//(*)constUInt32CFM_IMPRINT=0x1000;//(*)constUInt32CFM_DISABLED=0x2000;constUInt32CFM_REVISED=0x4000;constUInt32CFM_BACKCOLOR=0x04000000;constUInt32CFM_LCID=0x02000000;常量UInt32CFM_UNDERLINETYPE=0x00800000;//3.0显示的很多constUInt32CFM_WEIGHT=0x00400000;constUInt32CFM_SPACING=0x00200000;//3.0显示constUInt32CFM_KERNING=0x00100000;//(*)constUInt32CFM_STYLE=0x00080000;//(*)constUInt32CFM_ANIMATION=0x00040000;//(*)constUInt32CFM_REVAUTHOR=0x00008000;常量UInt32CFE_SUBSCRIPT=0x00010000;//上标和下标都是constUInt32CFE_SUPERSCRIPT=0x00020000;//互斥constUInt32CFM_SUBSCRIPT=(CFE_SUBSCRIPT|CFE_SUPERSCRIPT);constUInt32CFM_SUPERSCRIPT=CFM_SUBSCRIPT;//CHARFORMAT"ALL"masksconstUInt32CFM_EFFECTS=(CFM_BOLD|CFM_ITALIC|CFM_UNDERLINE|CFM_COLOR|CFM_STRIKEOUT|CFE_PROTECTED|CFM_LINK);constUInt32CFM_ALL=(CFM_EFFECTS|CFM_SIZE|CFM_FACE|CFM_OFFSET|CFM_CHARSET);常量用户界面nt32CFM_EFFECTS2=(CFM_EFFECTS|CFM_DISABLED|CFM_SMALLCAPS|CFM_ALLCAPS|CFM_HIDDEN|CFM_OUTLINE|CFM_SHADOW|CFM_EMBOSS|CFM_IMPRINT|CFM_DISABLED|CFM_REVISED|CFM_SUBSCRIPT|CFM_SUPERSCRIPT|CFM_BACKCOLOR);constUInt32CFM_ALL2=(CFM_ALL|CFM_EFFECTS2|CFM_BACKCOLOR|CFM_LCID|CFM_UNDERLINETYPE|CFM_WEIGHT|CFM_REVAUTHOR|CFM_SPACING|CFM_KERNING|CFM_STYLE|CFM_ANIMATION);#endregion}你问更多?我通过一个包含所有样式和字体更改的小型实用程序类来使用它的大部分内容,因此您可以在不更改字体名称等的情况下更改字体大小。类RichTextStyle{privatereadonlyControl_textEdit;私有只读CHARFORMAT2_charFormat;publicRichTextStyle(RichTextBoxte){_textEdit=te;_charFormat=newCHARFORMAT2();_charFormat.cbSize=Marshal.SizeOf(_charFormat);SendMessage(te.Handle,EM_GETCHARFORMAT,SCF_SELECTION,ref_charFormat);}privatevoidSetEffect(UInt32mask,UInt32effect,boolvalid){CHARFORMAT2fmt=newCHARFORMAT2();fmt.cbSize=Marshal.SizeOf(fmt);fmt.dwMask=掩码;fmt.dwEffects=有效?效果:0;SendMessage(_textEdit.Handle,EM_SETCHARFORMAT,SCF_SELECTION,reffmt);}privateboolGetEffect(UInt32mask,UInt32effect){return(0!=(_charFormat.dwMask&mask))&&(0!=(_charFormat.dwEffects&effect));}publicboolBold{get{returnGetEffect(CFM_BOLD,CFE_BOLD);}set{SetEffect(CFM_BOLD,CFE_BOLD,value);}}publicboolItalic{get{returnGetEffect(CFM_ITALIC,CFE_ITALIC);}set{SetEffect(CFM_ITALIC,CFE_ITALIC,价值);}}//...等等......等等......你明白了。关于什么richTextBox.Text=richTextBox.Text.ToString();我用过vart=richTextBox1.Text;富文本框1。文本=t;编辑::一定要插入一条评论,解释为什么你正在做你正在做的事情对于不知情的人来说,这看起来很荒谬。只需使用:richTextBox1.Clear();......应该做的伎俩。适合我。我看到有很多答案,但我认为有更简单、更容易的方法作为清除所有格式的扩展:在我的例子中,我需要清除格式并保留一个空的RichTextBox,所以我做了这个函数:privatevoidClearRichTextBox(){this.richTextBox1.ForeColor=Color.Empty;this.richTextBox1.BackColor=Color.Empty;this.richTextBox1.SelectAll();this.richTextBox1.SelectionColor=Color.Empty;this.richTextBox1.SelectionBackColor=Color.Empty;this.richTextBox1.SelectionFont=this.richTextBox1.Font;this.richTextBox1.Clear();那么简单的解决方案是:stringbackUp=this.richTextBox1.Text;ClearRichTextBox();this.richTextBox1.Text=backUp;或者只是删除this.richTextBox1.Clear();中的显式函数;线。(这也可能有效,但我不保证,因为我只在简单格式上测试过它。所以它可以,并且应该添加任何其他行以删除不同的格式。)如果你不清除文本,格式化数据后记得放到Storespreviousposition/selectionandrefresh状态。我发现的另一种方法(我已经切换到使用,因为它不会闪烁)是在应用任何格式之前获取初始rtf字符串:stringinitialRtf=richTextBox.Rtf;然后,当我想重置格式时,我可以这样做:richTextBox.Rtf=initialRtf;但是,这不是很完美,因为它要求文本保持不变等。好吧,至少它比问题中详述的方法好一点。“我不喜欢上面第一个编辑中的方法的原因是,当文本框清除文本框然后重新输入文本时,它会使文本框“闪烁”。您应该能够实现SuspendLayout()和ResumeLayout()methods.stringtempTxt=richTextBox.Text;rtbIncludes.SuspendLayout();richTextBox.Clear();richTextBox.Text=tempTxt;rtbIncludes.ResumeLayout();SuspendLayout()和ResumeLayout()将在操作时停止控件的绘制数据。如果时间不长,您将能够清除文本并将未格式化的文本分配回去,而不会在屏幕上显示闪烁。如果时间太长,控件将显示为黑色矩形,直到ResumeLayout()被调用。我在自己的程序中使用这段代码有一段时间了。它直接设置RichTextBox的RTF,因此它应该比通常的样式设置方式快得多。它需要一个字符串(主文本)并且还可以选择采用颜色数组、字体大小数组(int)和字体粗细数组(bool),每个数组代表每个字符的每种颜色、大小或字体粗细。字符串。或者,您可以简单地保留标题“尺寸”、“重量”和“数字”以斜体显示的默认值。publicstringtext2RTF(stringtext,Color[]color=null,bool[]bold=null,int[]size=null,stringfont="MicrosoftSansSerif",doubledefaultFontSize=16,booldefaultFontBold=false,booldefaultFontItalic=false,charalign='l'){StringBuilderrtf=newStringBuilder();rtf.Append(@"{rtf1ansiansicpg1252deff0deflang2057{fonttbl{f0fnilfcharset0");rtf.Append(字体);rtf.Append(@";}}{colortbl;");if(color!=null){rtf.Append("\red"+(color[0].R).ToString()+"\green"+(color[0].G).ToString()+"\蓝色"+(color[0].B).ToString()+";");for(inti=1;iRichTextBoxrtbTemp=newRichTextBox();rtbTemp.Text=rtb.Text;rtb.Rtf=rtbTemp.Rtf;希望能正常使用..以上是C#学习教程:ResetRTFinRichTextBox?全部内容分享,如果对大家有用,需要了解更多C#学习教程,希望大家关注---varTempString=richTextBox1.Text;richTextBox1.Rtf=string.Empty;richTextBox1.Text=TempString;如需转载请注明出处: