2017-10-12 20 views
0

の周囲に境界線を隠すCRichEditControlない私は、RTFテキストを表示するためにCRichEditCtrl(RichEdit20A)を使用しています:はなぜ言葉

m_reText.SetWindowText(strRtfText); 

問題はコントロールがこのようなRTF、テキスト中の単語の周囲に境界線が表示されないということです。

{\rtf1 
\box\brdrdot 
Hello World 
} 

私もそれがhereを提案したような方法でRichEdit5.0を試みたが、結果は同じである、境界線は表示されません。しかし、私は、.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は別のエンジンを使用しています」 MSWord 2010のspy ++のスペルチェックダイアログボックスで示されているようにRichEdit20Wがロードされるのはなぜですか(このボックス*はテキストの周りに*を表示します)? – 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からファイルを保存しても、点線は表示されません。

あなたは点線を必要としない場合は、リッチエディットのボックスを表示するには、これらの単純な例を使用します。

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のスペルチェックリッチエディットから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からテキストを取り出し、それをリッチエディットコントロールを通してユーザーに提示し、ユーザーが行った変更をWordに戻します。 MSWord 2010。あなたの答えからわかるように、すべての書式がそのような方法で安全に転送されるわけではないというのは残念です。 – vtrz

+0

私はあなたが何を記述しているのか分かりません。たぶんWordスペルチェックを表示する質問のスクリーンショットを投稿することができます。 –

+0

質問にスクリーンショットを追加しました。 – vtrz