我在寫字板中創建了一個簡單的 RTF 檔案,這是螢屏截圖:

看起來,RTF 的所有格式的東西都可以正常作業,除了圖片,它被空字串替換。這是 RichEdit 螢屏截圖:

我嘗試了 .bmp 和 .png。我還嘗試了不同版本的 RichEdit 庫:Riched20.dll 和 Msftedit.dll。在我的 .rtf 檔案中有一個 string {\*\generator Riched20 10.0.19041},我想它是一個庫和 SDK 版本,在 Visual Studio 中我使用相同的。
我用來加載 RTF 的代碼很流行,取自互聯網:
static DWORD CALLBACK FileStreamCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)
{
std::ifstream* pFile = (std::ifstream*)dwCookie;
pFile->read((char*)pbBuff, cb);
return 0;
}
// ...
std::fstream file{ filePath };
EDITSTREAM editStream = { 0 };
editStream.dwCookie = (DWORD)&file;
editStream.pfnCallback = FileStreamCallback;
SendMessage(hwndEdit, EM_STREAMIN, SF_RTF, (LPARAM)&editStream);
為簡潔起見,這里是帶有剪切影像資料的 RTF:
{\rtf1\ansi\ansicpg1251\deff0\nouicompat\deflang1049\deflangfe1049{\fonttbl{\f0\fswiss\fprq2\fcharset204 Calibri;}{\f1\fswiss\fprq2\fcharset0 Calibri;}}
{\colortbl ;\red0\green0\blue255;}
{\*\generator Riched20 10.0.19041}{\*\mmathPr\mdispDef1\mwrapIndent1440 }\viewkind4\uc1
\pard\nowidctlpar\sa200\sl240\slmult1\f0\fs22{\pict{\*\picprop}\wmetafile8\picw1323\pich1323\picwgoal750\pichgoal750
010009000003260300000000fd02000000000400000003010800050000000b0200000000050000
// intermediate data
0000002701ffff030000000000
}\par
\strike Hello\strike0 .\par
\pard
{\pntext\f0 a.\tab}{\*\pn\pnlvlbody\pnf0\pnindent0\pnstart1\pnlcltr{\pntxta.}}
\nowidctlpar\fi-360\li720\sa200\sl240\slmult1\f1\lang1033 34\f0\lang1049\par
{\pntext\f0 b.\tab}\f1\lang1033 28\f0\lang1049\par
\pard\nowidctlpar\sa200\sl240\slmult1 {\f1\lang1033{\field{\*\fldinst{HYPERLINK www.google.com }}{\fldrslt{www.google.com\ul0\cf0}}}}\f0\fs22\par
}
此外,我發現很少有指控,即 RichEdit 實際上無法使用上述方法處理影像。我不知道如何對待他們。
uj5u.com熱心網友回復:
要在 Richedit 中插入位圖,請參見此示例( InsertObject(HWND hRichEdit, LPCTSTR pszFileName))
否則,寫字板的 rtf 檔案中的位圖將保存為十進制格式的數字。要閱讀它,IRichEditOleCallback需要介面。
創建一個名為"cole_callback.h"如下的新檔案:
#include <richole.h>
interface cole_callback : public IRichEditOleCallback
{
public:
IStorage* pstorage;
DWORD m_ref;
int grfmode;
cole_callback() : grfmode(STGM_TRANSACTED | STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE)
{
pstorage = nullptr;
m_ref = 0;
(void)StgCreateDocfile(NULL, grfmode, 0, &pstorage);
}
HRESULT STDMETHODCALLTYPE GetNewStorage(LPSTORAGE* lplpstg)
{
wchar_t name[256] = { 0 };
return pstorage->CreateStorage(name, grfmode, 0, 0, lplpstg);
}
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** lplpObj)
{
*lplpObj = NULL;
if (iid == IID_IUnknown || iid == IID_IRichEditOleCallback)
{
*lplpObj = this;
AddRef();
return NOERROR;
}
return E_NOINTERFACE;
}
ULONG STDMETHODCALLTYPE AddRef()
{
return m_ref;
}
ULONG STDMETHODCALLTYPE Release()
{
if (--m_ref == 0) { delete this; return 0; }
return m_ref;
}
STDMETHOD(GetInPlaceContext) (LPOLEINPLACEFRAME FAR*, LPOLEINPLACEUIWINDOW FAR*, LPOLEINPLACEFRAMEINFO) { return S_OK; }
STDMETHOD(ShowContainerUI) (BOOL) { return S_OK; }
STDMETHOD(QueryInsertObject) (LPCLSID, LPSTORAGE, LONG) { return S_OK; }
STDMETHOD(DeleteObject) (LPOLEOBJECT) { return S_OK; }
STDMETHOD(QueryAcceptData) (LPDATAOBJECT, CLIPFORMAT FAR*, DWORD, BOOL, HGLOBAL) { return S_OK; }
STDMETHOD(ContextSensitiveHelp) (BOOL) { return S_OK; }
STDMETHOD(GetClipboardData) (CHARRANGE FAR*, DWORD, LPDATAOBJECT FAR*) { return S_OK; }
STDMETHOD(GetDragDropEffect) (BOOL, DWORD, LPDWORD) { return S_OK; }
STDMETHOD(GetContextMenu) (WORD, LPOLEOBJECT, CHARRANGE FAR*, HMENU FAR*) { return S_OK; }
};
下一步,創建 的新實體cole_callback,并使用EM_SETOLECALLBACK訊息發送它。按照使用讀取 rtf 檔案EM_STREAMIN
#include <"cole_callback.h">
...
LoadLibrary(L"Riched20.dll");
...
cole_callback* ole_callback = new cole_callback;
...
richedit = CreateWindowEx(0, RICHEDIT_CLASS, ...
SendMessage(richedit, EM_SETOLECALLBACK, 0, (LPARAM)ole_callback);
auto callback = [](DWORD ptr, LPBYTE buf, LONG count, LONG* red)
{
auto fp = (std::ifstream*)ptr;
fp->read((char*)buf, count);
*red = (LONG)fp->gcount();
return DWORD(0);
};
std::ifstream fin(L"c:/test/document.rtf", std::ios::binary);
EDITSTREAM es{ (DWORD_PTR)&fin, 0, callback };
SendMessage(richedit, EM_STREAMIN, WPARAM(SF_RTF), (LPARAM)&es);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/347739.html
上一篇:System.Diagnostics.TraceSource不向ApplicationInsights發送資料
下一篇:從串列向類添加屬性
