.NET adds a picture in the RichtextBox control (similar to QQ)

xiaoxiao2021-03-05  22

using System; using System.Collections.Specialized; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; namespace Khendys.Controls {#region public Enums // enum for possible RTF colors public enum RtfColor {Black, Maroon, Green, Olive, Navy, Purple, Teal, Gray, Silver, Red, Lime, Yellow, Blue, Fuchsia, Aqua, White} #endregion public class ExRichTextBox: System.Windows.Forms.RichTextBox {#region My Enums // Specifies the flags / options for the unmanaged call to the GDI method // Metafile.EmfToWmfBits () private enum EmfToWmfBitsFlags {// Use the default conversion EmfToWmfBitsFlagsDefault. = 0x00000000, // Embedded the source of the EMF metafiel within the resulting WMF // metafile EmfToWmfBitsFlagsEmbedEmf = 0x00000001, // Place a 22-byte header in the resulting WMF file. The header is // required for the metafile to be considered placeable Emftowmfbitsflagsinclud ePlaceable = 0x00000002, // Do not simulate clipping by using the XOR operator EmfToWmfBitsFlagsNoXORClip = 0x00000004};. #endregion #region My Structs // Definitions for colors in an RTF document private struct RtfColorDef {public const string Black = @ "/ red0 / green0 / blue0 "; public const string maroon = @" / red128 / green0 / blue0 "; public const string green = @" / red0 / green128 / blue0 "; public const string olive = @" / red128 / green128 / blue0 " Public const string navy = @ "/ red0 / green0 / blue128"; public const string purple = @ "/ red128 / green0 / blue128"; public const string teal = @ "

/ Red0 / green128 / blue128 "; public const string Gray = @" / red128 / green128 / blue128 "; public const string Silver = @" / red192 / green192 / blue192 "; public const string Red = @" / red255 / green0 / blue0 "; public const string Lime = @" / red0 / green255 / blue0 "; public const string Yellow = @" / red255 / green255 / blue0 "; public const string Blue = @" / red0 / green0 / blue255 "; public const string Fuchsia = @ "/ red255 / green0 / blue255"; public const string Aqua = @ "/ red0 / green255 / blue255"; public const string White = @ "/ red255 / green255 / blue255";} // Control words for RTF font families 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";} #endregion #region My Constants // Not used in this application Descriptions can be found with documentation // of Windows GDI function SetMapMode private const int MM_TEXT = 1;. Private const int MM_LOMETRIC = 2; private const int MM_HIMETRIC = 3; private const int MM_LOENGLISH = 4; private const int MM_HIENGLISH = 5; private const INT mm_twips = 6; // Ensures That The Metafile Maintains a 1: 1 Aspect Ratio Private const Int mm_isisotropic = 7;

// Allows the x-coordinates and y-coordinates of the metafile to be adjusted // independently private const int MM_ANISOTROPIC = 8; // Represents an unknown font family private const string FF_UNKNOWN = "UNKNOWN"; // The number of hundredths of millimeters (0.01 mm) in an inch // For more information, see GetImagePrefix () method private const int HMM_PER_INCH = 2540;. // The number of twips in an inch // For more information, see GetImagePrefix () method private const. int TWIPS_PER_INCH = 1440; #endregion #region My Privates // The default text color private RtfColor textColor; // The default text background color private RtfColor highlightColor; // Dictionary that maps color enums to RTF color codes private HybridDictionary rtfColor; // Dictionary that mapas Framework font families to RTF font families private HybridDictionary rtfFontFamily; // The horizontal resolution at which the control is being displayed private float xDpi; // The vertical resolution at whi Ch The Control Is Being Displayed Private Float Ydpi; #endregion #region Elements Required To Create An RTF Document / * RTF Header * -------- * * / RTF [N] - for Text To Be Considered To . be RTF, it must be enclosed in this tag * rtf1 is used because the RichTextBox conforms to RTF Specification * version 1. * / ansi -. The character set * / ansicpg [N] - Specifies that unicode characters might be embedded ansicpg1252. * is the default used by Windows * / deff [N] -.. The default font / deff0 means the default font is the first font * found * / deflang [N] -.. The default language / deflang1033 specifies US English *. * / Private const string RTF_HEADER = @ "

{/ RTF1 / ANSI / ANSICPG1252 / Deff0 / Deflang1033 "; / * RTF Document Area * ----------------- * * / viewkind [n] - The Type of View or Zoom .. level / viewkind4 specifies normal view * / uc [N] - The number of bytes corresponding to a Unicode character * / pard -. Resets to default paragraph properties * / cf [N] -. Foreground color / cf1 refers to the color AT Index 1 in * The color table * / f [n] - font number. / f0 Refers to the font at index 0 in the font * table. * / fs [n] - font size in half-points. * * / private const string RTF_DOCUMENT_PRE = @ "/ viewkind4 / uc1 / pard / cf1 / f0 / fs20"; private const string RTF_DOCUMENT_POST = @ "/ cf0 / fs17}"; private string RTF_IMAGE_POST = @ "}"; #endregion #region Accessors / / TODO: This can be ommitted along with RemoveBadCharacters // Overrides the default implementation of RTF This is done because the control // was originally developed to run in an instant messenger that uses the // Jabber XML-based protocol The framew.. ork would throw an exception when the // XML contained the null character, so I filtered out public new string Rtf {get {return RemoveBadChars (base.Rtf);} set {base.Rtf = value;}}. // The color of the text public RtfColor textColor {get {return textColor;} set {textColor = value;}} // The color of the highlight public RtfColor HiglightColor {get {return highlightColor;} set {highlightColor = value;}} #endregion #region Constructors ///

/// Initializes the text colors, creates dictionaries for RTF colors and /// font families, and stores the horizontal and vertical resolution of /// the RichTextBox's graphics context. /// <

/ Summary> public ExRichTextBox (): base () {// Initialize default text and background colors textColor = RtfColor.Black; highlightColor = RtfColor.White; // Initialize the dictionary mapping color codes to definitions rtfColor = new HybridDictionary (); rtfColor .Add (RtfColor.Aqua, RtfColorDef.Aqua); rtfColor.Add (RtfColor.Black, RtfColorDef.Black); rtfColor.Add (RtfColor.Blue, RtfColorDef.Blue); rtfColor.Add (RtfColor.Fuchsia, RtfColorDef.Fuchsia) ; rtfColor.Add (RtfColor.Gray, RtfColorDef.Gray); rtfColor.Add (RtfColor.Green, RtfColorDef.Green); rtfColor.Add (RtfColor.Lime, RtfColorDef.Lime); rtfColor.Add (RtfColor.Maroon, RtfColorDef. Maroon); rtfColor.Add (RtfColor.Navy, RtfColorDef.Navy); rtfColor.Add (RtfColor.Olive, RtfColorDef.Olive); rtfColor.Add (RtfColor.Purple, RtfColorDef.Purple); rtfColor.Add (RtfColor.Red, Rtfcolordef.Red; RTFColor.Add (RTFColorDef.silver); RTFColor.Add (RTFColorDeal); RTFColor.Add (RTFColor.Whit) e, RtfColorDef.White); rtfColor.Add (RtfColor.Yellow, RtfColorDef.Yellow); // Initialize the dictionary mapping default Framework font families to // RTF font families rtfFontFamily = new HybridDictionary (); rtfFontFamily.Add (FontFamily.GenericMonospace .Name, RtfFontFamilyDef.Modern); rtfFontFamily.Add (FontFamily.GenericSansSerif, RtfFontFamilyDef.Swiss); rtfFontFamily.Add (FontFamily.GenericSerif, RtfFontFamilyDef.Roman); rtfFontFamily.Add (FF_UNKNOWN, RtfFontFamilyDef.Unknown); // Get the horizontal And Vertical Resolutions at Which the Object IS // Being Displayed Using (Graphics _Graphics = this.creategraphics ()) {xdpi = _graphics.dpix; ydpi = _graphics.dpiy;}} /// <

Summary> /// Calls the default constructor death set the text color. /// /// public exrichtextbox (RTFCOLOR _TEXTCOLOR): this () {textcolor = _TextColor;} ///

/// calls the default constructor the sets te text and highlight colors. /// /// /// < param name = "_ highlightColor"> public ExRichTextBox (RtfColor _textColor, RtfColor _highlightColor): this () {textColor = _textColor; highlightColor = _highlightColor;} #endregion #region Append RTF or Text to RichTextBox Contents /// /// Assumes the string passed as a paramter is valid rtf text and attempts /// to append it as rtf to the content of the control. /// /// public void appendrtf (string _rtf) {//move calet to the end of the text this.select (this.textLect "; // Since successdrtf is null, this will append the string to the // end Of the eXi Sting RTF this.selectedRTF = _RTF;} /// /// Assumes That the string passed as a parameter is valid RTF text and /// attempts to insert it as rtf intempts to in the control. /// /// /// Note: The text is inserted where calet is at the time of the call, /// and if any text is success, there is replaced. /// /// public void insertrTRTF (String _RTF) {this.selectedRTF = _rtf;} ///

/// Appends the text using the current font, text, and highlight colors. /// /// public void AppendTextAsRtf (string _text) {AppendTextAsRtf (_text , this.font);} ///

/// appends the text using the given font, and current textid and highlight /// color text and highlight /// color text and highlight /// color text. /// /// /// public void appendtextASRTF (String _text, font _font) {appendtext, textcolor;} /// // / Appends the text sale the given font and text color, and the current ///////////// /// /// public void AppendTextAsRtf (string _text, Font _font, RtfColor _textColor) {AppendTextAsRtf (_text, _font, _textColor, highlightColor);} / // /// appends the text, and highlight colors. Simply ///moves the calet to the end Of the richtextbox's text and makes a call to /// insert. /// /// /// /// /// public void appendtextASRTF (String _text, font _font, rtfcolor _textcolor, RTFColor _BackColor) {//// Move carret to the end of the text this.select (this.textLength, 0); InsertTextAsrtf (_text, _font, _textcolor, _backcolor);

} #Endregion #Region Insert Plain Text ///

/// Inserts The text Using The Current Font, Text, And Highlight Colors. /// /// < / param> public void InsertTextAsRtf (string _text) {InsertTextAsRtf (_text, this.Font);} /// /// Inserts the text using the given font, and current text and highlight /// colors //. / /// /// public void inserttextASRTF (String _text, font _font) {INSERTTEXTASRTF (_text, _font, textcolor;} /// /// inserts the text using the given font and text color, and the current /// highlight color. /// /// /// /// public void inserttextASRTF (String _text, font _font, rtfcolor _textcolor) {INSERTTEXTASRTF (_text, _font, _textcolor, highlightcolor);} /// /// inserts the text Using the Given Font, Text, And highlight colors. The /// text is wrapped in RTF codes so that the specified formatting is kept. /// You can only assign valid RTF to the RichTextBox.Rtf property, else /// an exception is thrown. The RTF string should FOLLOW this format ... /// /// {/ RTF1 / ANSI / ANSICPG1252 / Deff0 / Deflang1033 {/ fonttbl {[fonts]} {/ colorTBL; [Colors]}} /// / viewkind4 / uc1 / pard / CF1 / F0 / FS20 [Document Area]} /// /// ///

/// NOTE: The text is inserted where of the call _Text "> /// /// /// public void InsertTextAsRtf (string _text, font _font, RtfColor _textColor, RtfColor _backColor) {StringBuilder _rtf = new StringBuilder (); // Append the RTF header _rtf.Append (RTF_HEADER); // Create the font table from the font passed in and append it to the // RTF string _rtf.Append (GetFontTable (_font)); // Create the color table from the colors passed in and append it to the // RTF string _rtf.Append (GetColorTable (_textColor, _backColor) ); // Create the Document Area from the text to be added as rtf and append // it to the RTF string. _Rtf.append (_text, _font)); this.selectedRTF = _rtf.toString ();} / //

/// Creates The Document Area of ​​the RTF Being inserted. The document area /// (in this case) consists of the text being added as rtf and all the font object passed in. this shop Have the /// form ... // / /// / viewkind4 / uc1 / pard / cf1 / f0 / fs20 [document area]} /// /// /// /// < Param name = "_ font"> /// //// private string getDocumentarea (string _text, font _font) {stringbuilder _doc = new StringBuilder ();

// Append the standard RTF document area control string _doc.Append (RTF_DOCUMENT_PRE);. // Set the highlight color (the color behind the text) to the // third color in the color table See GetColorTable for more details _doc.Append. (@ "/ highlight2"); // if the font is bold, attach corresponding tagiff (_font.bold) _doc.Append (@ "/ b"); // if the font is italic, attach corresponding tagiff (_font) .Italic) _doc.append (@ "/ i"); // if the font is strike f (_font.strikeout) _doc.append (@ "/ strike"); // if the font is underlined, Attach corresponding tag if (_font.underline) _doc.Append (@ "/ ul"); // set the font to the first font in the font table. // See getfonttable for more details. _doc.Append (@ "/ f0 "); // set the size of the font. In RTF, FONT SIZE IS Measured In // Half-Points, So The Font Size Is Twice The value Obtained from // font.sizeinpoints_doc.append (@" / fs " ); _Doc.Append ((int) math.round ((2 * _font.sizei) Npoints)))); // apppend a space before starting actual text (for clarity) _doc.Append (@ "); // append activity text, however, replace newlines with rtf / par. // Any Other Special Text Should Be Handled Here (EG) Tabs, etc._doc.append (_text.replace ("/ n", @ "/ par")); // rtf isn't strict when comes To Closing Control Words, But what the HECK ... // Remove the highlight _doc.append (@ "/ highlight0"); // if font is bold, close tagiff _doc.Append (@ "/ b0"); // if font Is italic, close tagiff _doc.append (@ "/ i0");

// if font is strikeout, close tag if (_font.strikeout) _doc.Append (@ "/ strike0"); // if font is underlined, cloes tagiff (_font.underline) _doc.append (@ "/ ulnone" ); // repert back to default font and size _doc.append (@ "/ f0"); _doc.Append (@ "/ fs20"); // close the document isa control string _doc.Append (RTF_Document_post); return_doc .ToString ();} #endregion #region Insert Image ///

/// Inserts an image into the RichTextBox The image is wrapped in a Windows /// Format Metafile, because although Microsoft discourages the use of a WMF. , //////////////////////////////////////////////> / /// The RTF Specification V1.6 Says That You Should Be Aable To INSERT Bitmaps, /// .jpegs, .gifs, .pngs, And Enhanced Metafiles (.emf) Directly Into An RTF /// Document Without The WMF Wrapper. this Works Fine with MS Word, /// Owever, WHEN You Don't Wrap Images in A WMF, WordPad and /// RichtextBoxs Simply Ignore Them. Both Use the Riched20.dll or Msfted.dll. /// /// /// NOTE: The Image Is Inserted WHEREVER THE CARET IS at The Time of TEXT IS SELECTED, THAT TEXT IS Replaced. /// /// public void InsertImage (Image _image) {StringBuilder _rtf = new StringBuilder (); // Append the RTF header _rtf.Append (RTF_HEADER); // Create the font table using the RichTextBox's current font and append // it to The RTF string _rtf.Append (getfonttable (this.font));

// Create the image control string and append it to the RTF string _rtf.Append (GetImagePrefix (_image)); // Create the Windows Metafile and append its bytes in HEX format _rtf.Append (GetRtfImage (_image)); // Close the RTF image control string _rtf.Append (RTF_IMAGE_POST); this.SelectedRtf = _rtf.ToString ();} ///

/// Creates the RTF control string that describes the image being inserted /// This description (. in this case) specifies that the image is an /// MM_ANISOTROPIC metafile, meaning that both X and Y axes can be scaled /// independently. The control string also gives the images current dimensions, /// and its target dimensions, so IF you want to control the size of the................................ .. [A] / Pich [B] / Picwgoal [C] / Pichgoal [D] /// /// Where ... // /// A = CURRENT WIDTH of the Metafile in Hundredths of Millimeters (0.01mm) / // = iMag e width in inches * Number of (0.01mm) per inch /// = (Image Width in Pixels / Graphics Context's Horizontal Resolution) * 2540 /// = (Image Width in Pixels / Graphics.dpix) * 2540 /// / / // B = current height of the metafile in hundredths of millimeters (0.01mm) /// = Image height in Inches * Number of (0.01mm) per inch /// = (Image height in Pixels / Graphics Context's Vertical Resolution) * 2540 /// = (image height in pixels / graphics.dpix) * 2540 /// /// C = target width of the metafile in twips /// = image width in inches * Number of twips per incaps /// = (Image Width In Pixels / Graphics Context's Horizontal Resolution) * 1440 / // =

(Image width in pixels / graphics.dpix) * 1440 /// // D = target height of the metafile in twips /// = image height in inches * Number of twips per in ,// = (Image Height in Pixels) / Graphics context's horizontal resolution * 1440 /// = (image height in pixels / graphics.dpix) * 1440 /// /// /// The graphics context's resolution is simply the Current Resolution At Which /// Windows Is Being Displayed. Normally It's 96 DPI, But INSTEAD OF Assuming /////// According to Ken Howe At Pbdr.com, "Twips Are Screen- Independent Units /// USED TO ENSURE THATS IN / / / YOUR Screen Application Arement Are The Same on All Display Systems. "/// // Units Used /// ------- --- /// 1 twip = 1/20 Point /// 1 point = 1/72 inch /// 1 TWIP = 1/1440 inch ///// 1 inch = 2.54 cm /// 1 inch = 25.4 mm /// 1 inch = 2540 (0.01) mm /// /// /// private string GetImagePrefix (Image _image) {StringBuilder _rtf = new StringBuilder (); // Calculate the current width of the image in (0.01) mm int picw = (int) Math.Round ((_ image.Width / xdpi) * HMM_PER_INCH); // Calculate The Current Height of the Image IN (0.01) MM INT PICH = (int) Math.Round ((_ image.Height / YDPI) * HMM_PER_INCH); // Calculate The Target Width of To Image in twips int picwgoal = (int) Math.Round ((_ image.width / xdpi) * twips_per_inch); // Calculate The Target Height of the Image in twips int pichgoal =

(int) Math.Round ((_ image.height / ydpi) * twips_per_inch); // append value to RTF string _rtf.append (@ "{/ pic / wmetafile8); _rtf.append (@" / picw "); _rtf.append (picw); _rtf.append (@ "/ pich"); _rtf.append (@ "/ picwgoal"); _rtf.append (picwgoal); _rtf.Append (@ "/ Pichgoal "); _rtf.append (pichgoal); _rtf.append (" "); return _rtf.tostring ();} ///

/// use the Emftowmfbits Function in The GDI Specification To Convert A /// Enhanced Metafile to A Windows Metafile /// /// /// a Handle to the enhanced metafile to be converted /// /// /// the size of the buffer buy to store the windows metafile bits returned /// /// /// The mapping mode of the image. This control uses mm_anisotropic. /// /// /// Flags used to specify the format of the Windows Metafile returned /// [DllImportAttribute (" gdiplus.dll ")] private static extern uint GdipEmfToWmfBits (IntPtr _hEmf, uint _bufferSize, byte [] _buffer , int _mappingmode, esftowmfbitsflags _flags); ///

/// Wraps the image in an Enhanced Metafile by drawing the image onto the /// graphics context, then converts the Enhanced Metafile to a Windows /// Metafile, and finally appends the bits of the Windows Metafile in HEX /// to A string and returns the string. /// /// /// /// a string containing the bits of a windows metafile in hEX / // private string GetRtfImage (Image _image) {StringBuilder _rtf = null; // Used to store the enhanced metafile MemoryStream _stream = null; // Used to create the metafile and draw the image Graphics _graphics = null; // The enhanced metafile Metafile _metaFile = null; // Handle to the device context used to create the metafile IntPtr _hdc; try {_rtf = new StringBuilder (); _stream = new MemoryStream (); // Get a graphics context from the RichTextBox using ( _Graphics = this.creategraphics ()) {// get the device context from the graphics context_HDC = _graphics.GetHdc (); // Create a new Enhanced Metafile from the device context _metaFile = new Metafile (_stream, _hdc); // Release the device context _graphics.ReleaseHdc (_hdc);} // Get a graphics context from the Enhanced Metafile using (_graphics = Graphics.FromImage (_metaFile)) {// Draw the image on the Enhanced Metafile _graphics.DrawImage (_image, new Rectangle (0, 0, _image.Width, _image.Height));} // Get the Handle of the enhanced metafile INTPTR _HEMF = _metafile.gethenhmetafile ();

// A call to EmfToWmfBits with a null buffer return the size of the // buffer need to store the WMF bits. Use this to get the buffer // size. Uint _bufferSize = GdipEmfToWmfBits (_hEmf, 0, null, MM_ANISOTROPIC, EmfToWmfBitsFlags. EmfToWmfBitsFlagsDefault); // Create an array to hold the bits byte [] _buffer = new byte [_bufferSize]; // A call to EmfToWmfBits with a valid buffer copies the bits into the // buffer an returns the number of bits in the WMF . uint _convertedSize = GdipEmfToWmfBits (_hEmf, _bufferSize, _buffer, MM_ANISOTROPIC, EmfToWmfBitsFlags.EmfToWmfBitsFlagsDefault); // Append the bits to the RTF string 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 ();}} #endregion #region RTF helpers /// /// Creates A Font Table from A Font Object. When An Insert or Append /// Operation IS Performed A Font IS Either Specified or the Default Font /// IS Used. in Any Case, ON Any Insert or append, Only One Font IS Used, // Thus The Font Table Will Always Contain A Single Font. The font Table ////// {/ fonttbl {/ f0 / [family] / Fcharset0 [font_name];} /// /// /// private string getFontTable (font _font) {stringbuilder _fonttable = new Stringbuilder (); // append table control string _fonttable.append (@ "{/ fonttbl {/ f0");

_fontTable.Append (@ "/");. // If the font's family corresponds to an RTF family, append the // RTF family name, else, append the RTF for unknown font family if (rtfFontFamily.Contains (_font.FontFamily. name)) _fontTable.Append (rtfFontFamily [_font.FontFamily.Name]); else _fontTable.Append (rtfFontFamily [FF_UNKNOWN]);. // / fcharset specifies the character set of a font in the font table // 0 is for ANSI _Fonttable.Append (@ "/ fcharset0"); // append the name of the font _fonttable.append (_font.name); // close control string _fonttable.append (@ ";}}"); return _fonttable.tostring ();} ///

/// Creates a font table from the RtfColor structure When an Insert or Append /// operation is performed, _textColor and _backColor are either specified /// or the default is used In.. Any Case, On Any INSERT OR APPEND, ONLY Three /// Color of the RichtextBox (Signified by A /// SEMICOLON (;) WITHOUT A Definition, is always the First Color (Index 0) In /// The Color Table. The Second Color IS Always The Text Color, And The Third //////////////////////////////////// Should Have The Form ... /// /// {/ colorTBL; [TEXT_COLOR]; [highlight_color];} /// // /// // / /// private string GetColorTable (RtfColor _textColor, RtfColor _backColor) {StringBuilder _colorTable = new StringBuilder (); // Append color table control string and Default font (;) _COLORTABLE.APpend (@ "{/ colortbl;");

转载请注明原文地址:https://www.9cbs.com/read-39320.html

New Post(0)