我尝试使用C / C ++将RTF文件打印到DC。 我无法自己做,所以尝试在Internet上搜索,找到了一个不错的解决方案here。该代码适用于仅文本RTF或包含图片的RTF。如果我尝试打印一些RTF(使用Microsoft Word生成),其中包含复杂对象(即图表),则SendMessage(...)函数将失败并且 GetLastError()返回(5)。这是我调用该函数的代码:
BOOL FillRichEditFromFile(HWND hwnd){
BOOL fSuccess = FALSE;
HANDLE hFile = CreateFile(L"RTFchartWord.rtf", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
EDITSTREAM es = { 0 };
es.pfnCallback = EditStreamCallback;
es.dwCookie = (DWORD_PTR)hFile;
if(ChangeWindowMessageFilterEx(hwnd,EM_STREAMIN,MSGFLT_ALLOW,NULL)==FALSE)
std::cout<<"change window message filter failed: "<<GetLastError()<<std::endl;
if (SendMessage(hwnd, EM_STREAMIN, SF_RTF, (LPARAM)&es) && es.dwError == 0)
fSuccess = TRUE;
else
std::cout<<"SendMessage failed:"<<GetLastError()<<std::endl;
CloseHandle(hFile);
return fSuccess;
}
读取文件的回调函数如下
DWORD CALLBACK EditStreamCallback(DWORD_PTR dwCookie, LPBYTE lpBuff,LONG cb, PLONG pcb){
HANDLE hFile = (HANDLE)dwCookie;
if (ReadFile(hFile, lpBuff, cb, (DWORD *)pcb, NULL))
{
return 0;
}
return -1;
}
根据MSDN documentation,当UIPI阻止消息时,SendMessage()失败,GetLastError()返回(5)。 因此,我尝试使用以下方式接收邮件:
if(ChangeWindowMessageFilterEx(hwnd,EM_FORMATRANGE,MSGFLT_ALLOW,NULL)==FALSE)
std::cout<<"change window message filter failed: "<<GetLastError()<<std::endl;
但它似乎不起作用。
如果获得HWND,请按照以下步骤获取
HMODULE hLib=LoadLibrary(TEXT("Msftedit.dll"));
HWND hwndRTF = CreateWindow(MSFTEDIT_CLASS , NULL,
ES_MULTILINE | WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, 0, 0, 0);
我对使用HWND句柄进行编程非常陌生,因此不确定如何正确解决此问题。如果没有可能的解决方案,有人可以建议我将RTF文件/缓冲区打印为DC的另一种方法吗?