如何在Rich Edit Control中管理超链接

2023-11-18

如何在Rich Edit Control中管理超链接


 一、在Rich Edit Control 中显示超链接

在Rich Edit Control 中显示超链接的格式,也就是给选择的文本添加CFE_LINK属性,可以通过以下两种方法实现:

 1、 自动检测超链接

Rich Edit Control本身具有URL检测功能,可以自动识别满足要求的URL文本,并自动为该文本添加CFE_LINK属性,也就显示为超链接格式,目前控件可以检测以下前缀的URL文本:

http:  file:  mailto:  ftp:  https:  gopher: nntp:  prospero:  telnet:  news:  wais: 

(1)打开自动检测

CWnd  * pRE  =  GetDlgItem(IDC_RICHEDIT1);
pRE
-> SendMessage(EM_AUTOURLDETECT, TRUE,  0 );

(2)关闭自动检测

CWnd  * pRE  =  GetDlgItem(IDC_RICHEDIT1);
pRE
-> SendMessage(EM_AUTOURLDETECT, FALSE,  0 );

(3)判断当前自动检测是否打开

BOOL bEnable  =  pRE -> SendMessage(EM_GETAUTOURLDETECT,  0 0 );

2、 手动设置文本为超链接格式

如果不打开rich edit control的URL检测功能,我们可以手工对感兴趣的文本设置CFE_LINK属性,从而使其显示为超链接格式。

(1)设置CFE_LINK

CWnd  * pRE  =  GetDlgItem(IDC_RICHEDIT1);
CHARFORMAT2   cf; 

ZeroMemory(
& cf,  sizeof (CHARFORMAT2));
cf.cbSize 
=   sizeof (CHARFORMAT2); 
cf.dwMask 
=  CFM_LINK; 
cf.dwEffects 
|=  CFE_LINK; 
pRE
-> SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) & cf);

(2)去除CFE_LINK

CWnd  * pRE  =  GetDlgItem(IDC_RICHEDIT1);
CHARFORMAT2   cf; 

ZeroMemory(
& cf,  sizeof (CHARFORMAT2));
cf.cbSize 
=   sizeof (CHARFORMAT2);
cf.dwMask 
=  CFM_LINK; 
cf.dwEffects 
&=   ~ CFE_LINK; 
pRE
-> SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) & cf);

二、处理超链接事件(EN_LINK)

      使用以上方法我们已经可以通过自动或手动显示一个超链接,接着我们需要做的是处理超链接的事件(WM_SETCURSOR、WM_MOUSEMOVE、WM_RBUTTONDOWN、WM_RBUTTONUP、WM_RBUTTONDBCLK、WM_LBUTTONDOWN、WM_LBUTTONUP、WM_LBUTTONDBCLK),所有这些都通过由Rich Edit Control 发送的EN_LINK消息通知父窗口,父窗口可以在WM_NOTIFY中接收到EN_LINK消息。具体实现如下:

1、通知Rich Edit Control 发送EN_LINK消息,默认情况下是不发送的,在初始化控件时添加:

CWnd  * pRE  =  GetDlgItem(IDC_RICHEDIT1);
DWORD dwMask 
=  pRE ->  SendMessage(EM_GETEVENTMASK,  0L 0L );
dwMask 
|=  ENM_LINK;
pRE
->  SendMessage(EM_SETEVENTMASK,  0L , (LPARAM)dwMask);

2、在WM_NOTIFY消息中处理EN_LINK。

NMHDR  * =  (NMHDR  * )lParam;
 
if  (p -> code  ==  EN_LINK)  ... {
      ENLINK 
*pLink = (ENLINK *)lParam;
  
switch(pLink->msg) ...{
      
case WM_LBUTTONDOWN: 
            
//鼠标左键按下
            break;
      
case WM_LBUTTONUP: 
      
...{//鼠标左键松开
            char strBuf[512];
            CWnd 
*pRE = GetDlgItem(IDC_RICHEDIT1);
            pRE
->SendMessage(EM_EXSETSEL, 0, (LPARAM)&(pLink->chrg));
            pRE
->SendMessage(EM_GETSELTEXT, 0, (LPARAM)strBuf);
            ::ShellExecute(NULL, _T(
"open"), _T("iexplore"), strBuf, NULL, SW_SHOWNORMAL);
            
break;
      }

      
default:
            
break;
      }

}


 三、超链接对应的操作

      通过前边介绍的方法,我们可以得到两种超链接,一种是打开URL自动检测时控件自动显示的,通常只需要用iexplore打开即可,例如打开一个网页、发送一封邮件、打开一个窗口等等;另一种是手动添加的,我们可能会需要对每个超链接执行不同的操作,问题是如何区分不同的超链接呢?这是我们接下来要讨论的问题。
      区分超链接首先想到的是可以根据文本来区分,不同文本对应不同操作,这就需要在超链接HyperLinkText和操作Action之间建立一个映射,我们可以在添加超链接HyperLinkText时用CMap来保存<HyperLinkText, Action>,利用这个map就可以很方便知道那个超链接进行那个操作。另外对于系统自动识别的URL,我们并没有保存映射,就可以通过iexplore进行默认操作:

Action  =  map[HyperLinkText];
if  (Action  ==  Action1)  ... {
      
//Action1
}
  else   if  (Action  ==  Action2)  ... {
      
//Action2
}
  else   ... {
      
//其他URL,使用iexplore打开
}

      对于一些简单的操作这种方法确实可以满足要求了,但是如果出现多个相同文本的超链接,而且这些超链接对应的操作又不同,该如何区分呢?很显然仅通过文本已经无法唯一确定了,必须经过其他的特征帮助区分,在这里我使用了超链接文本的开始位置,就是CHARRANGE中的cpMin,这个位置在文本中是唯一的,在添加超文本时把<cpMin, Action>做一个映射保存在CMap中,这样当我们点击一个超链接时可以通过每个文本的开始位置cpMin找到Action,从而进行相应的操作:

Action  =  map[cpMin];
if  (Action  ==  Action1)  ... {
      
//Action1
}
  else   if  (Action  ==  Action2)  ... {
      
//Action2
}
  else   ... {
      
//其他URL,使用iexplore打开
}

 现在我们已经可以准确控制每个超链接的操作了。如果你需要保存更多信息,可以把<cpMin, Action>中的Action用一个结构来代替<cpMin, HyperLink>,例如:

typedef  struct  _HyperLink  ... {
      WORD  Action; 
      DWORD dwId;
}
 HyperLink;

 下载源代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Rich Edit Control中管理超链接 的相关文章

随机推荐

  • python写出梯度下降的代码

    以下是一个使用Python实现的基本梯度下降 Gradient Descent 算法的示例 导入必要的库 import numpy as np import matplotlib pyplot as plt 定义损失函数 def compu
  • seq2seq模型

    转载自 http blog csdn net sunlylorn article details 50607376
  • k--最近邻算法(KNN)

    目录 一 简介 二 举例理解 三 算法步骤 四 其他说明 1 关于距离的计算 2 超参数 3 关于K值的选择 4 取K值的方法 5 关于决策依据 6 优缺点 五 代码 一 简介 邻近算法 KNN 是数据挖掘分类技术最简单的方法之一 所谓K最
  • Asp.net_Study学习笔记

    Asp net Study web基本原理 浏览器向服务器发送请求 服务器响应 报错 HTTP Error 403 14 Forbidden Web 服务器被配置为不列出此目录的内容 解决 打开控制面板里的程序 点击启用或关闭Windows
  • Matlab实现Kmeans算法(每行代码标注详细注解)

    本文主要为了完成平日作业 并进一步加深对算法的理解 也希望对来访的读者有所帮助 该算法的优化Kmean 算法的代码详解已在其他文章给出 Matlab实现Kmeans 算法 每行代码标注详细注解 高垚淼的博客 CSDN博客 Matlab实现B
  • ESD静电放电最常用的三种模型及其防护设计

    推荐好文 建议直接看链接 1 静电放电最常用的三种模型及其防护设计 http www 360doc com content 17 0827 14 32066980 682502209 shtml 人体模型HBM 机器模型MM 充电器件模型C
  • LA@齐次线性方程组解的结构

    文章目录 齐次线性方程组解的结构 解的性质 齐次线性方程组的解的线性组合还是方程组的解 基础解系 通解 定理 齐次线性方程组基础解系存在定理 齐次线性方程组的基础解系包含的向量个数 秩 应用和示例 推论1 推论2 推论3 转置矩阵对的乘积秩
  • 解决jar文件不显示图标问题

    版权声明 本文为转载文章 遵循 CC 4 0 BY SA 版权协议 本文链接 https blog csdn net qyfx123456 article details 104713149 一 问题的产生 最近 重新装了JDK 配置了环境
  • 生命在于学习——Socket编程(偏安全方面)

    本篇文章仅用于学习记录和交流 不得用于其他违规用途 产生的不良后果 自己负责 一 Socket介绍 首先socket 套接字 是工作在应用层和传输层之间一个抽像层 为什么要有他呢 虽然我们已经有了ip port可以和世界上任意一台计算机上的
  • 扫雷游戏是一款十分经典的单机小游戏。 问题 H: 扫雷游戏

    题目描述 扫雷游戏是一款十分经典的单机小游戏 在n行m列的雷区中有一些格子含有地雷 称之为地雷格 其他格子不含地雷 称之为非地雷格 玩家翻开一个非地雷格时 该格将会出现一个数字 提示周围格子中有多少个是地雷格 游戏的目标是在不翻出任何地雷格
  • axios封装(例如:请求头、token、超时、BaseUrl、请求错误、请求重复)

    axios封装 文章目录 axios封装 前言 1 为什么封装Axios 2 包括的功能 一 Axios是什么 二 安装 Axios 1 安装axios JavaScript版本 2 安装axios TypeScript版本 三 封装 Ax
  • 关于 forza horizon 4 极限竞速地平线4 进游戏没声音 看见车没声音问题 的解决方案 (可能是微星的锅)

    这个问题可能是我微星笔记本的问题 型号GS63 7RE 018n 这个机器有个独立声卡 有个单独的sb软件 地平线4用蓝牙音箱的特殊问题 如果音箱有麦克风 声音就崩了 我用的bose soundlink 我用线从电脑上接出来 结果进了游戏就
  • QT线程池实验研究与分析(QThread与和QThreadPool + QRunnable使用上的区别)

    第一部分 QT线程池的构建与使用 网上关于QT线程池QThreadPool的文章很多 而且大都千篇一律 基本上都是参考QT的帮助文档介绍QT全局线程池的用法 这样就往往会使人产生误解 QT是不是推荐大家使用其全局线程池 而不推荐使用自定义构
  • Docker客户端连接Docker Daemon的方式

    Docker为C S架构 服务端为docker daemon 客户端为docker service 支持本地unix socket域套接字通信与远程socket通信 默认为本地unix socket通信 要支持远程客户端访问需要做如下设置
  • Linux下DM644x设备驱动I2C之总线驱动(一)详解

    本文均属自己阅读源码的点滴总结 转账请注明出处谢谢 欢迎和大家交流 qq 1037701636 email 200803090209 zjut com gzzaigcn2012 gmail com linux DM6441下I2C设备驱动的
  • 融云深度参与「新加坡 GTLC 大会」,连接亚太机遇、开拓国际市场

    8 月 18 日 由 TGO 鲲鹏会主办的新加坡 GTLC Global Tech Leadership Conference 全球技术领导力大会 圆满收官 融云作为共创伙伴深度参与了大会 关注 融云全球互联网通信云 了解更多 本次大会以
  • centos7.9安装postgresql12

    目录 1 下载安装包 2 安装 首先登陆官方网站下载 PostgreSQL Downloads 1 下载安装包 按照官方的命令安装 下载PGSQL的rpm包 sudo yum install y https download postgre
  • 社会经济学中的因果分析思想初探

    社会经济学中的因果分析思想初探 目录 1 因果是什么 2 因果关系和相关关系 3 因果推断的三个层级 4 经典因果推断模型 5 社会经济学中的因果实证分析 5 1随机控制实验 5 2自然实验 5 3准实验 5 3 1准实验 双重差分法 5
  • 基于STC8G1K08A的可调节占空比和频率的PWM应用案例

    基于STC8G的可调节占空比和频率的PWM应用案例 CSDN的小白分享 前言 一 STC8G系列的介绍 二 使用记录 1 建立工程 2 打开工程所需的芯片功能 及本人的函数 总结 CSDN的小白分享 前言 学习单片机以来 都是写了就算的态度
  • 如何在Rich Edit Control中管理超链接

    如何在Rich Edit Control中管理超链接 一 在Rich Edit Control 中显示超链接 在Rich Edit Control 中显示超链接的格式 也就是给选择的文本添加CFE LINK属性 可以通过以下两种方法实现 1