需求描述:有一段程序生成了一个图片,但是没有打印图片的功能,现在要把这个功能加上去。
最终的代码实现如下:
//add by slient begin
void CBarcodeDlg::OnPrintPicture()
{
/*DWORD dwflags=PD_ALLPAGES|PD_NOPAGENUMS|PD_USEDEVMODECOPIES|PD_SELECTION|PD_HIDEPRINTTOFILE;
CPrintDialog dlg(FALSE, dwflags, NULL);
if(dlg.DoModal() == IDOK)
{
CDC dc;
dc.Attach(dlg.GetPrinterDC());
}*/
//打印对话框
/*DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS
| PD_NOSELECTION | PD_HIDEPRINTTOFILE;
CPrintDialog dlg(FALSE);
if (dlg.DoModal() == IDOK)
{
//获得打印机DC
HDC hDC = dlg.GetPrinterDC();
if (hDC == NULL)
{
return;
}
//通过HDC获得CDC指针
CDC* pDC = CDC::FromHandle(hDC);
pDC->m_bPrinting = TRUE;
//文档信息
DOCINFO di;
::ZeroMemory (&di, sizeof (DOCINFO));
di.cbSize = sizeof (DOCINFO);
di.lpszDocName = _T("Demo");
//开始打印
BOOL bPrinting = pDC->StartDoc(&di);
//for (UINT nPage = 0; nPage < 10 && bPrinting; nPage++)
//{
UINT nPage = 0;
pDC->StartPage();
//输出文本
CString strText = _T("");
strText.Format(_T("第%d页"), nPage + 1);
pDC->TextOut(100, 0, strText);
pDC->TextOut(100, 200, _T("111"));
pDC->TextOut(400, 200, _T("222"));
pDC->TextOut(700, 200, _T("333"));
pDC->TextOut(1000, 200, _T("444"));
bPrinting = (pDC->EndPage() > 0);
// }
if (bPrinting)
{
pDC->EndDoc();
}
else
{
pDC->AbortDoc();
}
//结束打印
pDC->EndDoc();
//删除DC
pDC->DeleteDC();
}*/
CDC* imagedc = CDC::FromHandle(imgOut.GetDC()); //这里的ImgOut是CImage类型的。
CRect m_rect(0,0,imgOut.GetHeight(),imgOut.GetWidth());
//获取图像的大小
//转换成bitmap begin
HBITMAP hBitmap=imgOut.Detach();
CBitmap bmp;
bmp.DeleteObject();
bmp.Attach(hBitmap); // 转换为CBitmap对象
//转换成bitmap end
//bmp.GetClientRect(m_rect);
int formx,formy;
formx = imagedc->GetDeviceCaps(LOGPIXELSX);
formy = imagedc->GetDeviceCaps(LOGPIXELSY);
CPrintDialog m_printdlg (FALSE);
if (m_printdlg.DoModal()==IDOK)
{
CDC dc;
dc.Attach(m_printdlg.GetPrinterDC());
//获取打印机与屏幕的分辨率比率
int printerx,printery;
printerx = dc.GetDeviceCaps(LOGPIXELSX);
printery = dc.GetDeviceCaps(LOGPIXELSY);
double ratex,ratey;
ratex = (double)printerx/formx;
ratey = (double)printery/formy;
//打印图像
DOCINFO di;
::ZeroMemory (&di, sizeof (DOCINFO));
di.cbSize = sizeof (DOCINFO);
di.lpszDocName = _T("Demo");
dc.StartDoc(&di);
dc.StretchBlt(30,40,(int)(m_rect.Width()*ratex),(int)(m_rect.Height()*ratey),imagedc,0,0,m_rect.Width(),m_rect.Height(),SRCCOPY);
dc.EndDoc();
}
}
//add by slient end
在这其中遇到的问题,然后在网上查找到的相关有用的资料:
一:VC中CDC与HDC的区别以及二者之间的转换
二:CImage类相关
http://blog.csdn.net/shuilan0066/article/details/7086371
http://wenku.baidu.com/link?url=vq6x3qKV5EvXar3x-LNy8w0OgN6WqJOMiMzjCZkgiO2wP6zWkY8Sb8k5STiysBHkv7ak01pqWjE9QsuiCvkZw0FCZw9IOjGDIzt_DqNdf_m
CImage类是基于GDI+的,为什么要引入CImage类? CBitmap类只能处理BMP格式的图片,非常受限,而CImage可以处理JPGE、GIF、BMP、PNG等多种格式的图片。它还可以和CBit马屁进行转换(因为所字载入的位图句柄都是HBITMAP)。
CBitmap只能加载BMP图片文件。
if(!PathFileExists(imgFilePath))
return NULL;
CIamge nlmage;
nlmage.Load(imgFilePath);