15,976
社区成员
发帖
与我相关
我的任务
分享
#define TEST_TEXT _T("To test link color.")
HGLOBAL hClip;
if(OpenClipboard())
{
::EmptyClipboard();
hClip = GlobalAlloc(GMEM_MOVEABLE, _tcslen(TEST_TEXT) + 1 );
TCHAR *buff;
buff = (TCHAR*)GlobalLock(hClip);
_tcscpy(buff, TEST_TEXT);
::GlobalUnlock(hClip);
::SetClipboardData(CF_TEXT, hClip);
::CloseClipboard();
}
m_richedit.Paste();
CHARFORMAT2 cf2;
m_richedit.SetSel(8, 12); //将"link"这个词选中
// 设为link
ZeroMemory(&cf2, sizeof(CHARFORMAT2));
cf2.cbSize = sizeof(CHARFORMAT2);
cf2.dwMask = CFM_LINK;
cf2.dwEffects |= CFE_LINK;
::SendMessage(GetDlgItem(IDC_RICHEDIT)->GetSafeHwnd(), EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);
#if 0
// 修改link的字体颜色为红色,不起作用
ZeroMemory(&cf2, sizeof(CHARFORMAT2));
cf2.cbSize = sizeof(CHARFORMAT2);
cf2.dwMask = CFM_COLOR;
cf2.dwEffects = CFE_BOLD;
cf2.crTextColor = RGB(255, 0, 0);
m_richedit.SetWordCharFormat(cf2);
#endif
HRESULT hr;
CComPtr<IRichEditOle> spREOle;
::SendMessage( GetDlgItem(IDC_RICHEDIT)->GetSafeHwnd(),
EM_GETOLEINTERFACE,
0, /*not used; must be zero.*/
(LPARAM)&spREOle);
CComQIPtr<ITextDocument> spTextDoc = spREOle;
CComPtr<ITextSelection> spSelection;
hr = spTextDoc->GetSelection(&spSelection);
#if 0
//返回S_FALSE,表明link部分并不是一个embeded对象
CComPtr<IUnknown> spUnk;
hr = spSelection->GetEmbeddedObject(&spUnk);
#endif
CComPtr<ITextFont> spTextFont;
hr = spSelection->GetFont(&spTextFont);
hr = spTextFont->SetProtected(tomFalse);
//hr = spTextFont->GetForeColor(&color); //能取到 blue
//hr = spTextFont->SetBackColor(RGB(255,0,0)); //能把背景设为red
// hr = spTextFont->SetItalic(tomTrue); //能设置为斜体
//hr = spTextFont->SetUnderline(tomNone); // hr 为S_OK,但是link下面还是有下划线
hr = spTextFont->SetForeColor(RGB(255,0,0)); // hr 为S_OK
long color;
hr = spTextFont->GetForeColor(&color); // 但是link的颜色没有变
//结论, 对标准的RichEdit,设置为CFE_LINK之后,
//凡是和超链接相关的外观(字体颜色,下划线)都修改不了
FINDTEXTEXW findText;
findText.chrg.cpMin = nStartPos; //自己定义查找的起始点点
findText.chrg.cpMax = -1; //结束点
findText.lpstrText = _T("要设为link的文字");
m_dlgRichEditRead.m_reRead.SetSel(findText.chrgText);
if( -1 < m_dlgRichEditRead.m_reRead.FindText(FR_DOWN, (_findtextexa *)&findText))
{
SetSel(findText.chrgText);
CHARFORMAT2 cf2;
ZeroMemory(&cf2, sizeof(CHARFORMAT2));//
cf2.cbSize = sizeof(CHARFORMAT2);
cf2.dwMask = CFM_LINK;
cf2.dwEffects |= CFE_LINK;
SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);
SetEventMask(ENM_LINK);
//********//
HideSelection(TRUE, FALSE);
}