我用VC的对话框打印一个表格并附带一个logo! 对话框vc 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 void CTrainInfoDlg::OnPrint() { // TODO: Add your control notification handler code here CDC MemDC; CBitmap bitmap; CDC dc; BITMAP bm; bitmap.LoadBitmap(IDB_BITMAP); bitmap.GetBitmap(&bm); MemDC.CreateCompatibleDC(&dc); MemDC.SelectObject(&bitmap); int count = m_listName.GetItemCount(); CDC* pDC = GetDC(); //获得屏幕分辨率 double xscreen = pDC->GetDeviceCaps(LOGPIXELSX); double yscreen = pDC->GetDeviceCaps(LOGPIXELSY); ReleaseDC(pDC); //CPrintDialog dlg (FALSE,PD_RETURNDEFAULT); //构造打印对话框 CPrintDialog dlg (FALSE,PD_ALLPAGES|PD_COLLATE|PD_NOPAGENUMS|PD_HIDEPRINTTOFILE,NULL); //构造打印对话框 if (dlg.DoModal() == IDOK) { dc.Attach(dlg.GetPrinterDC()); double xprint = dc.GetDeviceCaps(LOGPIXELSX); double yprint = dc.GetDeviceCaps(LOGPIXELSY); double ratex = (double)(xprint)/xscreen; //计算屏幕和打印机分辨率的比例 double ratey = (double)(yprint)/yscreen; CRect rect(25*ratex,0,dc.GetDeviceCaps(PHYSICALWIDTH)-50*ratex ,dc.GetDeviceCaps(PHYSICALHEIGHT)); //打印纸区域 CRect Table; Table.top=rect.top+bm.bmHeight*ratex; Table.left=rect.left; Table.right=rect.right; Table.bottom=rect.bottom; dc.StartDoc("大神救我"); //开始打印 for (int i=0;i<count/20;i++) { dc.StartPage(); //打印新一页 if (!dc.StretchBlt(0,0,(int)(bm.bmWidth*ratex),(int)(bm.bmHeight*ratex),&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY)) { AfxMessageBox("复制失败"); return; } DrawNameTable(&dc,Table,count%20,ratex,i); dc.EndPage(); } if (count%20!=0) { dc.StartPage(); if (!dc.StretchBlt(0,0,(int)(bm.bmWidth*ratex),(int)(bm.bmHeight*ratex),&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY)) { AfxMessageBox("失败"); return; } DrawNameTable(&dc,Table,count%20,ratex,i); dc.EndPage(); } // dc.EndPage(); dc.EndDoc(); //结束打印 } } 原因找到了,rect.top值太大了,导致横竖线在另一页!但今天在设备打印机上打印时,报错说if (!dc.StretchBlt(0,0,(int)(bm.bmWidth*ratex),(int)(bm.bmHeight*ratex),&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY)) { AfxMessageBox("复制失败");return; }复制失败!但我在虚拟打印机上测试可以啊!这是什么原因啊! VC XML编码的内存释放 从VC6.0的MFC程序移植到VC2005出现的问题,求教 对话框问题~ 即将转行~~来问下经验 ATL中销毁子窗口,MFC中测试的时候出现ASSERT错误!进者有分! CDateTimeCtrl 简单问题 如何在VC6.0中画点,直线等简单图形? 跨网段的socket在什么情况下会连接不上,都可以ping通 Bitmap初始化问题 如何在word或txt文件的右键菜单中添加自己的菜单? 0x0000020内存不能为读竟然是因为cstdiofile文件路径里有中文 求用connect send recv函数实现网页劫持的完整源码
{
// TODO: Add your control notification handler code here
CDC MemDC;
CBitmap bitmap;
CDC dc;
BITMAP bm;
bitmap.LoadBitmap(IDB_BITMAP);
bitmap.GetBitmap(&bm);
MemDC.CreateCompatibleDC(&dc);
MemDC.SelectObject(&bitmap);
int count = m_listName.GetItemCount();
CDC* pDC = GetDC(); //获得屏幕分辨率
double xscreen = pDC->GetDeviceCaps(LOGPIXELSX);
double yscreen = pDC->GetDeviceCaps(LOGPIXELSY);
ReleaseDC(pDC); //CPrintDialog dlg (FALSE,PD_RETURNDEFAULT); //构造打印对话框
CPrintDialog dlg (FALSE,PD_ALLPAGES|PD_COLLATE|PD_NOPAGENUMS|PD_HIDEPRINTTOFILE,NULL); //构造打印对话框
if (dlg.DoModal() == IDOK)
{
dc.Attach(dlg.GetPrinterDC());
double xprint = dc.GetDeviceCaps(LOGPIXELSX);
double yprint = dc.GetDeviceCaps(LOGPIXELSY);
double ratex = (double)(xprint)/xscreen; //计算屏幕和打印机分辨率的比例
double ratey = (double)(yprint)/yscreen;
CRect rect(25*ratex,0,dc.GetDeviceCaps(PHYSICALWIDTH)-50*ratex
,dc.GetDeviceCaps(PHYSICALHEIGHT)); //打印纸区域
CRect Table;
Table.top=rect.top+bm.bmHeight*ratex;
Table.left=rect.left;
Table.right=rect.right;
Table.bottom=rect.bottom;
dc.StartDoc("大神救我");
//开始打印
for (int i=0;i<count/20;i++)
{
dc.StartPage(); //打印新一页
if (!dc.StretchBlt(0,0,(int)(bm.bmWidth*ratex),(int)(bm.bmHeight*ratex),&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY))
{
AfxMessageBox("复制失败");
return;
}
DrawNameTable(&dc,Table,count%20,ratex,i);
dc.EndPage(); }
if (count%20!=0)
{
dc.StartPage();
if (!dc.StretchBlt(0,0,(int)(bm.bmWidth*ratex),(int)(bm.bmHeight*ratex),&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY))
{
AfxMessageBox("失败");
return;
}
DrawNameTable(&dc,Table,count%20,ratex,i);
dc.EndPage();
}
// dc.EndPage();
dc.EndDoc(); //结束打印
}
}
{
AfxMessageBox("复制失败");
return;
}
复制失败!但我在虚拟打印机上测试可以啊!这是什么原因啊!