分享

在RichTextBox控件加入图片

 kenwang 2007-03-20
在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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多