SOUI官方论坛

 找回密码
 立即注册
查看: 1946|回复: 4

SRichEdit问题?

[复制链接]
  • TA的每日心情

    2021-1-7 17:27
  • 签到天数: 86 天

    [LV.6]常住居民II

    2

    主题

    33

    帖子

    279

    积分

    22:00筑基期

    Rank: 1

    积分
    279
    发表于 2020-6-11 12:11:27 | 显示全部楼层 |阅读模式
    1. 利用SRichEdit输入XML格式讯息,在demo中修改 link color没有作用。
    <color value="#ff0000">abc<linkcolor="#0000ff">home</link><smileyid="1"/><underline>efg<italic>abc<bold>abc<strike>afc<fontvalue="华文行楷"><sizevalue="25"> 启程</size>软件SOUI</font></strike></bold></italic></underline></color>

    2. 程序代码中,要如何取得鼠标clicklink属性文字的时候回传内容?trace过与Slink无关。

    能否请大家给我一点提示!谢谢!

  • TA的每日心情
    奋斗
    2022-7-4 09:45
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    59

    主题

    590

    帖子

    5515

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    5515

    突出贡献优秀版主

    发表于 2020-6-11 12:13:18 | 显示全部楼层
    richedit里的link和soui的link不是一回事。你要控制richedit里的,自己研究一下richedit有没有提供类似接口。
  • TA的每日心情

    2021-1-7 17:27
  • 签到天数: 86 天

    [LV.6]常住居民II

    2

    主题

    33

    帖子

    279

    积分

    22:00筑基期

    Rank: 1

    积分
    279
     楼主| 发表于 2020-6-11 17:24:58 | 显示全部楼层
    setoutsoft 发表于 2020-6-11 12:13
    richedit里的link和soui的link不是一回事。你要控制richedit里的,自己研究一下richedit有没有提供类似接口 ...

    感谢版主您的回复,

    我参考网络作法,原本想要用MSG_WM_NOTIFY()方式,但一直没有成功
    class CMainDlg : public SHostWnd
    {
    LRESULT OnNotify(int idCtrl, LPNMHDR pnmh);

    SOUI_MSG_MAP_BEGIN()
         MSG_WM_NOTIFY(OnNotify)
      SOUI_MSG_MAP_END()
    };
    LRESULT CMainDlg::OnNotify(int idCtrl, LPNMHDR pnmh)
    {
            LRESULT lRet = 0;
            ENLINK* pnml = reinterpret_cast<ENLINK*>(pnmh);

            if (pnml->msg == WM_LBUTTONDOWN ) //左键click link文字
            {
                SStringT strTxt;
                TEXTRANGE txtRng;
                txtRng.chrg.cpMin = pnml->chrg.cpMin;//link文字左边位置
                txtRng.chrg.cpMax = pnml->chrg.cpMax; //link文字右边位置
                txtRng.lpstrText = (LPTSTR)strTxt.GetBufferSetLength(txtRng.chrg.cpMax - txtRng.chrg.cpMin);
                SSendMessage(EM_GETTEXTRANGE, 0, (LPARAM)&txtRng);//取得文字范围的内容
                strTxt.ReleaseBuffer();//释放资源
                
                SMessageBox(NULL ,L"URL: \"" + strTxt + L"\"",L"test",MB_OK);

                lRet = 1; // message handled
            }
            lRet = 0;  // enable default processing
            return lRet;
        }

    //--最后在C:\soui3-master\SOUI\src\control\SRichEdit.cpp –拦截Notify就可行—

    HRESULT SRichEdit::OnTxNotify( DWORD iNotify,LPVOID pv )
    {
        EventRENotify evt(this);
        evt.iNotify=iNotify;
        evt.pv=pv;
        evt.hr = S_OK;
        FireEvent(evt);

       /*****************新增拦截 link 文字内容************************//
        ENLINK* pnml = reinterpret_cast<ENLINK*>(pv);
        if (pnml && pnml->msg == WM_LBUTTONDOWN )
        {
            SStringT strTxt;
            TEXTRANGE txtRng;
            txtRng.chrg.cpMin = pnml->chrg.cpMin;
            txtRng.chrg.cpMax = pnml->chrg.cpMax;
            txtRng.lpstrText = (LPTSTR)strTxt.GetBufferSetLength(txtRng.chrg.cpMax - txtRng.chrg.cpMin);
            SSendMessage(EM_GETTEXTRANGE, 0, (LPARAM)&txtRng);
            strTxt.ReleaseBuffer();
             SMessageBox(NULL, L"URL: \"" + strTxt + L"\"", L"test", MB_OK);         
        }
    /*************************************************************//
        return evt.hr;
    }

    不晓得还有没有其他解法?

    参考:https://stackoverflow.com/questi ... able-links/45367265
  • TA的每日心情
    奋斗
    2022-7-4 09:45
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    59

    主题

    590

    帖子

    5515

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    5515

    突出贡献优秀版主

    发表于 2020-6-11 19:45:31 | 显示全部楼层
    easonhsu886 发表于 2020-6-11 17:24
    感谢版主您的回复,

    我参考网络作法,原本想要用MSG_WM_NOTIFY()方式,但一直没有成功

    SOUI已经把这个Notify通过EVT_RE_NOTIFY事件传递到应用层,自己在应用层事件里响应就好了。
  • TA的每日心情

    2021-1-7 17:27
  • 签到天数: 86 天

    [LV.6]常住居民II

    2

    主题

    33

    帖子

    279

    积分

    22:00筑基期

    Rank: 1

    积分
    279
     楼主| 发表于 2020-6-12 11:06:34 | 显示全部楼层
    setoutsoft 发表于 2020-6-11 19:45
    SOUI已经把这个Notify通过EVT_RE_NOTIFY事件传递到应用层,自己在应用层事件里响应就好了。 ...

    感谢版主的提醒,原来可以这么简单.

    demo中新增接口
    class CMainDlg : public SHostWnd
    {
    boolOnPopupLinkText(EventArgs* pEvt);
    };

    bool CMainDlg::OnPopupLinkText(EventArgs* pEvt)
    {
            EventRENotify*pEvtNotify = sobj_cast<EventRENotify>(pEvt);
            SChatEdit*pEdit = reinterpret_cast<SChatEdit*>(pEvtNotify->sender);
           ENLINK* pnml= reinterpret_cast<ENLINK*>(pEvtNotify->pv);
            if (pnml&& pnml->msg == WM_LBUTTONDOWN)//link文字有click响应
            {
                    SStringTstrTxt;//存放link 文字
                    TEXTRANGEtxtRng;
                    txtRng.chrg.cpMin= pnml->chrg.cpMin;
                    txtRng.chrg.cpMax= pnml->chrg.cpMax;
                    txtRng.lpstrText= (LPTSTR)strTxt.GetBufferSetLength(txtRng.chrg.cpMax - txtRng.chrg.cpMin);
            //RichEdit取得文字范围
                    pEdit->SSendMessage(EM_GETTEXTRANGE,0, (LPARAM)&txtRng);
                    strTxt.ReleaseBuffer();
                    //popup 结果
                    SMessageBox(NULL,L"URL: \"" + strTxt + L"\"", L"test",MB_OK);

            }
            return true;
    }

    LRESULT CMainDlg::OnInitDialog( HWND hWnd, LPARAMlParam )
    {
            //大约在321行地方
        SRichEdit*pEdit = FindChildByName2<SRichEdit>(L"re_gifhost");
        if(pEdit)
        {
           SetSRicheditOleCallback(pEdit,CreateSource2);
           pEdit->SetAttribute(L"rtf",L"rtf:rtf_test");
      
            //**********订阅SOUI的一个事件 **********//
             pEdit->GetEventSet()->subscribeEvent(EVT_RE_NOTIFY,Subscriber(&CMainDlg::OnPopupLinkText, this));
            //***********************************//
        }
    }

    结果图
    result.jpg

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|SOUI官方论坛

    GMT+8, 2024-5-18 12:00

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表