1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263:
| using System; using System.ComponentModel; using System.Collections.Generic; using System.Diagnostics; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Drawing; using System.Text.RegularExpressions;
namespace InfoDB { public partial class RichTextBoxEx : RichTextBox { #region Interop-Defines [StructLayout(LayoutKind.Sequential)] private struct CHARFORMAT2_STRUCT { public UInt32 cbSize; public UInt32 dwMask; public UInt32 dwEffects; public Int32 yHeight; public Int32 yOffset; public Int32 crTextColor; public byte bCharSet; public byte bPitchAndFamily; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public char[] szFaceName; public UInt16 wWeight; public UInt16 sSpacing; public int crBackColor; public int lcid; public int dwReserved; public Int16 sStyle; public Int16 wKerning; public byte bUnderlineType; public byte bAnimation; public byte bRevAuthor; public byte bReserved1; }
[DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
private const int WM_USER = 0x0400; private const int EM_GETCHARFORMAT = WM_USER + 58; private const int EM_SETCHARFORMAT = WM_USER + 68;
private const int SCF_SELECTION = 0x0001; private const int SCF_WORD = 0x0002; private const int SCF_ALL = 0x0004;
#region CHARFORMAT2 Flags private const UInt32 CFE_BOLD = 0x0001; private const UInt32 CFE_ITALIC = 0x0002; private const UInt32 CFE_UNDERLINE = 0x0004; private const UInt32 CFE_STRIKEOUT = 0x0008; private const UInt32 CFE_PROTECTED = 0x0010; private const UInt32 CFE_LINK = 0x0020; private const UInt32 CFE_AUTOCOLOR = 0x40000000; private const UInt32 CFE_SUBSCRIPT = 0x00010000; private const UInt32 CFE_SUPERSCRIPT = 0x00020000;
private const int CFM_SMALLCAPS = 0x0040; private const int CFM_ALLCAPS = 0x0080; private const int CFM_HIDDEN = 0x0100; private const int CFM_OUTLINE = 0x0200; private const int CFM_SHADOW = 0x0400; private const int CFM_EMBOSS = 0x0800; private const int CFM_IMPRINT = 0x1000; private const int CFM_DISABLED = 0x2000; private const int CFM_REVISED = 0x4000;
private const int CFM_BACKCOLOR = 0x04000000; private const int CFM_LCID = 0x02000000; private const int CFM_UNDERLINETYPE = 0x00800000; private const int CFM_WEIGHT = 0x00400000; private const int CFM_SPACING = 0x00200000; private const int CFM_KERNING = 0x00100000; private const int CFM_STYLE = 0x00080000; private const int CFM_ANIMATION = 0x00040000; private const int CFM_REVAUTHOR = 0x00008000;
private const UInt32 CFM_BOLD = 0x00000001; private const UInt32 CFM_ITALIC = 0x00000002; private const UInt32 CFM_UNDERLINE = 0x00000004; private const UInt32 CFM_STRIKEOUT = 0x00000008; private const UInt32 CFM_PROTECTED = 0x00000010; private const UInt32 CFM_LINK = 0x00000020; private const UInt32 CFM_SIZE = 0x80000000; private const UInt32 CFM_COLOR = 0x40000000; private const UInt32 CFM_FACE = 0x20000000; private const UInt32 CFM_OFFSET = 0x10000000; private const UInt32 CFM_CHARSET = 0x08000000; private const UInt32 CFM_SUBSCRIPT = CFE_SUBSCRIPT | CFE_SUPERSCRIPT; private const UInt32 CFM_SUPERSCRIPT = CFM_SUBSCRIPT;
private const byte CFU_UNDERLINENONE = 0x00000000; private const byte CFU_UNDERLINE = 0x00000001; private const byte CFU_UNDERLINEWORD = 0x00000002; private const byte CFU_UNDERLINEDOUBLE = 0x00000003; private const byte CFU_UNDERLINEDOTTED = 0x00000004; private const byte CFU_UNDERLINEDASH = 0x00000005; private const byte CFU_UNDERLINEDASHDOT = 0x00000006; private const byte CFU_UNDERLINEDASHDOTDOT = 0x00000007; private const byte CFU_UNDERLINEWAVE = 0x00000008; private const byte CFU_UNDERLINETHICK = 0x00000009; private const byte CFU_UNDERLINEHAIRLINE = 0x0000000A;
#endregion
#endregion
public RichTextBoxEx() { InitializeComponent(); this.DetectUrls = false; }
public RichTextBoxEx(IContainer container) { container.Add(this);
InitializeComponent(); }
[DefaultValue(false)] public new bool DetectUrls { get { return base.DetectUrls; } set { base.DetectUrls = value; } }
public void InsertLink(string text) { InsertLink(text, this.SelectionStart); }
public void InsertLink(string text, int position) { if (position < 0 || position > this.Text.Length) throw new ArgumentOutOfRangeException("position");
this.SelectionStart = position; this.SelectedText = text; this.Select(position, text.Length); this.SetSelectionLink(true); this.Select(position + text.Length, 0); }
public void InsertLink(string text, string hyperlink) { InsertLink(text, hyperlink, this.SelectionStart); }
public void InsertLink(string text, string hyperlink, int position) { if (position < 0 || position > this.Text.Length) throw new ArgumentOutOfRangeException("position");
this.SelectionStart = position; this.SelectedRtf = @"{\rtf1\ansi " + text + @"\v #" + hyperlink + @"\v0}"; this.Select(position, text.Length + hyperlink.Length + 1); this.SetSelectionLink(true); this.Select(position + text.Length + hyperlink.Length + 1, 0); }
public void SetSelectionLink(bool link) { SetSelectionStyle(CFM_LINK, link ? CFE_LINK : 0); } public int GetSelectionLink() { return GetSelectionStyle(CFM_LINK, CFE_LINK); }
private void SetSelectionStyle(UInt32 mask, UInt32 effect) { CHARFORMAT2_STRUCT cf = new CHARFORMAT2_STRUCT(); cf.cbSize = (UInt32)Marshal.SizeOf(cf); cf.dwMask = mask; cf.dwEffects = effect;
IntPtr wpar = new IntPtr(SCF_SELECTION); IntPtr lpar = Marshal.AllocCoTaskMem(Marshal.SizeOf(cf)); Marshal.StructureToPtr(cf, lpar, false);
IntPtr res = SendMessage(Handle, EM_SETCHARFORMAT, wpar, lpar);
Marshal.FreeCoTaskMem(lpar); }
private int GetSelectionStyle(UInt32 mask, UInt32 effect) { CHARFORMAT2_STRUCT cf = new CHARFORMAT2_STRUCT(); cf.cbSize = (UInt32)Marshal.SizeOf(cf); cf.szFaceName = new char[32];
IntPtr wpar = new IntPtr(SCF_SELECTION); IntPtr lpar = Marshal.AllocCoTaskMem(Marshal.SizeOf(cf)); Marshal.StructureToPtr(cf, lpar, false);
IntPtr res = SendMessage(Handle, EM_GETCHARFORMAT, wpar, lpar);
cf = (CHARFORMAT2_STRUCT)Marshal.PtrToStructure(lpar, typeof(CHARFORMAT2_STRUCT));
int state; if ((cf.dwMask & mask) == mask) { if ((cf.dwEffects & effect) == effect) state = 1; else state = 0; } else { state = -1; }
Marshal.FreeCoTaskMem(lpar); return state; }
} } |