zoukankan      html  css  js  c++  java
  • 闲来没事写个记事本玩玩!!!

          这两天工作压力大,还好今天见着太阳了,这会儿没事写了个记事本,功能单一,适合练手,可能对新手会有所帮助,贴上来看看吧,

    说到实现 记事本,我们应该选择什么样的控件呢,TextBox,还是RichTextBox ,TextBox的功能单一,对文字和颜色的支持基本上能用,但是说到图片就不行了

    RichTextBox 在这一点上比它做的好,不过在版面的格式 上还有点不好,TextBox就不用说了基本上无法保存

         如果是一般的功能使用的话,用RichTextBox足以,但是如果要实现更复杂一点功能 的话就不够用了,在这里我提一点点的思路,改写一下RichTextBox吧,这个方法有很多,网上也有不少,我是这样来实现的先到网上找一个写的差不多的,因为是写着玩,没有必要自己下功能写一个完整的,找个格式 和功能 差不多的,改一下就OK,这是我的源码,大家分享一下

    ZYBTextBox.cs

     阅读全部代码:http://www.cckan.net/forum.php?mod=viewthread&tid=197

    代码
    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;
    using System.Drawing.Printing;

    namespace mynotepad
    {

        
    #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, Orange
        }

        
    #endregion

        
    /// <summary>
        
    /// This class adds the following functionality to RichTextBox:
        
    /// 
        
    /// 1.    Allows plain text to be inserted or appended programmatically to RTF
        
    ///        content.
        
    /// 2.    Allows the font, text color, and highlight color of plain text to be
        
    ///        specified when inserting or appending text as RTF.
        
    ///    3.    Allows images to be inserted programmatically, or with interaction from
        
    ///        the user.
        
    /// </summary>
        
    /// <remarks>
        
    /// Many solutions to the problem of programmatically inserting images
        
    /// into a RichTextBox use the clipboard or hard code the RTF for
        
    /// the image in the program.  This class is an attempt to make the process of
        
    /// inserting images at runtime more flexible without the overhead of maintaining
        
    /// the clipboard or the use of huge, cumbersome strings.
        
    /// 
        
    /// RTF Specification v1.6 was used and is referred to many times in this document.
        
    /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnrtfspec/html/rtfspec.asp
        
    /// 
        
    /// For information about the RichEdit (Unmanaged RichTextBox) ...
        
    /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/richedit/richeditcontrols/aboutricheditcontrols.asp
        
    /// </remarks>
        public class ZYBRichTextBox : 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 = @"\red240\green26\blue2";
                
    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";
                
    public const string Orange = @"\red223\green201\blue2";
            }

            
    // 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 print Structs
            
    //Convert the unit used by the .NET framework (1/100 inch) 
            
    //and the unit used by Win32 API calls (twips 1/1440 inch)
            private const double anInch = 14.4;

            [StructLayout(LayoutKind.Sequential)]
            
    private struct RECT
            {
                
    public int Left;
                
    public int Top;
                
    public int Right;
                
    public int Bottom;
            }

            [StructLayout(LayoutKind.Sequential)]
            
    private struct CHARRANGE
            {
                
    public int cpMin;         //First character of range (0 for start of doc)
                public int cpMax;           //Last character of range (-1 for end of doc)
            }

            [StructLayout(LayoutKind.Sequential)]
            
    private struct FORMATRANGE
            {
                
    public IntPtr hdc;             //Actual DC to draw on
                public IntPtr hdcTarget;       //Target DC for determining text formatting
                public RECT rc;                //Region of the DC to draw to (in twips)
                public RECT rcPage;            //Region of the whole DC (page size) (in twips)
                public CHARRANGE chrg;         //Range of text to draw (see earlier declaration)
            }

            
    private const int WM_USER = 0x0400;
            
    private const int EM_FORMATRANGE = WM_USER + 57;

            [DllImport(
    "USER32.dll")]
            
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 


            
    #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 because the control
            
    // was originally developed to run in an instant messenger that uses the
            
    // Jabber XML-based protocol.  The framework 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

            
    /// <summary>
            
    /// 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 ZYBRichTextBox() : 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(RtfColor.Silver, RtfColorDef.Silver);
                rtfColor.Add(RtfColor.Teal, RtfColorDef.Teal);
                rtfColor.Add(RtfColor.White, RtfColorDef.White);
                rtfColor.Add(RtfColor.Yellow, RtfColorDef.Yellow);
                rtfColor.Add(RtfColor.Orange, RtfColorDef.Orange);

                
    // 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 then sets the text color.
            
    /// </summary>
            
    /// <param name="_textColor"></param>
            public ZYBRichTextBox(RtfColor _textColor)
                : 
    this()
            {
                textColor 
    = _textColor;
            }

            
    /// <summary>
            
    /// Calls the default constructor then sets te text and highlight colors.
            
    /// </summary>
            
    /// <param name="_textColor"></param>
            
    /// <param name="_highlightColor"></param>
            public ZYBRichTextBox(RtfColor _textColor, RtfColor _highlightColor)
                : 
    this()
            {
                textColor 
    = _textColor;
                highlightColor 
    = _highlightColor;
            }

            
    #endregion


            
    #region Append RTF or Text to RichTextBox Contents

            
    /// <summary>
            
    /// Assumes the string passed as a paramter is valid RTF text and attempts
            
    /// to append it as RTF to the content of the control.
            
    /// </summary>
            
    /// <param name="_rtf"></param>
            public void AppendRtf(string _rtf)
            {

                
    // Move caret to the end of the text
                this.Select(this.TextLength, 0);

                
    // Since SelectedRtf is null, this will append the string to the
                
    // end of the existing RTF
                this.SelectedRtf = _rtf;
            }

            
    /// <summary>
            
    /// Assumes that the string passed as a parameter is valid RTF text and
            
    /// attempts to insert it as RTF into the content of the control.
            
    /// </summary>
            
    /// <remarks>
            
    /// NOTE: The text is inserted wherever the caret is at the time of the call,
            
    /// and if any text is selected, that text is replaced.
            
    /// </remarks>
            
    /// <param name="_rtf"></param>
            public void InsertRtf(string _rtf)
            {
                
    this.SelectedRtf = _rtf;
            }

            
    /// <summary>
            
    /// Appends the text using the current font, text, and highlight colors.
            
    /// </summary>
            
    /// <param name="_text"></param>
            public void AppendTextAsRtf(string _text)
            {
                AppendTextAsRtf(_text, 
    this.Font);
            }


            
    /// <summary>
            
    /// Appends the text using the given font, and current text and highlight
            
    /// colors.
            
    /// </summary>
            
    /// <param name="_text"></param>
            
    /// <param name="_font"></param>
            public void AppendTextAsRtf(string _text, Font _font)
            {
                AppendTextAsRtf(_text, _font, textColor);
            }

            
    /// <summary>
            
    /// Appends the text using the given font and text color, and the current
            
    /// highlight color.
            
    /// </summary>
            
    /// <param name="_text"></param>
            
    /// <param name="_font"></param>
            
    /// <param name="_color"></param>
            public void AppendTextAsRtf(string _text, Font _font, RtfColor _textColor)
            {
                _text 
    = _text.Replace("\\""\\\\");
                AppendTextAsRtf(_text, _font, _textColor, highlightColor);
            }

            
    /// <summary>
            
    /// Appends the text using the given font, text, and highlight colors.  Simply
            
    /// moves the caret to the end of the RichTextBox's text and makes a call to
            
    /// insert.
            
    /// </summary>
            
    /// <param name="_text"></param>
            
    /// <param name="_font"></param>
            
    /// <param name="_textColor"></param>
            
    /// <param name="_backColor"></param>
            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

            
    /// <summary>
            
    /// Inserts the text using the current font, text, and highlight colors.
            
    /// </summary>
            
    /// <param name="_text"></param>
            public void InsertTextAsRtf(string _text)
            {
                InsertTextAsRtf(_text, 
    this.Font);
            }


            
    /// <summary>
            
    /// Inserts the text using the given font, and current text and highlight
            
    /// colors.
            
    /// </summary>
            
    /// <param name="_text"></param>
            
    /// <param name="_font"></param>
            public void InsertTextAsRtf(string _text, Font _font)
            {
                InsertTextAsRtf(_text, _font, textColor);
            }

            
    /// <summary>
            
    /// Inserts the text using the given font and text color, and the current
            
    /// highlight color.
            
    /// </summary>
            
    /// <param name="_text"></param>
            
    /// <param name="_font"></param>
            
    /// <param name="_color"></param>
            public void InsertTextAsRtf(string _text, Font _font, RtfColor _textColor)
            {
                InsertTextAsRtf(_text, _font, _textColor, highlightColor);
            }

            
    /// <summary>
            
    /// 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] }
            
    /// 
            
    /// </summary>
            
    /// <remarks>
            
    /// NOTE: The text is inserted wherever the caret is at the time of the call,
            
    /// and if any text is selected, that text is replaced.
            
    /// </remarks>
            
    /// <param name="_text"></param>
            
    /// <param name="_font"></param>
            
    /// <param name="_color"></param>
            
    /// <param name="_color"></param>
            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(GetDocumentArea(_text, _font));

                
    this.SelectedRtf = _rtf.ToString();
            }

            
    /// <summary>
            
    /// 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
            
    /// formatting specified in the Font object passed in. This should have the
            
    /// form ...
            
    /// 
            
    /// \viewkind4\uc1\pard\cf1\f0\fs20 [DOCUMENT AREA] }
            
    ///
            
    /// </summary>
            
    /// <param name="_text"></param>
            
    /// <param name="_font"></param>
            
    /// <returns>
            
    /// The document area as a string.
            
    /// </returns>
            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 tag
                if (_font.Bold)
                    _doc.Append(
    @"\b");

                
    // If the font is italic, attach corresponding tag
                if (_font.Italic)
                    _doc.Append(
    @"\i");

                
    // If the font is strikeout, attach corresponding tag
                if (_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.SizeInPoints)));

                
    // Apppend a space before starting actual text (for clarity)
                _doc.Append(@" ");

                
    // Append actual text, however, replace newlines with RTF \par.
                
    // Any other special text should be handled here (e.g.) tabs, etc.
                _doc.Append(_text.Replace("\n"@"\par "));

                
    // RTF isn't strict when it comes to closing control words, but what the
                
    // heck ...

                
    // Remove the highlight
                _doc.Append(@"\highlight0");

                
    // If font is bold, close tag
                if (_font.Bold)
                    _doc.Append(
    @"\b0");

                
    // If font is italic, close tag
                if (_font.Italic)
                    _doc.Append(
    @"\i0");

                
    // If font is strikeout, close tag
                if (_font.Strikeout)
                    _doc.Append(
    @"\strike0");

                
    // If font is underlined, cloes tag
                if (_font.Underline)
                    _doc.Append(
    @"\ulnone");

                
    // Revert back to default font and size
                _doc.Append(@"\f0");
                _doc.Append(
    @"\fs20");

                
    // Close the document area control string
                _doc.Append(RTF_DOCUMENT_POST);

                
    return _doc.ToString();
            }

            
    #endregion

            
    #region Insert Image

            
    /// <summary>
            
    /// 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 RichTextBox (and even MS Word), wraps an image in a WMF before inserting
            
    /// the image into a document.  The WMF is attached in HEX format (a string of
            
    /// HEX numbers).
            
    /// 
            
    /// The RTF Specification v1.6 says that you should be able 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,
            
    /// however, when you don't wrap images in a WMF, WordPad and
            
    /// RichTextBoxes simply ignore them.  Both use the riched20.dll or msfted.dll.
            
    /// </summary>
            
    /// <remarks>
            
    /// NOTE: The image is inserted wherever the caret is at the time of the call,
            
    /// and if any text is selected, that text is replaced.
            
    /// </remarks>
            
    /// <param name="_image"></param>
            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();
            }

            
    /// <summary>
            
    /// 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
            
    /// image being inserted, this would be the place to do it. The prefix should
            
    /// have the form ...
            
    /// 
            
    /// {\pict\wmetafile8\picw[A]\pich[B]\picwgoal[C]\pichgoal[D]
            
    /// 
            
    /// where ...
            
    /// 
            
    /// A    = current width of the metafile in hundredths of millimeters (0.01mm)
            
    ///        = Image 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 inch
            
    ///        = (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 inch
            
    ///        = (Image Height in Pixels / Graphics Context's Horizontal Resolution) * 1440
            
    ///        = (Image Height in Pixels / Graphics.DpiX) * 1440
            
    ///    
            
    /// </summary>
            
    /// <remarks>
            
    /// 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
            
    /// I just added the code.
            
    /// 
            
    /// According to Ken Howe at pbdr.com, "Twips are screen-independent units
            
    /// used to ensure that the placement and proportion of screen elements in
            
    /// your screen application 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
            
    /// </remarks>
            
    /// <param name="_image"></param>
            
    /// <returns></returns>
            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 the 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 values to RTF string
                _rtf.Append(@"{\pict\wmetafile8");
                _rtf.Append(
    @"\picw");
                _rtf.Append(picw);
                _rtf.Append(
    @"\pich");
                _rtf.Append(pich);
                _rtf.Append(
    @"\picwgoal");
                _rtf.Append(picwgoal);
                _rtf.Append(
    @"\pichgoal");
                _rtf.Append(pichgoal);
                _rtf.Append(
    " ");

                
    return _rtf.ToString();
            }

            
    /// <summary>
            
    /// Use the EmfToWmfBits function in the GDI+ specification to convert a 
            
    /// Enhanced Metafile to a Windows Metafile
            
    /// </summary>
            
    /// <param name="_hEmf">
            
    /// A handle to the Enhanced Metafile to be converted
            
    /// </param>
            
    /// <param name="_bufferSize">
            
    /// The size of the buffer used to store the Windows Metafile bits returned
            
    /// </param>
            
    /// <param name="_buffer">
            
    /// An array of bytes used to hold the Windows Metafile bits returned
            
    /// </param>
            
    /// <param name="_mappingMode">
            
    /// The mapping mode of the image.  This control uses MM_ANISOTROPIC.
            
    /// </param>
            
    /// <param name="_flags">
            
    /// Flags used to specify the format of the Windows Metafile returned
            
    /// </param>
            [DllImportAttribute("gdiplus.dll")]
            
    private static extern uint GdipEmfToWmfBits(IntPtr _hEmf, uint _bufferSize,
                
    byte[] _buffer, int _mappingMode, EmfToWmfBitsFlags _flags);


            
    /// <summary>
            
    /// 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.
            
    /// </summary>
            
    /// <param name="_image"></param>
            
    /// <returns>
            
    /// A string containing the bits of a Windows Metafile in HEX
            
    /// </returns>
            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(00, _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, 0null, 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

            
    /// <summary>
            
    /// 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
            
    /// should have the form ...
            
    /// 
            
    /// {\fonttbl{\f0\[FAMILY]\fcharset0 [FONT_NAME];}
            
    /// </summary>
            
    /// <param name="_font"></param>
            
    /// <returns></returns>
            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(@"\fcharset134 ");

                
    // Append the name of the font
                _fontTable.Append(_font.Name);

                
    // Close control string
                _fontTable.Append(@";}}");

                
    return _fontTable.ToString();
            }

            
    /// <summary>
            
    /// 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
            
    /// colors are used.  The default 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
            
    /// is always the highlight color (color behind the text).  The color table
            
    /// should have the form ...
            
    /// 
            
    /// {\colortbl ;[TEXT_COLOR];[HIGHLIGHT_COLOR];}
            
    /// 
            
    /// </summary>
            
    /// <param name="_textColor"></param>
            
    /// <param name="_backColor"></param>
            
    /// <returns></returns>
            private string GetColorTable(RtfColor _textColor, RtfColor _backColor)
            {

                StringBuilder _colorTable 
    = new StringBuilder();

                
    // Append color table control string and default font (;)
                _colorTable.Append(@"{\colortbl ;");

                
    // Append the text color
                _colorTable.Append(rtfColor[_textColor]);
                _colorTable.Append(
    @";");

                
    // Append the highlight color
                _colorTable.Append(rtfColor[_backColor]);
                _colorTable.Append(
    @";}\n");

                
    return _colorTable.ToString();
            }

            
    /// <summary>
            
    /// Called by overrided RichTextBox.Rtf accessor.
            
    /// Removes the null character from the RTF.  This is residue from developing
            
    /// the control for a specific instant messaging protocol and can be ommitted.
            
    /// </summary>
            
    /// <param name="_originalRtf"></param>
            
    /// <returns>RTF without null character</returns>
            private string RemoveBadChars(string _originalRtf)
            {
                
    return _originalRtf.Replace("\0""");
            }

            
    #endregion

            
    #region print
            
    // Render the contents of the RichTextBox for printing
            
    //    Return the last character printed + 1 (printing start from this point for next page)
            public int Print(int charFrom, int charTo, PrintPageEventArgs e)
            {
                
    //Calculate the area to render and print
                RECT rectToPrint;
                rectToPrint.Top 
    = (int)(e.MarginBounds.Top * anInch);
                rectToPrint.Bottom 
    = (int)(e.MarginBounds.Bottom * anInch);
                rectToPrint.Left 
    = (int)(e.MarginBounds.Left * anInch);
                rectToPrint.Right 
    = (int)(e.MarginBounds.Right * anInch);

                
    //Calculate the size of the page
                RECT rectPage;
                rectPage.Top 
    = (int)(e.PageBounds.Top * anInch);
                rectPage.Bottom 
    = (int)(e.PageBounds.Bottom * anInch);
                rectPage.Left 
    = (int)(e.PageBounds.Left * anInch);
                rectPage.Right 
    = (int)(e.PageBounds.Right * anInch);

                IntPtr hdc 
    = e.Graphics.GetHdc();

                FORMATRANGE fmtRange;
                fmtRange.chrg.cpMax 
    = charTo;                //Indicate character from to character to 
                fmtRange.chrg.cpMin = charFrom;
                fmtRange.hdc 
    = hdc;                    //Use the same DC for measuring and rendering
                fmtRange.hdcTarget = hdc;              //Point at printer hDC
                fmtRange.rc = rectToPrint;             //Indicate the area on page to print
                fmtRange.rcPage = rectPage;            //Indicate size of page

                IntPtr res 
    = IntPtr.Zero;

                IntPtr wparam 
    = IntPtr.Zero;
                wparam 
    = new IntPtr(1);

                
    //Get the pointer to the FORMATRANGE structure in memory
                IntPtr lparam = IntPtr.Zero;
                lparam 
    = Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange));
                Marshal.StructureToPtr(fmtRange, lparam, 
    false);

                
    //Send the rendered data for printing 
                res = SendMessage(Handle, EM_FORMATRANGE, wparam, lparam);

                
    //Free the block of memory allocated
                Marshal.FreeCoTaskMem(lparam);

                
    //Release the device context handle obtained by a previous call
                e.Graphics.ReleaseHdc(hdc);

                
    //Return last + 1 character printer
                return res.ToInt32();
            }
            
    #endregion

        }
    }

    有了它我们的功能实现起来就方便太多了,第一步先看看实现 的效果吧

         界面就是这个样子的

    功能 不算多,就是对文件的格式 大小颜色,图片的位置还有文件的保存,打印等文件的处理

    主窗下面有一个子窗体是来实现文字编辑的,主窗体主要是实现子窗体的版式,这样可以实现 多窗口化工作,比平常的notepad高了一级

    菜单只要插入一个标准项目就可以了,还有就是工具也是同样的,SM自带的就够用了,

           一个一个的来说吧,

    先来说一下,字体是处理吧,

    MS做的太多了, 只要下面几行就行

    代码
    FontDialog fontDialog = new FontDialog();
                
    //当前字体的颜色
                fontDialog.Color = rtMain.ForeColor;
                fontDialog.AllowScriptChange 
    = true;

                
    //如果要同时指定颜色的话可以在这里设置
                
    //fontDialog.ShowColor = true;
                if (fontDialog.ShowDialog() != DialogResult.Cancel)
                {
                    
    //将当前选定的文字改变字体
                    rtMain.SelectionFont = fontDialog.Font;

                    
    //如果要同时指定颜色的话可以在这里取得
                    
    // rtMain.SelectionColor = fontDialog.Color;
                }
                rtMain.Focus();

     

    rtMain 就是我前面所说的ZYBTextBox控件的名称

    有了这个字体的实现下面的基本如一,下面来看颜色

    代码
    ColorDialog colorDialog = new ColorDialog();

                
    //是否开启自定义颜色
                colorDialog.AllowFullOpen = true;
                colorDialog.FullOpen 
    = true;

                
    //是不有帮助
                colorDialog.ShowHelp = true;

                
    //初始化当前文本框中的字体颜色,当用户在ColorDialog对话框中点击"取消"按钮恢复原来的值
                colorDialog.Color = Color.Black;

                
    if (colorDialog.ShowDialog() != DialogResult.Cancel)
                {
                    
    //将当前选定的文字改变颜色
                    rtMain.SelectionColor = colorDialog.Color; 
                }
                rtMain.Focus();

    还有图片

    图片的实现有点不同,不过基本上一样

    也是先得到文件,然后用  Bitmap img = new Bitmap(fName); 加一下就OK了

    然后添加应该 rtMain.InsertImage(img);

    下面是实现的代码

    代码
    OpenFileDialog openFileDialog = new OpenFileDialog();

                
    //初始目录
                
    // openFileDialog.InitialDirectory = "d:\\";

                
    //图片格式
                openFileDialog.Filter = "位图文件|*.bmp|gif文件|*.gif|TIFF文件|*.tif|jpg文件|*.jpg|所有文件|*.*";

                
    //还原当前目录
                openFileDialog.RestoreDirectory = true;

                
    //默认的文件格式
                openFileDialog.FilterIndex = 1;
                
    if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    
    try
                    {
                        
    string fName = openFileDialog.FileName;

                        
    //加载图片
                        Bitmap img = new Bitmap(fName);

                        
    //添加到ZYBTextBox中
                        rtMain.InsertImage(img);

                    }
                    
    catch (System.IO.FileNotFoundException)
                    {
                        MessageBox.Show(
    "没有找到文件!""错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }

                }
                rtMain.Focus();

    字体加粗的实现

    代码
    //处理粗体显示
                System.Drawing.Font oldFont = rtMain.SelectionFont;
                System.Drawing.Font newFont;
                
    if (oldFont.Bold)
                    newFont 
    = new Font(oldFont, oldFont.Style & ~FontStyle.Bold);
                
    else
                    newFont 
    = new Font(oldFont, oldFont.Style | FontStyle.Bold);

                rtMain.SelectionFont 
    = newFont;
                rtMain.Focus();

    当然像斜体,下划线的实现方法就基本和加粗是一样的了

    代码
    //处理斜体显示
            public void ttsbItalic_Click(object sender, EventArgs e)
            {
                
    //处理斜体显示
                System.Drawing.Font oldFont = rtMain.SelectionFont;
                System.Drawing.Font newFont;
                
    if (oldFont.Italic)
                    newFont 
    = new Font(oldFont, oldFont.Style & ~FontStyle.Italic);
                
    else
                    newFont 
    = new Font(oldFont, oldFont.Style | FontStyle.Italic);
                rtMain.SelectionFont 
    = newFont;
                rtMain.Focus();

            }

            
    //处理下划线显示
            public void ttsbUnderLine_Click(object sender, EventArgs e)
            {
                
    //处理下划线显示
                System.Drawing.Font oldFont = rtMain.SelectionFont; ;
                System.Drawing.Font newFont;
                
    if(oldFont.Underline)
                    newFont 
    = new Font(oldFont,oldFont.Style&~FontStyle.Underline);
                
    else
                    newFont 
    = new Font(oldFont,oldFont.Style|FontStyle.Underline);
                  rtMain.SelectionFont 
    = newFont;
                rtMain.Focus();

            }

    对的打印这一块,我是直接使用的控件,呵呵 最后我会把源码放进来大家自己看吧,这里就不在多说了,

    下面说一下存储方面的,

    打开文件,实现很简单可以说跟上面所说的字体啊,图片啊, 都 差不多

    代码
    OpenFileDialog openFileDialog = new OpenFileDialog();

                
    //初始目录设定
                openFileDialog.InitialDirectory = "d:\\";

                
    //指定打开文件的格式
                openFileDialog.Filter = "文本文件|*.txt|RTF文件|*.rtf|所有文件|*.*";

                
    //还原当前的目录
                openFileDialog.RestoreDirectory = true;
                openFileDialog.FilterIndex 
    = 2;
                
    if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    
    try
                    {
                        
    //文件名
                        string fName = openFileDialog.FileName;

                        
    //加载文件到编辑器里
                        rtMain.LoadFile(fName);
                        printDocument.DocumentName 
    = Path.GetFileName(fName);
                        strFileName 
    = fName;

                        
    //取一个含有扩展名的文件名当做标题
                        this.Text = Path.GetFileNameWithoutExtension(fName) +"--记事本";  
                    }
                    
    catch (System.IO.FileNotFoundException)
                    {
                        MessageBox.Show(
    "没有找到文件!""错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }

                }
                rtMain.Focus();

    直接 把代码复制就行了,

    自然还得有保存,

    保存就更文件了,呵呵

    代码
    SaveFileDialog saveFileDialog = new SaveFileDialog();

                
    //指定打开文件的格式
                saveFileDialog.Filter = "文本文件|*.txt|RTF文件|*.rtf|所有文件|*.*";

                saveFileDialog.FilterIndex 
    = 2;

                
    //还原当前目录
                saveFileDialog.RestoreDirectory = true;

                
    if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    
    try
                    {
                        
    //要保存的位置
                        string strName = saveFileDialog.FileName;

                        
    switch (Path.GetExtension(strName).ToLower())
                        {
                            
    case ".txt":
                                rtMain.SaveFile(strName, RichTextBoxStreamType.PlainText);
                                
    break;
                            
    case ".rtf":
                                rtMain.SaveFile(strName, RichTextBoxStreamType.RichText);
                                
    break;
                            
    default:
                                rtMain.SaveFile(strName);
                                
    break;
                        }
                    }
                    
    catch (System.Exception err)
                    {
                        MessageBox.Show(err.Message);
                    }
                }
                rtMain.Focus();

    然后在关闭这个窗体 的时候 加上个判断,功能就基本实现 了

    if (MessageBox.Show("要保存现有文件吗""提示对话框", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                     
    == DialogResult.Yes)
                    保存SToolStripMenuItem_Click(sender, e);

    对于基本的复制,粘贴,等操作其实只要调用 一下文件就行了,

    就不在多贴代码了下了,下面把所有实现 的代码贴上来,有兴趣的朋友找一下吧,

    也希望能多提建议,能帮上忙的和很高兴,帮不上的也希望能提提建议,呵呵

    代码
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;

    namespace mynotepad
    {
        
    public partial class ChildForm : Form
        {
            
    private int checkPrint;
            
    string strFileName = "";
            
    public ChildForm()
            {
                InitializeComponent();
            }
            
    public ZYBRichTextBox m_rtMain
            {
                
    get { return rtMain; }
             }    

            
    //打印每一页时发手
            private void printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
            {
                checkPrint 
    = rtMain.Print(checkPrint, rtMain.TextLength, e);

                
    // Check for more pages
                if (checkPrint < rtMain.TextLength)
                    e.HasMorePages 
    = true;
                
    else
                    e.HasMorePages 
    = false;
            }

            
    //开始打印
            private void printDocument_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
            {
                checkPrint 
    = 0;
            }

            
    //打印完成
            private void printDocument_EndPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
            {
                MessageBox.Show(printDocument.DocumentName 
    + " 已经打印完成!");
            }

            
    //打开文件
            public  void 打开OToolStripMenuItem_Click(object sender, EventArgs e)
            {
                OpenFileDialog openFileDialog 
    = new OpenFileDialog();

                
    //初始目录设定
                openFileDialog.InitialDirectory = "d:\\";

                
    //指定打开文件的格式
                openFileDialog.Filter = "文本文件|*.txt|RTF文件|*.rtf|所有文件|*.*";

                
    //还原当前的目录
                openFileDialog.RestoreDirectory = true;
                openFileDialog.FilterIndex 
    = 2;
                
    if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    
    try
                    {
                        
    //文件名
                        string fName = openFileDialog.FileName;

                        
    //加载文件到编辑器里
                        rtMain.LoadFile(fName);
                        printDocument.DocumentName 
    = Path.GetFileName(fName);
                        strFileName 
    = fName;

                        
    //取一个含有扩展名的文件名当做标题
                        this.Text = Path.GetFileNameWithoutExtension(fName) +"--记事本";  
                    }
                    
    catch (System.IO.FileNotFoundException)
                    {
                        MessageBox.Show(
    "没有找到文件!""错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }

                }
                rtMain.Focus();
            }

            
    public void 另存为AToolStripMenuItem_Click(object sender, EventArgs e)
            {
                SaveFileDialog saveFileDialog 
    = new SaveFileDialog();

                
    //指定打开文件的格式
                saveFileDialog.Filter = "文本文件|*.txt|RTF文件|*.rtf|所有文件|*.*";

                saveFileDialog.FilterIndex 
    = 2;

                
    //还原当前目录
                saveFileDialog.RestoreDirectory = true;

                
    if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    
    try
                    {
                        
    //要保存的位置
                        string strName = saveFileDialog.FileName;

                        
    switch (Path.GetExtension(strName).ToLower())
                        {
                            
    case ".txt":
                                rtMain.SaveFile(strName, RichTextBoxStreamType.PlainText);
                                
    break;
                            
    case ".rtf":
                                rtMain.SaveFile(strName, RichTextBoxStreamType.RichText);
                                
    break;
                            
    default:
                                rtMain.SaveFile(strName);
                                
    break;
                        }
                    }
                    
    catch (System.Exception err)
                    {
                        MessageBox.Show(err.Message);
                    }
                }
                rtMain.Focus();
            }

            
    //打印设置
            public void toolStripMenuItem1_Click(object sender, EventArgs e)
            {
                PageSetupDialog pageSetupDialog 
    = new PageSetupDialog();
                pageSetupDialog.Document 
    = printDocument;
                pageSetupDialog.ShowDialog();

            }

            
    //打印
            public void 打印PToolStripMenuItem_Click(object sender, EventArgs e)
            {
                PrintDialog printDialog 
    = new PrintDialog();

                
    //打印的项目
                printDialog.Document = printDocument;
                
    if (printDialog.ShowDialog() != DialogResult.Cancel)
                {
                    
    try
                    {
                        
    //开始打印
                        printDocument.Print();
                    }
                    
    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }

            
    //打印预览
            public void 打印预览VToolStripMenuItem_Click(object sender, EventArgs e)
            {
                StringReader lineReader 
    = new StringReader(rtMain.Text);
                
    try
                {
                    PrintPreviewDialog printPreviewDialog 
    = new PrintPreviewDialog();
                    
    //数据源
                    printPreviewDialog.Document = printDocument;
                    printPreviewDialog.FormBorderStyle 
    = FormBorderStyle.Fixed3D;
                    printPreviewDialog.ShowDialog();
                }
                
    catch (Exception excep)
                {
                    MessageBox.Show(excep.Message, 
    "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    
    return;
                }
            }

            
    //撤消
            public void 撤消UToolStripMenuItem_Click(object sender, EventArgs e)
            {
                rtMain.Undo();
            }

            
    //重复
            public void 重复RToolStripMenuItem_Click(object sender, EventArgs e)
            {
                rtMain.Redo();
            }

            
    //剪切
            public void 剪切TToolStripMenuItem_Click(object sender, EventArgs e)
            {
                rtMain.Cut();
            }

            
    //复制
            public void 复制CToolStripMenuItem_Click(object sender, EventArgs e)
            {
                rtMain.Copy();
            }

            
    //粘贴
            public void 粘贴PToolStripMenuItem_Click(object sender, EventArgs e)
            {
                rtMain.Paste();
            }

            
    //全选
            public void 全选AToolStripMenuItem_Click(object sender, EventArgs e)
            {
                rtMain.SelectAll();
            }

            
    //清除
            public void 清除ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                rtMain.Clear();
            }

            
    //字体设置
            public void 字体FToolStripMenuItem_Click(object sender, EventArgs e)
            {
                FontDialog fontDialog 
    = new FontDialog();
                
    //当前字体的颜色
                fontDialog.Color = rtMain.ForeColor;
                fontDialog.AllowScriptChange 
    = true;

                
    //如果要同时指定颜色的话可以在这里设置
                
    //fontDialog.ShowColor = true;
                if (fontDialog.ShowDialog() != DialogResult.Cancel)
                {
                    
    //将当前选定的文字改变字体
                    rtMain.SelectionFont = fontDialog.Font;

                    
    //如果要同时指定颜色的话可以在这里取得
                    
    // rtMain.SelectionColor = fontDialog.Color;
                }
                rtMain.Focus();

            }

            
    //颜色设置
            public void 颜色CToolStripMenuItem_Click(object sender, EventArgs e)
            {
                ColorDialog colorDialog 
    = new ColorDialog();

                
    //是否开启自定义颜色
                colorDialog.AllowFullOpen = true;
                colorDialog.FullOpen 
    = true;

                
    //是不有帮助
                colorDialog.ShowHelp = true;

                
    //初始化当前文本框中的字体颜色,当用户在ColorDialog对话框中点击"取消"按钮恢复原来的值
                colorDialog.Color = Color.Black;

                
    if (colorDialog.ShowDialog() != DialogResult.Cancel)
                {
                    
    //将当前选定的文字改变颜色
                    rtMain.SelectionColor = colorDialog.Color; 
                }
                rtMain.Focus();

            }

            
    //插入图片
            private void 图像PToolStripMenuItem_Click(object sender, EventArgs e)
            {
                OpenFileDialog openFileDialog 
    = new OpenFileDialog();

                
    //初始目录
                
    // openFileDialog.InitialDirectory = "d:\\";

                
    //图片格式
                openFileDialog.Filter = "位图文件|*.bmp|gif文件|*.gif|TIFF文件|*.tif|jpg文件|*.jpg|所有文件|*.*";

                
    //还原当前目录
                openFileDialog.RestoreDirectory = true;

                
    //默认的文件格式
                openFileDialog.FilterIndex = 1;
                
    if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    
    try
                    {
                        
    string fName = openFileDialog.FileName;

                        
    //加载图片
                        Bitmap img = new Bitmap(fName);

                        
    //添加到ZYBTextBox中
                        rtMain.InsertImage(img);

                    }
                    
    catch (System.IO.FileNotFoundException)
                    {
                        MessageBox.Show(
    "没有找到文件!""错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }

                }
                rtMain.Focus();

            }

            
    //左对齐
            public void 左对齐LToolStripMenuItem_Click(object sender, EventArgs e)
            {
                rtMain.SelectionAlignment 
    = HorizontalAlignment.Left;
            }

            
    // 居中
            public void 居中EToolStripMenuItem_Click(object sender, EventArgs e)
            {
                rtMain.SelectionAlignment 
    = HorizontalAlignment.Center;
            }

            
    //右对齐
            public void 右对齐RToolStripMenuItem_Click(object sender, EventArgs e)
            {
                rtMain.SelectionAlignment 
    = HorizontalAlignment.Right;
            }

            
    // 保存
            public void 保存SToolStripMenuItem_Click(object sender, EventArgs e)
            {
                
    if (strFileName != "")
                    rtMain.SaveFile(strFileName);
                
    else
                    另存为AToolStripMenuItem_Click(sender, e);

            }

            
    //新建
            public void 新建NToolStripMenuItem_Click(object sender, EventArgs e)
            {
                
    if (MessageBox.Show("要保存现有文件吗""提示对话框", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                    
    == DialogResult.Yes)
                    保存SToolStripMenuItem_Click(sender, e);
                
    else
                {
                    strFileName 
    = "";
                    rtMain.Clear();
                }
                
    this.Text = "新建文档 --记事本";  
            }

            
    //处理粗体显示
            public void tsbBold_Click(object sender, EventArgs e)
            {
                
    //处理粗体显示
                System.Drawing.Font oldFont = rtMain.SelectionFont;
                System.Drawing.Font newFont;
                
    if (oldFont.Bold)
                    newFont 
    = new Font(oldFont, oldFont.Style & ~FontStyle.Bold);
                
    else
                    newFont 
    = new Font(oldFont, oldFont.Style | FontStyle.Bold);

                rtMain.SelectionFont 
    = newFont;
                rtMain.Focus();

            }

            
    //处理斜体显示
            public void ttsbItalic_Click(object sender, EventArgs e)
            {
                
    //处理斜体显示
                System.Drawing.Font oldFont = rtMain.SelectionFont;
                System.Drawing.Font newFont;
                
    if (oldFont.Italic)
                    newFont 
    = new Font(oldFont, oldFont.Style & ~FontStyle.Italic);
                
    else
                    newFont 
    = new Font(oldFont, oldFont.Style | FontStyle.Italic);
                rtMain.SelectionFont 
    = newFont;
                rtMain.Focus();

            }

            
    //处理下划线显示
            public void ttsbUnderLine_Click(object sender, EventArgs e)
            {
                
    //处理下划线显示
                System.Drawing.Font oldFont = rtMain.SelectionFont; ;
                System.Drawing.Font newFont;
                
    if(oldFont.Underline)
                    newFont 
    = new Font(oldFont,oldFont.Style&~FontStyle.Underline);
                
    else
                    newFont 
    = new Font(oldFont,oldFont.Style|FontStyle.Underline);
                  rtMain.SelectionFont 
    = newFont;
                rtMain.Focus();

            }

            
    //初始化字体选择
            private void MainForm_Load(object sender, EventArgs e)
            {
                MainForm parent 
    = (MainForm)this.MdiParent;

                
    //初始化字体选择
                foreach (FontFamily oneFontFamily in FontFamily.Families)
                {
                    parent.m_tscbFont.Items.Add(oneFontFamily.Name);
                }
                parent.m_tscbFont.SelectedItem 
    = "宋体";
                parent.m_tscbSize.SelectedIndex 
    = 2;
            }

            
    //字体选择
            private void tscbFont_SelectedIndexChanged(object sender, EventArgs e)
            {
               MainForm parent 
    = (MainForm)this.MdiParent;
               
    if (parent.m_tscbSize.SelectedItem == null)
                    
    return;
               FontFamily family 
    = new FontFamily(parent.m_tscbFont.SelectedItem.ToString());
               
    float emSize = float.Parse(parent.m_tscbSize.SelectedItem.ToString());
               System.Drawing.Font newFont 
    = new Font(family,emSize);;
               rtMain.SelectionFont 
    = newFont;
               rtMain.Focus();          
            }

            
    //关闭时保存文件
            private void ChildForm_FormClosed(object sender, FormClosedEventArgs e)
            {
                
    if (MessageBox.Show("要保存现有文件吗""提示对话框", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                     
    == DialogResult.Yes)
                    保存SToolStripMenuItem_Click(sender, e);
            }
           
        }
    }
  • 相关阅读:
    (HDU)1393 -- Weird Clock (奇怪的时钟)
    (HDU)1391 -- Number Steps (数字阶梯)
    (HDU)1390 -- Binary Numbers(二进制数)
    (HDU)1339 -- A Simple Task(简单任务)
    (HDU)1335 -- Basically Speaking(基础和交流)
    论文笔记:Fully-Convolutional Siamese Networks for Object Tracking
    论文笔记:Visual Object Tracking based on Adaptive Siamese and Motion Estimation Network
    论文笔记:Attentional Correlation Filter Network for Adaptive Visual Tracking
    论文笔记:Deep Attentive Tracking via Reciprocative Learning
    Learning Spatial-Temporal Regularized Correlation Filters for Visual Tracking---随笔
  • 原文地址:https://www.cnblogs.com/sufei/p/1677425.html
Copyright © 2011-2022 走看看