在RichTextBox控件加入圖片 |
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. EmfToWmfBitsFlagsIncludePlaceable = 0x00000002, // Don‘t 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_ISOTROPIC = 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 which 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 be |