using System;
using System.Collections.Specialized;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
namespace Khendys.Controls {
#region Public Enums
// Enum for possible RTF colors
public enum RtfColor {
Black, Maroon, Green, Olive, Navy, Purple, Teal, Gray, Silver,
Red, Lime, Yellow, Blue, Fuchsia, Aqua, White
}
#endregion
public class ExRichTextBox : System.Windows.Forms.RichTextBox {
#region My Enums
// Specifies the flags/options for the unmanaged call to the GDI+ method
// Metafile.EmfToWmfBits().
private enum EmfToWmfBitsFlags {
// Use the default conversion
EmfToWmfBitsFlagsDefault = 0x00000000,
// Embedded the source of the EMF metafiel within the resulting WMF
// metafile
EmfToWmfBitsFlagsEmbedEmf = 0x00000001,
// Place a 22-byte header in the resulting WMF file. The header is
// required for the metafile to be considered placeable.
EmfToWmfBitsFlagsIncludePlaceable = 0x00000002,
// Don't simulate clipping by using the XOR operator.
EmfToWmfBitsFlagsNoXORClip = 0x00000004
};
#endregion
#region My Structs
// Definitions for colors in an RTF document
private struct RtfColorDef {
public const string Black = @"\red0\green0\blue0";
public const string Maroon = @"\red128\green0\blue0";
public const string Green = @"\red0\green128\blue0";
public const string Olive = @"\red128\green128\blue0";
public const string Navy = @"\red0\green0\blue128";
public const string Purple = @"\red128\green0\blue128";
public const string Teal = @"\red0\green128\blue128";
public const string Gray = @"\red128\green128\blue128";
public const string Silver = @"\red192\green192\blue192";
public const string Red = @"\red255\green0\blue0";
public const string Lime = @"\red0\green255\blue0";
public const string Yellow = @"\red255\green255\blue0";
public const string Blue = @"\red0\green0\blue255";
public const string Fuchsia = @"\red255\green0\blue255";
public const string Aqua = @"\red0\green255\blue255";
public const string White = @"\red255\green255\blue255";
}
// Control words for RTF font families
private struct RtfFontFamilyDef {
public const string Unknown = @"\fnil";
public const string Roman = @"\froman";
public const string Swiss = @"\fswiss";
public const string Modern = @"\fmodern";
public const string Script = @"\fscript";
public const string Decor = @"\fdecor";
public const string Technical = @"\ftech";
public const string BiDirect = @"\fbidi";
}
#endregion
#region My Constants
// Not used in this application. Descriptions can be found with documentation
// of Windows GDI function SetMapMode
private const int MM_TEXT = 1;
private const int MM_LOMETRIC = 2;
private const int MM_HIMETRIC = 3;
private const int MM_LOENGLISH = 4;
private const int MM_HIENGLISH = 5;
private const int MM_TWIPS = 6;
// Ensures that the metafile maintains a 1:1 aspect ratio
private const int MM_ISOTROPIC = 7;
// Allows the x-coordinates and y-coordinates of the metafile to be adjusted
// independently
private const int MM_ANISOTROPIC = 8;
// Represents an unknown font family
private const string FF_UNKNOWN = "UNKNOWN";
// The number of hundredths of millimeters (0.01 mm) in an inch
// For more information, see GetImagePrefix() method.
private const int HMM_PER_INCH = 2540;
// The number of twips in an inch
// For more information, see GetImagePrefix() method.
private const int TWIPS_PER_INCH = 1440;
#endregion
#region My Privates
// The default text color
private RtfColor textColor;
// The default text background color
private RtfColor highlightColor;
// Dictionary that maps color enums to RTF color codes
private HybridDictionary rtfColor;
// Dictionary that mapas Framework font families to RTF font families
private HybridDictionary rtfFontFamily;
// The horizontal resolution at which the control is being displayed
private float xDpi;
// The vertical resolution at which the control is being displayed
private float yDpi;
#endregion
#region Elements required to create an RTF document
/* RTF HEADER
* ----------
*
* \rtf[N] - For text to be considered to be RTF, it must be enclosed in this tag.
* rtf1 is used because the RichTextBox conforms to RTF Specification
* version 1.
* \ansi - The character set.
* \ansicpg[N] - Specifies that unicode characters might be embedded. ansicpg1252
* is the default used by Windows.
* \deff[N] - The default font. \deff0 means the default font is the first font
* found.
* \deflang[N] - The default language. \deflang1033 specifies US English.
* */
private const string RTF_HEADER = @"{\rtf1\ansi\ansicpg1252\deff0\deflang1033";
/* RTF DOCUMENT AREA
* -----------------
*
* \viewkind[N] - The type of view or zoom level. \viewkind4 specifies normal view.
* \uc[N] - The number of bytes corresponding to a Unicode character.
* \pard - Resets to default paragraph properties
* \cf[N] - Foreground color. \cf1 refers to the color at index 1 in
* the color table
* \f[N] - Font number. \f0 refers to the font at index 0 in the font
* table.
* \fs[N] - Font size in half-points.
* */
private const string RTF_DOCUMENT_PRE = @"\viewkind4\uc1\pard\cf1\f0\fs20";
private const string RTF_DOCUMENT_POST = @"\cf0\fs17}";
private string RTF_IMAGE_POST = @"}";
#endregion
#region Accessors
// TODO: This can be ommitted along with RemoveBadCharacters
// Overrides the default implementation of RTF. This is done 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 ExRichTextBox() : base() {
// Initialize default text and background colors
textColor = RtfColor.Black;
highlightColor = RtfColor.White;
// Initialize the dictionary mapping color codes to definitions
rtfColor = new HybridDictionary();
rtfColor.Add(RtfColor.Aqua, RtfColorDef.Aqua);
rtfColor.Add(RtfColor.Black, RtfColorDef.Black);
rtfColor.Add(RtfColor.Blue, RtfColorDef.Blue);
rtfColor.Add(RtfColor.Fuchsia, RtfColorDef.Fuchsia);
rtfColor.Add(RtfColor.Gray, RtfColorDef.Gray);
rtfColor.Add(RtfColor.Green, RtfColorDef.Green);
rtfColor.Add(RtfColor.Lime, RtfColorDef.Lime);
rtfColor.Add(RtfColor.Maroon, RtfColorDef.Maroon);
rtfColor.Add(RtfColor.Navy, RtfColorDef.Navy);
rtfColor.Add(RtfColor.Olive, RtfColorDef.Olive);
rtfColor.Add(RtfColor.Purple, RtfColorDef.Purple);
rtfColor.Add(RtfColor.Red, RtfColorDef.Red);
rtfColor.Add(RtfColor.Silver, RtfColorDef.Silver);
rtfColor.Add(RtfColor.Teal, RtfColorDef.Teal);
rtfColor.Add(RtfColor.White, RtfColorDef.White);
rtfColor.Add(RtfColor.Yellow, RtfColorDef.Yellow);
// Initialize the dictionary mapping default Framework fon
C#技术文章(零散的技术文章)
需积分: 0 55 浏览量
更新于2011-07-13
收藏 2.77MB RAR 举报
在C#技术文章的集合中,我们可以探索一系列与C#编程语言相关的知识点,这些知识点对于初学者和有经验的开发者都是宝贵的资源。C#是一种面向对象的、类型安全的编程语言,由微软公司开发,主要用于构建Windows应用程序以及.NET框架下的各种软件。下面,我们将深入探讨C#的一些核心概念和关键特性。
1. **基础语法**:C#的语法结构与C++和Java类似,包括变量声明、数据类型(如int、float、string等)、控制流语句(如if、for、while)、函数定义和调用等。
2. **类与对象**:C#是面向对象的语言,它支持类的定义,通过类可以创建对象。类包含属性(数据成员)和方法(行为),对象则是类的实例,具有类定义的属性和行为。
3. **继承与多态**:C#支持单一继承,即一个类只能从一个基类派生。多态性体现在接口实现和虚方法的重写上,使得子类能根据自身特性覆盖或扩展父类的功能。
4. **接口**:接口在C#中定义了一组方法签名,可以被类实现。它们用于实现抽象功能,允许类之间进行更灵活的交互。
5. **泛型**:泛型提供了一种方式来创建可重用的代码,这些代码可以处理多种数据类型。泛型集合如List<T>和Dictionary<TKey, TValue>提高了代码的类型安全性和效率。
6. **异常处理**:C#使用try-catch-finally结构处理异常,提供了预定义的异常类,如FileNotFoundException和NullReferenceException,开发者也可以自定义异常类。
7. **LINQ(Language Integrated Query)**:这是C#的一个重要特性,它将查询语言集成到编程语言中,使数据操作更加简洁、高效。LINQ支持SQL数据库、XML文档和各种数据源的查询。
8. **异步编程**:C#的async和await关键字简化了异步编程,允许非阻塞的I/O操作,提高程序的响应性和性能。
9. **委托与事件**:委托是C#中的类型安全的函数指针,可以用来传递方法作为参数。事件是基于委托的,常用于UI编程,如按钮点击事件。
10. **匿名方法与Lambda表达式**:这两者提供了简洁的编写回调函数的方式,Lambda表达式在LINQ查询中尤其常见。
11. **异构集合与泛型接口**:例如,IEnumerable<T>接口定义了迭代器的行为,允许遍历任何实现了此接口的数据结构,如数组或列表。
12. **属性与自动属性**:属性提供了一种封装字段访问的方法,自动属性简化了属性的定义,如`public string Name { get; set; }`。
13. **命名空间**:命名空间用于组织代码,避免命名冲突,如System命名空间包含了.NET框架的基础类库。
14. **元数据与反射**:C#支持元数据,可以用来获取类型、成员和其他编程元素的信息。反射则利用这些元数据在运行时动态创建对象、调用方法等。
15. **异构编程与互操作性**:C#可以通过.NET Framework的COM互操作性支持与非托管代码(如ActiveX控件)交互。
以上只是C#众多特性和知识点的一部分,通过阅读和学习这些技术文章,你将能够深入理解C#的精髓,并能够运用到实际项目中,解决各种编程挑战。C#还在不断发展,新的版本(如C# 9.0)引入了更多的现代化特性,如模式匹配、async streams和top-level statements,持续提升开发者的生产力和体验。