向RTC发送RTF文件时,SendMessage失败

时间:2019-03-14 13:41:22

标签: c++ winapi gdi rtf hdc

我尝试使用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的另一种方法吗?

0 个答案:

没有答案