研究了好久,终于解决了,可以支持CRicheditCtrl图片打印。
void PrintRich()
{
CString szprinter;
CString szDevice,szDriver,szOutput;
HDC hdcprint; // 定义一个设备环境句柄
//定义一个打印作业
DOCINFO di;//={sizeof(DOCINFO),"printer",NULL};
ZeroMemory(&di, sizeof(di));
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = _T("test");
di.lpszOutput = _T("C:\\Users\\Desktop\\1.pdf");
szDevice = _T("Microsoft Print to PDF");
szDriver = _T("winspool");
szOutput = _T("Ne02:");
if((hdcprint=::CreateDC(szDriver,szDevice,szOutput,NULL))!=0)
{
if(StartDoc(hdcprint,&di)>0) //开始执行一个打印作业
{
CDC* pdc = m_richeditctrl.GetDC();
CDC dcPrint;
dcPrint.Attach(hdcprint);
dcPrint.m_bPrinting = TRUE;
StartPage(hdcprint); //打印机走纸,开始打印
SaveDC(hdcprint); //保存打印机设备句柄
long CharRange = 0;
long LastChar = 0;
FORMATRANGE fr;
::ZeroMemory(&fr, sizeof(FORMATRANGE));
fr.hdc = hdcprint;
fr.hdcTarget = hdcprint;
int nHorizRes = dcPrint.GetDeviceCaps(HORZRES);
int nVertRes = dcPrint.GetDeviceCaps(VERTRES);
int nLogPixelsX = dcPrint.GetDeviceCaps(LOGPIXELSX);
int nLogPixelsY = dcPrint.GetDeviceCaps(LOGPIXELSY);
fr.rcPage.left = 0;
fr.rcPage.top = 0;
fr.rcPage.right = (nHorizRes/nLogPixelsX) * 1440;
fr.rcPage.bottom = (nVertRes/nLogPixelsY) * 1440;
fr.rc.left = fr.rcPage.left + 1440;
fr.rc.top = fr.rcPage.top + 1440;
fr.rc.right = fr.rcPage.right - 1440;
fr.rc.bottom = fr.rcPage.bottom - 1440;
CHARRANGE cr;
cr.cpMin =0;
cr.cpMax = -1;
fr.chrg = cr;
CharRange = m_richeditctrl.GetTextLength();
do
{
dcPrint.StartPage();
LastChar = m_richeditctrl.FormatRange( &fr, TRUE );
cr.cpMin = LastChar;
cr.cpMax = CharRange;
fr.chrg = cr;
dcPrint.EndPage() ;
}while(LastChar < CharRange);
RestoreDC(hdcprint,-1); //恢复打印机设备句柄
EndPage(hdcprint); //打印机停纸,停止打印
EndDoc(hdcprint); //结束一个打印作业
// MessageBox("打印完毕!","提示",MB_ICONINFORMATION);
dcPrint.Detach();
}
// 用API函数DeleteDC销毁一个打印机设备句柄
DeleteDC(hdcprint);
}
else
{
// MessageBox("没有默认打印机,或者没有安装打印机!");
return ;
}
}