RichEdit一问。比较困难的问题。请各位老大帮忙看看。

pp616 2003-05-11 09:39:10
如何使richedit中的文字具有CFE_LINK属性。

我需需要做到在RichEdit中加入一段文字如“你好”然后启动鼠标到"你好"两个字上鼠标就自动变成了手。
就象执行如下代码后在RichEdit中加如超连接的效果一样
if(SendMessage(RichEdit1->Handle,EM_AUTOURLDETECT,TRUE,0)==0)
{
SendMessage(RichEdit1->Handle,EM_SETEVENTMASK,0,ENM_LINK|SendMessage(RichEdit1->Handle,EM_GETEVENTMASK,0,0));
}
现在我想不是超连接也需要达到超连接的功能。
请各位老大帮忙。
...全文
63 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
anetfish 2003-05-25
  • 打赏
  • 举报
回复
gz
neelee 2003-05-25
  • 打赏
  • 举报
回复
M
sprewellkobe 2003-05-25
  • 打赏
  • 举报
回复
凶宝宝是你吧,名字变的太快
sprewellkobe 2003-05-25
  • 打赏
  • 举报
回复
to:傻小子

我实现了这个功能,给我写信,我把代码给你

sprewellkobe@163.com
sprewellkobe 2003-05-13
  • 打赏
  • 举报
回复
我是用spy++跟踪你说的软件,得到的
EM是对应与WM的消息

你向一个EditControl的派生发了这条消息,lParam是当然所指的字符的Index,wParam就得到了
它所在的在EditControl中的坐标

但它还用到了一个消息,EM_GETRECT,我也不太清楚这用在这是什么意思

但能看出它的整个处理是放在MouseMove的消息里的,

EditControl的Cursor是根据MouseMove的结果来变化的,如果发现是用户名或LINK就变为手
BCB 2003-05-13
  • 打赏
  • 举报
回复
我为何试不起来,我想在 http://www...先出现下划表表示http链接,
楼主的代码为何试不起来
gz
Friecin 2003-05-13
  • 打赏
  • 举报
回复
严重关注!

UP!UP!UP!
kataboy 2003-05-13
  • 打赏
  • 举报
回复
我只能帮你up了。
pp616 2003-05-13
  • 打赏
  • 举报
回复
我对EM_POSFROMCHAR等消息不熟悉。能否详细解释一下。或是一些例子
pp616 2003-05-12
  • 打赏
  • 举报
回复
自己重Tpanel继承一个新的控件啊。然后自己来处理消息。
或是直接替换TPanel的WindowProc
Friecin 2003-05-12
  • 打赏
  • 举报
回复
to pp616(傻小子)

怎么搞?帮我研究一下!
sprewellkobe 2003-05-12
  • 打赏
  • 举报
回复
格式不一样,WORD还能识别LINK呢,

RTF的可能就没有这功能,我觉得
BCB 2003-05-12
  • 打赏
  • 举报
回复
GZ
formail的文本中能自动识别http://www...
怎么实现的
chifengwatch 2003-05-12
  • 打赏
  • 举报
回复
up
NowCan 2003-05-12
  • 打赏
  • 举报
回复
哦,不对,题意理解错了。
NowCan 2003-05-12
  • 打赏
  • 举报
回复
我看过这个东西,不过没有试验过。
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TRichEdit *RichEdit1;
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
void MyMessage(TMessage &myMsg);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_NOTIFY,TMessage,MyMessage);//加一个消息映射
END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
cpp没有改的:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(SendMessage(RichEdit1->Handle, // handle to destination window
EM_AUTOURLDETECT, // message to send
TRUE, // not used; must be zero
0 // not used; must be zero
)==0)
Caption="ok1";
SendMessage(RichEdit1->Handle,EM_SETEVENTMASK ,0,ENM_LINK|SendMessage(RichEdit1->Handle,EM_GETEVENTMASK,0,0));
RichEdit1->Lines->Add("http://www.csdn.net");
}
//---------------------------------------------------------------------------
void TForm1::MyMessage(TMessage &myMsg)
{
LPNMHDR lpNmhdr = (LPNMHDR)myMsg.LParam;
if (lpNmhdr->code==EN_LINK)
{
ENLINK* lpENLink = ( ENLINK* )lpNmhdr ;
if (lpENLink->msg == WM_LBUTTONDOWN)
{
RichEdit1->SelStart=lpENLink->chrg.cpMin;
RichEdit1->SelLength=lpENLink->chrg.cpMax-lpENLink->chrg.cpMin;

ShellExecute(Handle,"Open",RichEdit1->SelText.c_str(),0,0,SW_SHOW);

}
}
}


http://asp.6to23.com/nowcan/csdn/BCB_frame.htm
sprewellkobe 2003-05-12
  • 打赏
  • 举报
回复
pp616(傻小子) :

跟踪了一下:
原来它向RE发了一个EM_POSFROMCHAR的消息,

wCharIndex
Value of lParam. Specifies the zero-based index of the character.

这样就获得了词的开头

它还用到了一个EM_GETRECT,我还不太清楚这是怎么使的

但大概原理搞清楚了,每当MOUSEMOVE的时候它就进行词判断,只要是比如LINK类的关键字,它就发WM_SETCURSOR变为手形状
如果不是就也发WM_SETCUROSR变回来

我原来一直在猜它是怎么能将RE的一部分面积的CURSOR变了,原来它是一直在变,只不过箭头的时候多罢了

可以结帐了吧
sprewellkobe 2003-05-12
  • 打赏
  • 举报
回复
看了,是实现了,

分析中...
pp616 2003-05-12
  • 打赏
  • 举报
回复
http://download.enet.com.cn/file/network/comm/2001062506.shtml
“263聊天跑车”它已经实现了我说的功能,证明是完全可以实现的。
请大家去看看。
pp616 2003-05-11
  • 打赏
  • 举报
回复
可以的.不需要是Form。
WM_NOTIFY消息是发送到RichEdit的parent窗口上的。所以如果要放到Panel上。你需要自己来处理Panel的消息。就可以收到WM_NOTIFY消息了。
加载更多回复(3)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧