2017-10-12 2 views
0

I CRichEditCtrl (RichEdit20A) bin mit angezeigt werden rtf-Text:Warum CRichEditControl verstecken Rahmen um Worte

m_reText.SetWindowText(strRtfText); 

Das Problem ist, dass die Steuerung nicht eine Grenze anzeigt um Wörter in rtf-Text wie folgt aus:

{\rtf1 
\box\brdrdot 
Hello World 
} 

ich habe auch versucht RichEdit5.0 in einer Art und Weise, wie es here vorgeschlagen, aber Ergebnis ist das gleiche, Grenze wird nicht angezeigt. Allerdings, wenn ich den Text in .rtf-Datei speichern und öffnen Sie es in MS Word oder Libre/Open Office-Editor, der gepunktete Rahmen um Text korrekt angezeigt wird:

enter image description here

Warum CRichEditControl die Grenze in meinem Fall zu verstecken? Bitte helfen Sie mir, ich würde mich über Vorschläge freuen.

+1

'm_reText.SetWindowText (strRtfText);' wird nicht funktionieren. Es zeigt nur den Text wie '' {\ rtf1 \ box \ ... "'. Sie haben den RTF-Text über den Edit-Stream geladen. Es wird immer noch einige Funktionen wie diese Grenzen nicht zeigen. Microsoft Word verwendet eine andere Engine, deshalb kann es angezeigt werden. Ich denke in RTF kannst du Tische zeigen, an die ich mich nicht erinnere. Sie könnten das HTML-Steuerelement verwenden, aber das könnte zu anderen Problemen führen. –

+0

Vielen Dank für die Antwort. Für mich funktioniert das Laden mit SetWindowText gut, das Steuerelement zeigt so viel Formatierung wie Wordpad, einschließlich Tabellen. Aber mit Ausnahme dieser Grenzen ( – vtrz

+0

"Microsoft Word verwendet eine andere Engine") Wenn ja, warum lädt RichEdit20W, wie von Spion ++ für Rechtschreibprüfung Dialogfeld in MS Word 2010 angezeigt (und dieses Feld * zeigt * die Grenzen um Text)? – vtrz

Antwort

1

Sie können Tabellen und Rahmen mit Rich-Edit anzeigen. Im Folgenden wird eine Box mit festen Grenzen zeigen:

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

Wenn Sie dies in Microsoft Word ausführen wird es gepunktete Linien zeigen, wie es soll. RichEdit behandelt keine gepunkteten Rahmen, wie es sollte, oder vielleicht erwartet es ein anderes Format. Wenn Sie die Datei aus Word speichern, werden weiterhin keine gepunkteten Linien angezeigt.

Wenn Sie nicht gepunktete Linien dann diese einfachen Beispiele benötigen Sie Boxen in RichEdit zeigen:

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

Siehe auch link

Hinweis, CRichEditCtrl::SetWindowText wird ::SetWindowText WinAPI rufen Sie einfach an, es wird gesetzt die Zeichenkette als einfacher Text.

Verwenden Sie CRichEdit::StreamIn, um Raw RTF-Zeichenfolge festzulegen. In Ihrem Fall verwenden Sie wahrscheinlich Ihre eigene Klasse, die CRichEditCtrl::SetWindowText überschreibt und das erforderliche Streaming ausführt.


Versuchen Sie Folgendes zu rtf-String aus Word Rechtschreibprüfung RichEdit zu bekommen:

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

Barmak, danke für so detaillierte Antwort. "Sie können Tabellen und Grenzen mit reichen bearbeiten." Ja, ich weiß, ich kann, aber ich möchte nicht Text mit meinen eigenen Ergänzungen verschmutzen. Lassen Sie mich ein wenig verdeutlichen, Ich schreibe ein Office Addin, und was ich will, ist ein Stück Text aus Word zu nehmen, es dem Benutzer durch RichEdit-Steuerelement zu präsentieren, und nach einigen Änderungen durch den Benutzer wieder zu Word zu bringen. So etwas wie Rechtschreibprüfung in MSWord 2010.Und es ist schade, dass nicht alle Formatierungen so sicher übertragen werden können, wie ich aus Ihren Antworten verstehe. – vtrz

+0

Ich weiß nicht, was du beschreibst. Vielleicht können Sie in Ihrer Frage einen Screenshot hochladen, der die Word-Rechtschreibprüfung anzeigt. –

+0

Ich habe den Screenshot zur Frage hinzugefügt. – vtrz