0

CRichEditCtrl (RichEdit20A) を使用して rtf-text を表示しています。

m_reText.SetWindowText(strRtfText);

問題は、コントロールが次のように rtf-text の単語の周りに境界線を表示しないことです。

{\rtf1
\box\brdrdot
Hello World
}

ここで提案されている方法でRichEdit5.0も試しましたが、結果は同じで、境界線は表示されません。ただし、テキストを .rtf ファイルに保存して MSWord または Libre/OpenOffice エディターで開くと、テキストの周りの点線の境界線が正しく表示されます。

ここに画像の説明を入力

私の場合、CRichEditControl が境界線を非表示にするのはなぜですか? 助けてください、何か提案をいただければ幸いです。

4

1 に答える 1

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\
}";

リンクも参照

CRichEditCtrl::SetWindowText単純に WinAPI を呼び出し::SetWindowText、文字列をプレーン テキストとして設定することに注意してください。

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);
于 2017-10-13T19:08:50.420 に答える