Я пытаюсь распечатать файл RTF на DC с помощью C / C ++.Я не в состоянии сделать это самостоятельно, поэтому я попытался найти в Интернете, и я нашел хорошее решение здесь .Этот код подходит для работы только с текстом 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 , SendMessage() завершается ошибкой и GetLastError () возвращает (5), когда UIPI блокирует сообщение.Поэтому я пытаюсь разрешить получение сообщения, используя:
if(ChangeWindowMessageFilterEx(hwnd,EM_FORMATRANGE,MSGFLT_ALLOW,NULL)==FALSE)
std::cout<<"change window message filter failed: "<<GetLastError()<<std::endl;
, но, похоже, оно не работает.
HWND 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?