| 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;
 }
 
 }
 }
 |