我在一个基于对话框的MFC程序中,插入一个CRichEditCtrl编辑框控件,并在这个编辑框中实现超链接功能,即就像QQ聊天环境中当发送一个文件时出现 "寒积宣要发送给您文件“03.jpg(403KB)”,您是要接收,另存为还是谢绝该文件"这些文字,其中点"接收"或者"另存为"等就可以响应.我想问一下要实现这个功能是不是要用到CRichEditCtrl20这个版本的,我用VC++6.0可以实现吗?应该怎么实现呢,各位能不能帮我一哈,如果有原代码最好哈,若有请帮忙发一下好吗?.多谢!

解决方案 »

  1.   

    在RichEdit中实现超链接
    dqgcxy.whu.edu.cn 2005-5-13  电气工程学院研究生会
    102、在RichEdit中实现超链接 首先在Form上放置一个RichEdit。在窗体的构造函数中添加以下代码:__fastcall TMainForm::TMainForm(TComponent* Owner): TForm(Owner){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); //自动检测URLRichEdit1->Text = "欢迎访问C++ Builder\n""网址: http://www.ccrun.com\n""偶的信箱:\n""mailto::[email protected] \n""嘿嘿\n";}重载窗体的WndProc1。在.h中添加:protected:virtual void __fastcall WndProc(Messages::TMessage &Message);2。在.cpp中添加://---------------------------------------------------------------------------void __fastcall TMainForm::WndProc(Messages::TMessage &Message){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);}如何在RichEdit中实现上标下标 以下代码已测试通过。在Form中放置一个RichEdit,两个Button,完整代码如下://--------------------------------------------------------------------------- typedef enum{CFM_Superscript, // 上标CFM_Subscript, // 下标CFM_Normal // 普通文本}TCharacterFormat;void MySetCharFormat(TRichEdit *RichEdit, TCharacterFormat CharacterFormat){// ccrun(老妖)根据Delphi超级猛料中的资料修改而成// 欢迎光临 C++ Builder 研究 http://www.ccrun.comTCharFormat Format;Format.cbSize = sizeof(Format);Format.dwMask = CFM_OFFSET;// Character offset, in twips, from the baseline.// If the value of this member is positive,// the character is a superscript;// if it is negative, the character is a subscript.switch(CharacterFormat){case CFM_Superscript:Format.yOffset = 60;break;case CFM_Subscript:Format.yOffset = -60;break;case CFM_Normal:Format.yOffset = 0;break;default:break;}// The EM_SETCHARFORMAT message sets character formatting in a rich edit control.// SCF_SELECTION: Applies the formatting to the current selectionRichEdit->Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(&Format));}//---------------------------------------------------------------------------// 先选中Richedit中的部分文本,然后点击此按钮,选中文本将变成上标void __fastcall TForm1::Button1Click(TObject *Sender){// 上标MySetCharFormat(RichEdit1, CFM_Superscript);}//---------------------------------------------------------------------------// 先选中Richedit中的部分文本,然后点击此按钮,选中文本将变成下标void __fastcall TForm1::Button2Click(TObject *Sender){// 下标MySetCharFormat(RichEdit1, CFM_Subscript);}
      

  2.   

    1.  LoadLibrary(_T("Riched20.dll"));
    2. 
    创建RichEdit2.0控件
     CreateEx(0, _T("RichEdit20A"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP
    |ES_READONLY|ES_WANTRETURN|ES_MULTILINE,
              rect.left, rect.top, cx, cy,
      pParentWnd->m_hWnd, (HMENU)nID, NULL);
    3. 设定选中的文字为链接显示
    CHARFORMAT2 cf2;
    ZeroMemory(&cf2, sizeof(CHARFORMAT2));//
    cf2.cbSize = sizeof(CHARFORMAT2);
    cf2.dwMask = CFM_LINK;
    cf2.dwEffects |= CFE_LINK;
    m_cRichEdit.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);
    4.支持链接的点击响应
    m_cRichEdit.SetEventMask(ENM_LINK);
    5.响应链接的点击EN_LINKBEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)
    //{{AFX_MSG_MAP(CChatEdit)
    //}}AFX_MSG_MAP
    ON_NOTIFY_REFLECT(EN_LINK,OnURL)
    END_MESSAGE_MAP()
    ......void CMyRichEdit::OnURLClick(NMHDR *pNmhdr, LRESULT *pResult)
    {
    TCHAR LinkChar[512];
    ENLINK *pLink = (ENLINK *)pNmhdr;
    if (pLink->msg == WM_LBUTTONUP)
    {
    SetSel(penLink->chrg);//这是链接的文字范围
    long Res = GetSelText((char *)LinkChar);//这是链接文字
                      //后面是你的处理过程
                      ......
             }
    }
      

  3.   

    多谢goodboyws(深夜不眠者),我按照你的方法已经成功了.但现在还有一个问题,就是好像CRichEditCtrl里面一次只能设置一个选中文字的区域,比如说"寒积宣要发送给您文件“03.jpg(403KB)”,您是要接收,另存为还是谢绝该文件"这句话里面,想让"接收"和"另存为"和"谢绝"都能被选中而进行超链接响应,但只能一次选中一个,有没有什么办法实现这样的功能呢?不好意思我稍后就给你们加分!希望还有大侠来帮帮我!