2017-10-12 130 views
0

我使用CRichEditCtrl(RichEdit20A)來顯示RTF文本:爲什麼身邊的話CRichEditControl隱藏邊框

m_reText.SetWindowText(strRtfText); 

的問題是控制不顯示圍繞在這樣的RTF文本字的邊界:

{\rtf1 
\box\brdrdot 
Hello World 
} 

我也試過RichEdit5.0的方式,因爲它提出here,但結果是不顯示的一樣,邊境。但是,如果我保存文本在.rtf文件和的MSWord或自由報/ OpenOffice的編輯器打開它,文本週圍虛線邊框正確顯示:

enter image description here

爲什麼CRichEditControl藏在我的情況下,邊界?請幫助,我將不勝感激任何建議。

+1

'm_reText.SetWindowText(strRtfText);'將無法工作。它將只顯示文本,如同「{\ rtf1 \ box \ ...」。您已通過編輯流加載rtf文本。它仍然不會顯示像這些邊界的一些功能。 Microsoft Word使用不同的引擎,這就是爲什麼它可以顯示它。我想在RTF中你可以顯示錶格,我不記得了。您可能會考慮使用HTML控件,但這可能會遇到其他問題。 –

+0

非常感謝您的回答。對我來說,通過SetWindowText加載工作正常,控件顯示的格式與寫字板一樣多,包括表格。但是豁免那些邊界( – vtrz

+0

「Microsoft Word使用不同的引擎」 如果是這樣,它爲什麼加載RichEdit20W,如MSWord 2010中的spy ++ for拼寫檢查對話框所示(此框*顯示*文本週圍的邊框)? – vtrz

回答

1

您可以通過豐富的編輯顯示錶格和邊框。下面會顯示一個方塊,固體邊界:

str = L"{\\rtf1\ 
\\trowd\\trgaph72 \ 
\\clbrdrt\\brdrdot\\clbrdrl\\brdrdot\\clbrdrb\\brdrdot\\clbrdrr\\brdrdot \ 
\\cellx3000 TEXT\\intbl\\cell \ 
\\row\\pard\\par\ 
}"; 

如果您在Microsoft Word中運行這個它會顯示虛線喜歡它應該。 RichEdit不處理像它應該的虛線邊框,或者它可能期待着不同的格式。如果您從Word保存該文件,它仍然不顯示虛線。

如果您不需要虛線然後使用這些簡單的例子來說明箱RichEdit中:

CString str; 
str = L"{\\rtf1\ 
\\trowd\\trgaph72 \ 
\\cellx3000 TEXT\\intbl\\cell \ 
\\row\\pard\\par\ 
}"; 

str = L"\ 
{\\rtf1\\ansi\\deff0\ 
\\trowd\ 
\\cellx1000\ 
\\cellx2000\ 
\\cellx3000\ 
\\ TEXT1\\cell\ 
\\ TEXT2\\cell\ 
\\ TEXT3\\cell\ 
\\row\ 
}"; 

參見link

注意,CRichEditCtrl::SetWindowText就叫::SetWindowText WinAPI的,它將設置字符串爲純文本。

使用CRichEdit::StreamIn設置原始rtf字符串。在你的情況下,你可能使用自己的類,它會覆蓋CRichEditCtrl::SetWindowText並運行必要的流。


請嘗試以下解決Word中的拼寫檢查RichEdit中獲得RTF格式字符串:

DWORD __stdcall rtfstreamget(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) 
{ 
    CStringA text; 
    text.GetBufferSetLength(cb); 
    CStringA *ptr = (CStringA*)dwCookie; 
    for(int i = 0; i < cb; i++) 
     text.SetAt(i, *(pbBuff + i)); 
    *ptr += text; 
    *pcb = text.GetLength(); 
    text.ReleaseBuffer(); 
    return 0; 
} 

bool GetRTF(hWnd, CString &sW) 
{ 
    CStringA sA; 
    EDITSTREAM es{ 0 }; 
    es.dwCookie = (DWORD_PTR)&sA; 
    es.pfnCallback = rtfstreamget; 
    edit.StreamOut((CP_UTF8 << 16) | SF_USECODEPAGE | SF_RTF, es); 
    SendMessage(hWnd, EM_STREAMOUT, 
      (CP_UTF8 << 16) | SF_USECODEPAGE | SF_RTF, (LPARAM)&es); 
    sW = CA2W(sA, CP_UTF8); 
    return es.dwError == 0; 
} 

CStringW s; 
GetRTF(msword_spellcheck_hwindow, str); 
+0

巴爾馬克,謝謝你的詳細回答。 「你可以用豐富的編輯來顯示錶格和邊框。」 是的,我知道我可以,但是我不想用我自己的增加來污染文本 讓我澄清一下,我正在寫一個辦公室插件,我想要的是從Word中取出大量文本,通過RichEdit控件將其呈現給用戶,並且在用戶進行一些修改後,將其帶回Word中。 MSWord 2010。可惜的是,並非所有的格式都能以這種方式安全地傳輸,正如我從你的答案中所理解的那樣。 – vtrz

+0

我不知道你在描述什麼。也許您可以在顯示Word拼寫檢查的問題中發佈屏幕截圖。 –

+0

我已將截圖添加到問題中。 – vtrz