高手请进:有关于Richedit 中URL 加亮的系统消息。。。

Friecin 2002-09-25 09:24:51
以下代码将RichEdit中的URL加亮显示(参见MSDN RichEdit Res):

if(SendMessage(RichEditContent->Handle, EM_AUTOURLDETECT, // message to send
TRUE, // not used; must be zero
0 // not used; must be zero
)==0);
SendMessage(RichEditContent->Handle,EM_SETEVENTMASK ,0,
ENM_LINK|SendMessage(RichEditContent->Handle,EM_GETEVENTMASK,0,0));

当将URL加亮后,如何拦截单击加亮对象(URL)的消息?

有关MSDN的解释是产生EN_LINK消息,但是用下面的代码却不能拦截:

void __fastcall TfrmEdit::WndProc(TMessage &myMsg)
{
TForm::WndProc(myMsg);
LPNMHDR lpNmhdr = (LPNMHDR)myMsg.LParam;
if (lpNmhdr->code==EN_LINK)
{
ENLINK* lpENLink = ( ENLINK* )lpNmhdr ;
if (lpENLink->msg == WM_LBUTTONDOWN)
{
RichEditContent->SelStart=lpENLink->chrg.cpMin;
RichEditContent->SelLength=lpENLink->chrg.cpMax-lpENLink->chrg.cpMin;
ShellExecute(Handle,"Open",RichEditContent->SelText.c_str(),0,0,SW_SHOW);
}
}
}

各位高手,URL加亮后到底单击到底会产生什么消息?
...全文
40 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Friecin 2003-05-09
  • 打赏
  • 举报
回复
搞不定!难道parent是panel就真的不行?
zzhong2 2003-05-08
  • 打赏
  • 举报
回复
回复人: amazon001(heroIII)

我找到了一个例子,可以用的,参考一下吧。

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Caption=Application->Title;
unsigned mask=SendMessage(RichEdit1->Handle,EM_GETEVENTMASK,0,0);
SendMessage(RichEdit1->Handle,EM_SETEVENTMASK,0,mask|ENM_LINK);
SendMessage(RichEdit1->Handle,EM_AUTOURLDETECT,true,0);
RichEdit1->Lines->Add("Welcome to local host:");
RichEdit1->Lines->Add("Http://localhost");
RichEdit1->Lines->Add("Welcome to CSDN:");
RichEdit1->Lines->Add("Http://www.csdn.net");
}
//---------------------------------------------------------------------------


void __fastcall TForm1::WndProc(Messages::TMessage & Message)
{
//TODO: Add your source code here
if(Message.Msg==WM_NOTIFY)
{
if (((LPNMHDR)Message.LParam)->code==EN_LINK)
{
ENLINK * p =(ENLINK *)Message.LParam;
if(p->msg==WM_LBUTTONDOWN)
{
SendMessage(RichEdit1->Handle,EM_EXSETSEL,0,(LPARAM)&(p->chrg));
ShellExecute(Handle,"open",RichEdit1->SelText.c_str(),0,0,SW_SHOWNORMAL);

}
}
}
TForm::WndProc(Message);
}




回复人: NowCan(能量、激情、雨水、彩虹——雷雨云)

朋友们:只要在窗体上放个Panel1,把RichEdit1放到Panel1上,

上面的所有方法都失灵!

我估计是消息发到了Panel上,改一下Panel的消息处理应该可以的。


回复人: zzhong2()
你看看这一贴吧,也许会有用
http://expert.csdn.net/Expert/topic/1242/1242545.xml?temp=.6067469
zzhong2 2003-05-08
  • 打赏
  • 举报
回复
回复人: invalid(空心菜)

老大,我测试通过:
头文件:

#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);

}
}
}



Friecin 2003-05-08
  • 打赏
  • 举报
回复
??????

有么有人知道??
Friecin 2002-09-28
  • 打赏
  • 举报
回复
我知道方法,但是不知道如何声明要拦截的是什么消息!

void __fastcall TfrmEdit::WndProc(TMessage &myMsg)
{
TForm::WndProc(myMsg);
LPNMHDR lpNmhdr = (LPNMHDR)myMsg.LParam;
if (lpNmhdr->code==EN_LINK)
{
ENLINK* lpENLink = ( ENLINK* )lpNmhdr ;
if (lpENLink->msg == WM_LBUTTONDOWN)
{
RichEditContent->SelStart=lpENLink->chrg.cpMin;
RichEditContent->SelLength=lpENLink->chrg.cpMax-lpENLink->chrg.cpMin;
ShellExecute(Handle,"Open",RichEditContent->SelText.c_str(),0,0,SW_SHOW);
}
}
}

myMsg到底是什么消息?
Lo 2002-09-26
  • 打赏
  • 举报
回复
http://www.csdn.net/expert/topic/649/649958.xml?temp=.9835932
这里有答案

13,825

社区成员

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

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