ITextServices分页打印的问题

_Kwekwe_ 2008-01-10 05:28:06
现在创建了一个无窗口的富文本控件。
可以用ITextServices::TxDraw绘出内容,
但是现在,希望把RTF内容分页(48Pixel*48Pixel每页)打印在内存中,

按照众多介绍,应该可用EM_FORMATRANGE/EM_DISPLAYBAND
用下面的函数希望实现打印第nPage页,//若指定的页非常大,则返回总共的页数
int PrintTest1(ITextServices *pTxService,HDC hdc, RECT rcPage,int nPage)
{

HRESULT hr;
int nMapMode =SetMapMode ( hdc, MM_TEXT );
FORMATRANGE fr;
ZeroMemory(&fr, sizeof(fr));
fr.hdc = fr.hdcTarget = hdc;
// Set up the page.1440 twips = 1 inch
fr.rcPage.left = rcPage.left * 1440 /GetDeviceCaps(hdc, LOGPIXELSX);
fr.rcPage.top = rcPage.top * 1440 /GetDeviceCaps(hdc, LOGPIXELSX);
fr.rcPage.right = rcPage.right* 1440 /GetDeviceCaps(hdc, LOGPIXELSX);
fr.rcPage.bottom = rcPage.bottom * 1440 /GetDeviceCaps(hdc, LOGPIXELSX);

fr.rc=fr.rcPage;

// Entire document.
fr.chrg.cpMin = 0;
fr.chrg.cpMax = -1;

if (pTxService==NULL)
{
SetMapMode ( hdc, nMapMode );
return -1;
}

LONG lTextLength = 0; // Length of document.
LONG lTextPrinted = 0; // Amount of document printed.


hr=pTxService->TxSendMessage(WM_GETTEXTLENGTH, 0, 0 ,(LRESULT*)<extLength);
if (!SUCCEEDED(hr))
{
::ErrorOut(hr);
return -1;
}


int nPageCnt=0;
do
{
if (nPageCnt==nPage)
{//nPageCnt is 0 based
hr=pTxService->TxSendMessage(EM_FORMATRANGE,
TRUE,
(LPARAM)&fr,
(LRESULT*)<extPrinted);
if (!SUCCEEDED(hr))
{
::ErrorOut(hr);
return -1;
}
}
else
{
hr=pTxService->TxSendMessage(EM_FORMATRANGE, FALSE//Just Measured
,(LPARAM)&fr,(LRESULT*)<extPrinted);
if (!SUCCEEDED(hr))
{
::ErrorOut(hr);
return -1;
}
hr=pTxService->TxSendMessage(EM_DISPLAYBAND, 0, (LPARAM)&fr.rc,NULL);
if (!SUCCEEDED(hr))
{
::ErrorOut(hr);
return -1;
}
}

nPageCnt++;//printed
// If there is more text to print, adjust the range of characters
// to start printing at the first character of the next page.
if (lTextPrinted < lTextLength)
{
fr.chrg.cpMin = lTextPrinted;
fr.chrg.cpMax = -1;
}

}
while (lTextPrinted < lTextLength&&nPageCnt<=nPage);//Here nPageCnt is 1 based

// Tell the control to release cached information.
hr=pTxService->TxSendMessage(EM_FORMATRANGE, 0, (LPARAM)NULL,NULL);
if (!SUCCEEDED(hr))
{
::ErrorOut(hr);
return -1;
}

SetMapMode ( hdc, nMapMode );
return nPageCnt;
}
可是,在计算的时候总是失败,在彩色标示的部分,返回的错误是“无效的矩形”;
请问这是哪里的错误亚?

请问大侠们,到底错在什么地方了?
或者是有其他的办法
...全文
140 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
_Kwekwe_ 2008-01-12
  • 打赏
  • 举报
回复
只好用旁门左道来解决了。
在这里,我建立了一个隐藏的CRichEditCtrl只要 按上面的顺序,把消息发送给CRichEditCtrl,可以得到正确的结果,但是美中不足的是,用CRichEditCtrl变得不再是线程安全的。并且效率也很低。
_Kwekwe_ 2008-01-12
  • 打赏
  • 举报
回复
怎么没有人回答呀?难道提问的不是地方?

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧