为什么可以在虚拟打印成功,但在真实打印机下失败?请帮忙!

xiaohuizhijia 2010-08-10 03:24:33
经过调试,发现错误出现在BitBlt()这个API上面,如果选择虚拟打印机则成功,但如果选择真实打印机,这个BitBlt()返回False,通过GetLastError得到的错误代码为87(传入的参数不正确)

这是怎么回事,有没有那位兄台遇到过类似情况?

另外我通过网上看到有人提到过这个BitBlt不适宜用在打印设备上,是这样吗?

我的代码是用SDK开发的.

代码如下:

HDC hdcPrint = MyPrint.GetDefaultPrinterDC(hDlg);//一个获取默认打印设备类

DOCINFO di;
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = "NetWin Report";
di.lpszOutput = NULL;
di.lpszDatatype = NULL;
di.fwType = 0;

StartDoc(hdcPrint,&di); //通知打印机驱动程序执行一新的打印任务
SetMapMode(hdcPrint,MM_ANISOTROPIC);//(MM_HIENGLISH);//设置当前影射模式为:单位0.001英寸

SetWindowExtEx(hdcPrint,1024,768,NULL);

//得到实际设备每逻辑英寸的象素数量
int xLogPixPerInch = GetDeviceCaps(hdcPrint,LOGPIXELSX);
int yLogPixPerInch = GetDeviceCaps(hdcPrint,LOGPIXELSY);

//得到设备坐标和逻辑坐标的比例
long xExt = (long)1024 * xLogPixPerInch/96 ;
long yExt = (long)768 * yLogPixPerInch/96 ;
SetViewportExtEx(hdcPrint, (int)xExt, (int)yExt, NULL);

StartPage(hdcPrint);//通知打印机驱动程序打印新页

//这里的BitBlt()意思是实现所见即所得,将当前DC拷贝到打印DC里面
if(!BitBlt(hdcPrint, 20, 50, 1001, 655, GetDC(hDlg), 0,28, NOTSRCCOPY))
{
DWORD nErrorNo = GetLastError(); // 得到错误代码
LPSTR lpBuffer;
FormatMessage ( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
nErrorNo, // 此乃错误代码,通常在程序中可由 GetLastError()得之
LANG_NEUTRAL,
(LPTSTR) & lpBuffer,
0 ,
NULL );

}

EndPage(hdcPrint); //通知打印机驱动程序页结束
EndDoc(hdcPrint);//通知打印机驱动程序打印完毕
DeleteDC(hdcPrint);
...全文
96 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuizhijia 2010-08-11
  • 打赏
  • 举报
回复
谢谢两位,确实是两个DC不兼容引起的,现在问题已解决!
jzh6525 2010-08-10
  • 打赏
  • 举报
回复
两个DC不兼容, 先把dlg的DC转成DIB, 然后用StretchDIBits
freelaxy 2010-08-10
  • 打赏
  • 举报
回复
两个DC不兼容, 先把dlg的DC转成DIB, 然后用StretchDIBits



=======================================================
FreeLaxy, your backup.
=======================================================

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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