richtextbox控件插入链接代码分享

代码如下:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace RichTextBoxLinks
{
 public 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; // Color.ToArgb() -> int
   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;  /* Superscript and subscript are */
  private const UInt32 CFE_SUPERSCRIPT= 0x00020000;  /*  mutually exclusive    */

private const int CFM_SMALLCAPS  = 0x0040;   /* (*) */
  private const int CFM_ALLCAPS  = 0x0080;   /* Displayed by 3.0 */
  private const int CFM_HIDDEN  = 0x0100;   /* Hidden by 3.0 */
  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;  /* Many displayed by 3.0 */
  private const int CFM_WEIGHT  = 0x00400000;
  private const int CFM_SPACING  = 0x00200000;  /* Displayed by 3.0 */
  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; /* (*) displayed as ordinary underline */
  private const byte CFU_UNDERLINEDOUBLE  = 0x00000003; /* (*) displayed as ordinary underline */
  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; /* (*) displayed as ordinary underline */

#endregion

#endregion

public RichTextBoxEx()
  {
   // Otherwise, non-standard links get lost when user starts typing
   // next to a non-standard link
   this.DetectUrls = false;
  }

[DefaultValue(false)]
  public new bool DetectUrls
  {
   get { return base.DetectUrls; }
   set { base.DetectUrls = value; }
  }

/// <summary>
  /// Insert a given text as a link into the RichTextBox at the current insert position.
  /// </summary>
  /// <param name="text">Text to be inserted</param>
  public void InsertLink(string text)
  {
   InsertLink(text, this.SelectionStart);
  }

/// <summary>
  /// Insert a given text at a given position as a link.
  /// </summary>
  /// <param name="text">Text to be inserted</param>
  /// <param name="position">Insert position</param>
  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);
  }

/// <summary>
  /// Insert a given text at at the current input position as a link.
  /// The link text is followed by a hash (#) and the given hyperlink text, both of
  /// them invisible.
  /// When clicked on, the whole link text and hyperlink string are given in the
  /// LinkClickedEventArgs.
  /// </summary>
  /// <param name="text">Text to be inserted</param>
  /// <param name="hyperlink">Invisible hyperlink string to be inserted</param>
  public void InsertLink(string text, string hyperlink)
  {
   InsertLink(text, hyperlink, this.SelectionStart);
  }

/// <summary>
  /// Insert a given text at a given position as a link. The link text is followed by
  /// a hash (#) and the given hyperlink text, both of them invisible.
  /// When clicked on, the whole link text and hyperlink string are given in the
  /// LinkClickedEventArgs.
  /// </summary>
  /// <param name="text">Text to be inserted</param>
  /// <param name="hyperlink">Invisible hyperlink string to be inserted</param>
  /// <param name="position">Insert position</param>
  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);
  }

/// <summary>
  /// Set the current selection's link style
  /// </summary>
  /// <param name="link">true: set link style, false: clear link style</param>
  public void SetSelectionLink(bool link)
  {
   SetSelectionStyle(CFM_LINK, link ? CFE_LINK : 0);
  }
  /// <summary>
  /// Get the link style for the current selection
  /// </summary>
  /// <returns>0: link style not set, 1: link style set, -1: mixed</returns>
  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;
   // dwMask holds the information which properties are consistent throughout the selection:
   if ((cf.dwMask & mask) == mask)
   {
    if ((cf.dwEffects & effect) == effect)
     state = 1;
    else
     state = 0;
   }
   else
   {
    state = -1;
   }

Marshal.FreeCoTaskMem(lpar);
   return state;
  }
 }
}

(0)

相关推荐

  • C#在RichTextBox中显示不同颜色文字的方法

    本文实例讲述了C#在RichTextBox中显示不同颜色文字的方法.分享给大家供大家参考.具体实现方法如下: #region 日志记录.支持其他线程访问 public delegate void LogAppendDelegate(Color color, string text); /// <summary> /// 追加显示文本 /// </summary> /// <param name="color">文本颜色</param> /

  • RichTextBox 显示图片和word的代码

    显示图像: 复制代码 代码如下: Image img = Image.FromFile( @"E:\image\bottle\2006122013203825344.jpg" );           Clipboard.SetDataObject( img );           RichTextBox.Paste( DataFormats.GetFormat( DataFormats.Bitmap ) );显示wordstring filename = @"d:\随笔.

  • C# Winform使用扩展方法实现自定义富文本框(RichTextBox)字体颜色

    在利用C#开发Winform应用程序的时候,我们有可能使用RichTextBox来实现实时显示应用程序日志的功能,日志又分为:一般消息,警告提示和错误等类别.为了更好地区分不同类型的日志,我们需要使用不同的颜色来输出对应的日志,比如:一般消息为绿色,警告提示的用橙色,错误的用红色字体. 在原生Winform的RichTextBox中,是没有这种设置选项的.如需实现以上描述的功能,我们可以使用.NET的静态扩展方法来处理.实现扩展方法的类和方法本身都必须是静态的,如果你对扩展方法还不是太了解,建议

  • asp.net richTextBox中高亮显示选中字符串或文本

    实例验证如下: 复制代码 代码如下: private void 突出显示(string 要查找字符串) { //首先找到要查找字符串的起始位置 int 开始位置=richTextBox短语显示.Find(要查找字符串); //判断一下是否找到,如果找不到那么开始位置是-1 if (开始位置>=0) { richTextBox短语显示.SelectionStart = 开始位置; //得到字符串的长度 richTextBox短语显示.SelectionLength = 要查找字符串.Length;

  • C#实现winform中RichTextBox在指定光标位置插入图片的方法

    本文实例讲述了C#实现winform中RichTextBox在指定光标位置插入图片的方法.分享给大家供大家参考,具体如下: //获取RichTextBox控件中鼠标焦点的索引位置 int startPosition = this.richTextBox1.SelectionStart; //从鼠标焦点处开始选中几个字符 this.richTextBox1.SelectionLength = 2; //清空剪切板,防止里面之前有内容 Clipboard.Clear(); //给剪切板设置图片对象

  • C#中richtextbox使用方法详解

    C#中RichTextBox使用方法和TextBox基本一样,只不过RichText除了TXT外,还支持RTF格式的文档.本文详细介绍RichTextBox的使用方法供大家参考,具体如下: 一.RichTextBox的使用方法 RichTextBox.Find方法 RichTextBox控件不仅允许输入和编辑文本,同时还提供了标准 TextBox 控件未具有的.更高级的指定格式的许多功能. 语法:RichTextBox 说明: RichTextBox 提供了一些属性,对于本控件文本的任何部分,用

  • richtextbox控件插入链接代码分享

    复制代码 代码如下: using System;using System.ComponentModel;using System.Drawing;using System.Windows.Forms;using System.Runtime.InteropServices; namespace RichTextBoxLinks{ public class RichTextBoxEx : RichTextBox {  #region Interop-Defines  [ StructLayout(

  • asp.net微软图表控件使用示例代码分享

    复制代码 代码如下: <configuration>  <system.webServer>    <handlers>      <remove name="ChartImageHandler" />      <add name="ChartImageHandler" preCondition="integratedMode" verb="GET,HEAD,POST" 

  • JavaScript实现的可变动态数字键盘控件方式实例代码

    整理文档,搜刮出一个JavaScript实现的可变动态数字键盘控件方式实例代码,稍微整理精简一下做下分享. @sunRainAmazing JavaScript编写和实现的可变动态键盘密码输入控件,可以动态的生产数字键盘并显示,并且可以实现每次点击后密码键盘重新加载,可以手动刷新功能. 第一种方式,点击查看: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&qu

  • 设置点击文本框或图片弹出日历控件的实现代码

    <input id="startDate" value="" readonly="true" type="text" style="cursor: pointer" class="user_datepicker "> <input class="canlderImg" data-tag="start" type="ima

  • C#实现两个richtextbox控件滚动条同步滚动的简单方法

    前言 有时候我们需要实现对照文章等,往往将文本放到两个richtextbox控件中,但是,如果我们需要同步滚动查看,来达到更好的观看效果. 当然,传统的方法重载控件或者自定义控件都可以达到目的,但是对于新手或者想仅仅只用一次这个控件的人来说,是非常麻烦的.所以,接下来我来提供一种简单快捷的方法来实现:richtextbox滚动条同步的功能. 方法如下: 首先,我们在winform窗体创建两个richtextbox控件 下面介绍两个方法,我经常用到 第一个方法,获得当前鼠标所在richtextbo

  • Android实现字母导航控件的示例代码

    目录 自定义属性 Measure测量 坐标计算 绘制 Touch事件处理 数据组装 显示效果 今天分享一个以前实现的通讯录字母导航控件,下面自定义一个类似通讯录的字母导航 View,可以知道需要自定义的几个要素,如绘制字母指示器.绘制文字.触摸监听.坐标计算等,自定义完成之后能够达到的功能如下: 完成列表数据与字母之间的相互联动; 支持布局文件属性配置; 在布局文件中能够配置相关属性,如字母颜色.字母字体大小.字母指示器颜色等属性. 主要内容如下: 自定义属性 Measure测量 坐标计算 绘制

  • javascript 获取所有id中包含某关键字的控件的实现代码

    //获取某容器控件中id包含某字符串的控件id列表 //参数:容器控件.要查找的控件的id关键字.要查找的控件的标签名称 //返回值:查找到的控件id列表字符串,以逗号分割. 复制代码 代码如下: function GetIdListBySubKey(container,subKey,TagName) { var idList = ""; for(var i = 0; i < container.childNodes.length;i++) { if(container.chil

  • 使用VS2010 C#开发ActiveX控件(下),完整代码打包下载

    其实如果我们不进行设置,只是修改了代码,运行程序以后,其出错界面如下图1所示: 图1 抛出异常如下: ************** Exception Text ************** System.MethodAccessException: Attempt by security transparent method 'Rare.Card.Libary.Controls. ReadCardControl.btnRead_Click(System.Object, System.Event

  • C#中ListView控件实现窗体代码

    废话不多说了,直接给大家贴关键代码了. 具体代码如下所示: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namesp

  • vue用递归组件写树形控件的实例代码

    最近在vue项目中遇到需要用树形控件的部分,比如导航目录是不确定的,所以必须要用树形结构,不管导航目录有几级,都可以自动显示出来,我一开始觉得element-ui有树形控件,不需要自己写,调用就可以了,后来才发现,调用完事之后,样式不可控,而且要加东西特别困难,无法满足项目需求,于是,一首<凉凉>送给自己,后来去翻vue官网,发现居然有递归组件,一开始我写了两个组件,互相调用,可以写出来,后来返现,如果项目要用到5棵树,我要写10个组件,而且样式控制起来超级恶心,于是我就各种查资料,原生的也试

随机推荐