闲来没事写个记事本玩玩!!!

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

说到实现 记事本,我们应该选择什么样的控件呢,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);
        }
       
    }
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304329.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LG将授权webOS给其他电视厂商使用

喜欢就关注我们吧&#xff01;LG 将向其他公司提供 webOS。根据 LG 发布的公告&#xff0c;其自家电视机搭载的专有系统 webOS 将会授权给其他的外部电视厂商使用。被授权使用 webOS 的电视厂商还会获得来自 LG 的 Magic Motion 遥控器&#xff0c;此外&#xff0c;系统的语音控…

数据之美,堪比好莱坞大片!

看完下面的几张图&#xff0c;你就知道自己有多无知了。堪称是好莱坞大片啊&#xff01;1城市3D空间通过2D瓦片图层的3D化&#xff0c;能够在经度维度、量级、时间多个维度上真实还原城市3D空间。例子中为模拟的轨迹数据和旧金山食物供应商分布。2GPS轨迹分布以三种不同的方式描…

HSRP的配置问题

HSRP的配置问题<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />实验目的&#xff1a;理解和掌握路由热备份的配置步骤和原理实现网关的冗余功能实验环境&#xff1a;如下图所示<?xml:namespace prefix v ns "urn:sch…

数学从小学开始“梯次掉队”?别让课本的枯燥“浇灭”孩子对数学的兴趣

1、2、3、4、5……从孩子用手指数数开始&#xff0c;就与数学结下了不解之缘。进入幼儿园&#xff0c;在老师的指导下画出三角形&#xff0c;圆形等&#xff0c;这是数学中的几何。稍大一点&#xff0c;到商店里买东西&#xff0c;开始懂得买的东西是多还是少&#xff0c;是大还…

用算法撩妹都不会,别跟我说你是程序员

程序员浪漫的表白方式可以说是花样百出&#xff0c;为什么用在自己身上就没效果呢&#xff1f;作为一个程序员“身边的女生”&#xff0c;小编觉得&#xff0c;大部分程序员没有女朋友&#xff0c;很可能是恋爱技能bug太多&#xff0c;当你还不确定那个女生对你的喜欢程度&…

从工作经历和实践理论看工业互联网的发展

一.前言本篇文章是对以前点点滴滴的记录整理而成&#xff0c;也是我们做iNeuOS工业互联网操作系统进行的深入思考。本篇文章有宣传产品之嫌&#xff0c;但是确实是我们理念与实践相结合的产物。下面的图是我2017年参加完工博会后&#xff0c;在QQ群里做的调查&#xff0c;仅供大…

关于c语言的符号常量以下叙述中正确的是,关于C语言的符号常量,以下叙述中正确的是...

摘要&#xff1a;项指需要哪一以下标不上报&#xff0c;关于女病工作普查普治评价进行对妇时。下列正确的是说法&#xff0c;符号治愈率达&#xff0c;告说治疗者某广某药斑狼了2例红疮患&#xff0c;其中痊愈0例。行为个体这种矫正称为方法&#xff0c;常量吸烟济处烟者予经当…

2017年终奖发放,程序员人均11776元排名第一!

又到了一年一度的“晒年终奖”时刻了&#xff01;你敢晒一波吗&#xff1f;快过年了&#xff0c;又到了一年一度的年终奖盘点时间&#xff01;此可谓扎心扎心再扎心&#xff01;那么&#xff0c;你2017年的年终奖有多少&#xff1f;满意不&#xff1f;2017年全国白领人均年终奖…

因MemoryCache闹了个笑话

前言是这么一回事&#xff1a;我正在苦思一个业务逻辑&#xff0c;捋着我还剩不多的秀发&#xff0c;一时陷入冥想中……突然聊天图标一顿猛闪&#xff0c;打开一看&#xff0c;有同事语音&#xff1b;大概意思是&#xff1a;同事把项目中Redis部分缓存换成MemoryCache/Memcach…

Coursera吴恩达《卷积神经网络》课程笔记(1)-- 卷积神经网络基础

推荐阅读时间&#xff1a;8min~15min主要内容&#xff1a;卷积神经网络《Convolutional Neural Networks》是Andrw Ng深度学习专项课程中的第四门课。这门课主要介绍卷积神经网络&#xff08;CNN&#xff09;的基本概念、模型和具体应用。该门课共有4周课时&#xff0c;所以我将…

纯c语言实现的改进暗通道去雾算法测试程序(附赠大量测试图像),基于改进暗通道先验算法的图像去雾...

邱清辉摘要&#xff1a;针对普通暗通道先验算法去雾能力的不足&#xff0c;本文提出了一种改进算法&#xff0c;通过采用高斯平滑将原图像分为基础子图和细节子图&#xff0c;基础子图采用暗通道先验算法&#xff0c;细节子图采用gamma变换方法&#xff0c;再采用图像融合进行融…

为什么离开学校后,学习能力直线下降?

最近几年&#xff0c;人工智能浪潮层层推进&#xff0c;对各大科技公司产生巨大影响。百度推出Apollo无人车计划&#xff0c;阿里建立达摩院&#xff0c;腾讯成立的AI Lab虽布局较晚却也不甘人后。ChinaAI已是大势所趋&#xff0c;吸引的不仅是大公司&#xff0c;更有许多人工智…

android6.0重力工具箱,重力工具箱 GravityBox For Android8.0/8.1(Oreo)稳定版发布!

作为功能最强大的Xposed框架模块之一&#xff0c;重力工具箱 GravityBox的更新适配一直也是最积极的&#xff0c;本次发布的8.x专用版本也算是比较及时&#xff0c;每一个大的Android版本&#xff0c;重力工具箱基本都会有一个专门的版本来适配&#xff0c;当然基础功能也会略有…

如何在 ASP.Net Core 中使用 MediatR

MediatR 是一个 中介者模式 的.NET开源实现&#xff0c; 中介者模式 管控了一组对象之间的相互通讯并有效的减少了对象之间错综复杂的相互依赖&#xff0c;在 中介者模式 中&#xff0c;一个对象不需要直接和另一个对象进行通讯&#xff0c;而是通过 中介者 进行转达&#xff0…

全球100款大数据工具汇总(前50款)

01 Talend Open Studio是第一家针对的数据集成工具市场的ETL(数据的提取Extract、传输Transform、载入Load)开源软件供应商。Talend的下载量已超过200万人次&#xff0c;其开源软件提供了数据整合功能。其用户包括美国国际集团&#xff08;AIG&#xff09;、康卡斯特、电子港湾…

NLP快速入门:手把手教你用HanLP做中文分词

导读&#xff1a;随着自然语言处理(Natural Language Processing, NLP)技术日趋成熟&#xff0c;实现中文分词的工具也越来越多。中文分词技术作为中文自然语言处理的第一项核心技术&#xff0c;是众多上层任务的首要基础工作&#xff0c;同时在日常的工作中起着基础性的作用。…

动态内存(Dynamic Memory),微软的内存过量分配技术?

Hyper-V不支持Memory Overcommitment&#xff0c;一直为VMware和其他虚拟化厂商所诟病。当然&#xff0c;微软一直不承认这是他们的软肋&#xff0c;认为为了保证生产环境VM的性能&#xff0c;过量分配内存是不合时宜的。但是&#xff0c;微软的态度似乎突然转变&#xff0c;3月…

程序员上帝视角解读“旅行青蛙”,你的呱真的在旅行嘛?

来源&#xff1a;知乎作者&#xff1a;黄小秋原文链接&#xff1a;https://www.zhihu.com/question/68733553/answer/305463907导语&#xff1a;知乎有位程序员大佬&#xff0c;为了让老母亲老父亲们理解自己的呱究竟在干什么&#xff0c;于是花了五个晚上逆向游戏程序逻辑&…

我为什么对TypeScript由黑转粉?

喜欢就关注我们吧&#xff01;一名曾仅使用 JavaScript 的开发者解释自己为何从反对 TypeScript 到转变为 TypeScript 粉丝。Chirag Swadia 自称曾是 Anti-TypeScript 的 JavaScript 开发者。谈及反对的原因&#xff0c;他以前一直认为给函数/变量添加类型以满足 TypeScript 编…

谈谈关于MVP模式中V-P交互问题

在差不多两年的时间内&#xff0c;我们项目组几十来号人都扑在一个项目上面。这是一个基于微软SCSF&#xff08;Smart Client Software Factory&#xff09;的项目&#xff0c;客户端是墨尔本一家事业单位。前两周&#xff0c;我奉命负责对某个模块进行Code Review工作&#xf…