上网找了老半天,都是浪费时间,还有80分,如果想要的话,我可以都给,
问题是:在RichEdit中,怎样打开下面的连接,在OICQ中可以,只要点击就行,不用多说了吧,请您给我答案,最好使用代码实现
http://expert.csdn.net/Expert/PostNew.asp?room=5301

解决方案 »

  1.   

    TRxlib 已经帮你搞定了。而且可以加入图片的。到网上找个这个控件,多的是。
      

  2.   

    填充记录TCharFormat,发送消息改变文字外观如下:var
      CF:TCharFormat;
    begin
      FillChar(CF, SizeOf(CF), 0);
      CF.cbSize := SizeOf(CF);
      CF.dwMask := CFM_LINK;
      CF.dwEffects := CFE_LINK;
      SendMessage(RichEdit1.Handle, EM_SETCHARFORMAT,SCF_ALL,Integer(addr(CF)));
    end;
    通过子类化获取EM_SETEVENTMASK消息,lParam=ENM_LINK,处理鼠标事件
      

  3.   

    首先,上面的代码放在那里,怎么触发?
    其次,怎样子类化EM_SETEVENTMASK消息?
    再次,如何处理鼠标事件?
    我要是明白就不问了,请您详细解答,谢谢
      

  4.   

    写个简单的例子!  TRichEditEx = class(TRichEdit)
      protected
        procedure CNNotify(var Msg: TWMNotify); message CN_NOTIFY;
      public
        constructor Create(AOwner: TComponent); override;
      end;var
      Form1: TForm1;
      RichEditEx: TRichEditEx;procedure TRichEditEx.CNNotify(var Msg: TWMNotify);
    type
      PENLink=^TENLink;
    var
      TR: TTextRangeA;
    begin
    if (Msg.NMHdr.code = EN_LINK) and (PENLink(Msg.NMHdr).Msg = WM_LBUTTONUP) then
    begin
      TR.chrg := PENLink(Msg.NMHdr).chrg;
      GetMem(TR.lpStrText, TR.chrg.cpMax - TR.chrg.cpMin + 2);
      SendMessage(Handle, EM_GETTEXTRANGE, 0, Integer(addr(TR)));
      ShellExecute(Handle,nil,TR.lpStrText,nil,nil,0);
      FreeMem(TR.lpStrText);
    end;
    end;constructor TRichEditEx.Create(AOwner: TComponent);
    begin
      inherited;
      Self.Text:='http://www.csdn.net';
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      CF:TCharFormat;
    begin
      RichEditEx:=TRichEditEx.Create(Self);
      RichEditEx.Parent:=Self;
      FillChar(CF, SizeOf(CF), 0);
      CF.cbSize := SizeOf(CF);
      CF.dwMask := CFM_LINK;
      CF.dwEffects := CFE_LINK;
      SendMessage(RichEditEx.Handle, EM_SETCHARFORMAT,SCF_ALL,Integer(addr(CF)));
      SendMessage(RichEditEx.Handle, EM_SETEVENTMASK,0,ENM_LINK);
    end;
      

  5.   

    子类话无非是要让窗体获得RichEdit的消息,既然从RichEdit派生的新类中处理了消息,就不必用子类化来让窗体获得消息!发送消息EM_SETEVENTMASK给RichEdit,SendMessage(RichEditEx.Handle, EM_SETEVENTMASK,0,ENM_LINK);,这样一来当鼠标指针在文本上,而该文本又有 CFE_LINK属性,又发生了几种鼠标动作之一,就发送EN_LINK 通知通过获得消息 CN_NOTIFY后,通过NMHDR记录的code 成员来判断是否接收到EM_LINK通知,如果是将NMHdr强制转换为PENLink记录类型,通过PENLink(Msg.NMHdr).Msg = WM_LBUTTONUP判断具体的鼠标动作至于集合TCharFormat,消息EM_SETCHARFORMAT,EM_SETEVENTMASK的详细内容请查阅MSDN写了个例子,请参考:http://www.ehomsoft.com/test.rar
      

  6.   

    首先感谢您的热心解答,
    我对例子进行了简单的测试,问题如下
    1、只有在窗体建立后第一次点击超连接按钮时,可以找到超连接,如果在其中添加了文本或第二次点击时,无法找到超连接,
    2、我是相当鼠标移动到超连接上面时,自动显示可以上网的那种标志,就像QQ一样的,当然,如果第一条解决了,第二条可以实现,
    最后,我想在文本中编辑的不只是超连接,还有文本,和QQ很类似的那种,怎么说呢,你的解答给了我很多思路,可和我的想法还有距离。
      

  7.   

    我认为这已经够了
    RichEditEx.SelStart := 4;
    RichEditEx.SelLength := 19;注意这个?
    这是什么意思?那该怎么做呢?不用提示了吧?Pos('http://',Text)处理其他鼠标动作也就是处理其它消息
      

  8.   

    我认为这已经够了
    RichEditEx.SelStart := 4;
    RichEditEx.SelLength := 19;注意这个?
    这是什么意思?那该怎么做呢?不用提示了吧?Pos('http://',Text)处理其他鼠标动作也就是处理其它消息