Сбой SendMessage при отправке файла RTF в HDC - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь распечатать файл 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?

...