关于一个调用打印机的函数

xilidog 2014-08-15 01:20:50
如果我想设置所打印图片的大小,应该设置哪个变量?

PRINTDLG pd; //该结构包含打印对话框中的所有信息,显示打印对话框或者打印设置对话框
LPDEVMODE lpDevMode;
if(AfxGetApp()->GetPrinterDeviceDefaults(&pd)) //获得默认的打印机的信息
{
lpDevMode=(LPDEVMODE)GlobalLock(pd.hDevMode);
if(lpDevMode)
{
lpDevMode->dmPaperSize=DMPAPER_A4; //将打印纸设置为A4
lpDevMode->dmOrientation=DMORIENT_LANDSCAPE; //将打印机设置为横向打印。
//lpDevMode->dmPrintQualITy=600 //打印分辨率为600dpi
}
GlobalUnlock(pd.hDevMode);
}

CDC memDC;
CClientDC dc(this);

int bmpWidth = 1024;
int bmpHeight = 768;
memDC.CreateCompatibleDC( &dc );
CBitmap* bitmap = new CBitmap();

HBITMAP hBitmap = NULL;
hBitmap = (HBITMAP)LoadImage(NULL, "1.bmp", IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE); //LoadImage函数装载图标,光标或者位图
bitmap->Attach(hBitmap);

CBitmap* pOldBitmap = (CBitmap*)memDC.SelectObject(bitmap);
if (pOldBitmap == NULL) // if bitmap is very big, better check this !
{
memDC.DeleteDC();
delete bitmap;
return;
}

CDC prtDC;
CPrintInfo printInfo;
CSize size;
DOCINFO di;
CString szPortName, szAppName, szPrintError;
szAppName.LoadString(AFX_IDS_APP_TITLE);
szPrintError = "";

CSize paper_size; //printer paper size in mm
int xLogPPI = 0;
int yLogPPI = 0;

if( AfxGetApp()->GetPrinterDeviceDefaults(&printInfo.m_pPD->m_pd) )
{
HDC hDC = printInfo.m_pPD->m_pd.hDC;
if (hDC == NULL)
hDC = printInfo.m_pPD->CreatePrinterDC();
if(hDC !=NULL)
{
prtDC.Attach(hDC);
paper_size.cx = prtDC.GetDeviceCaps(HORZSIZE);
paper_size.cy = prtDC.GetDeviceCaps(VERTSIZE);
xLogPPI = prtDC.GetDeviceCaps(LOGPIXELSX);
yLogPPI = prtDC.GetDeviceCaps(LOGPIXELSY);
}
else
{
AfxMessageBox("Can not find printer. Please check installed/default printers.");

return;
}
}
int scr_xLogPPI = dc.GetDeviceCaps(LOGPIXELSX);
int scr_yLogPPI = dc.GetDeviceCaps(LOGPIXELSY);
int paper_width = (int) ((double) paper_size.cx * (double) xLogPPI / 25.4); //width of a printed page in pixels
int paper_height = (int) ((double) paper_size.cy * (double) yLogPPI / 25.4);
double ratio_x = (double) xLogPPI / (double) scr_xLogPPI;
double ratio_y = (double) yLogPPI / (double) scr_yLogPPI;

CString strPageNumber = "";

int page_info_left = (int) ( (double) paper_width * 0.99);
int page_info_right = paper_width;
int page_info_top = (int) ( (double) paper_height * 0.99);
int page_info_bottom = paper_height;
CRect page_info_rect = CRect(page_info_left, page_info_top,
page_info_right, page_info_bottom );
int printed_pages = 0;
int total_print_pages = 0;
BOOL bAbort_print = FALSE;

// calculate pages
int total_pages = (bmpWidth * ratio_x + paper_width - 1 ) / paper_width;
//pop up printer dialog
CPrintDialog prtDlg(FALSE, PD_PAGENUMS);

prtDlg.m_pd.nMinPage = 1;
prtDlg.m_pd.nMaxPage = total_pages;
prtDlg.m_pd.nFromPage = 1;
prtDlg.m_pd.nToPage = total_pages;

if(prtDlg.DoModal() == IDOK )
{
memset(&di, 0, sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = szAppName;
szPortName = prtDlg.GetPortName();
di.lpszOutput = szPortName;
prtDC.m_bPrinting = TRUE;
}
else
{

return; //Cancel button pressed, don't forget this!
}

if(prtDC.StartDoc(&di) == -1)
{
AfxMessageBox("Printing error occured. Unable to find printer.");
prtDC.Detach();
prtDC.DeleteDC();

return;
}

prtDC.SetMapMode(MM_TEXT);

int i = 0;
for(i = 0; i < total_pages; i++)
{
prtDC.StartPage();
strPageNumber.Format("Page:%d of %d", ++printed_pages, total_print_pages );

if ( i == (total_pages - 1) && total_pages > 1 ) //last page
{
int last_bmpWidth = bmpWidth - paper_width / ratio_x * i;
prtDC.StretchBlt(0, 0, last_bmpWidth * ratio_x, bmpHeight* ratio_y, &memDC,
paper_width * i / ratio_x, 0, last_bmpWidth, bmpHeight, SRCCOPY);
}
else
prtDC.StretchBlt(0, 0, paper_width, bmpHeight* ratio_y, &memDC,
paper_width * i / ratio_x, 0, paper_width / ratio_x , bmpHeight, SRCCOPY);
prtDC.TextOut(page_info_rect.left, page_info_rect.top, strPageNumber );

prtDC.EndPage();
}
memDC.SelectObject(pOldBitmap);
delete bitmap;
memDC.DeleteDC();

prtDC.EndDoc();
prtDC.Detach();
prtDC.DeleteDC();
return;
...全文
197 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2014-08-16
  • 打赏
  • 举报
回复
引用 2 楼 xilidog 的回复:
[quote=引用 1 楼 xianglitian 的回复:] 什么叫设置打印图片的大小? 相对纸张的大小?
嗯,相对纸张的大小,还有能不能改变图片相对于纸张的位置?[/quote] 都是可以的 打印图片就是在打印dc上对图片进行绘制 最主要的问题就是调整好映射模式 其他的也就好说了 http://blog.csdn.net/xianglitian/article/details/5960970 这篇文章中有关于这方面的内容 虽然简单了些 但是可以说明问题
xilidog 2014-08-15
  • 打赏
  • 举报
回复
引用 1 楼 xianglitian 的回复:
什么叫设置打印图片的大小? 相对纸张的大小?
嗯,相对纸张的大小,还有能不能改变图片相对于纸张的位置?
向立天 2014-08-15
  • 打赏
  • 举报
回复
什么叫设置打印图片的大小? 相对纸张的大小?

19,468

社区成员

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

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