《Visual C++开发实战宝典》,宋坤,清华大学出版社 “12.2.3 打印图像” (P457)
① 程序功能,将应用程序客户区面积m_rect打印出来。客户区的左上角为坐标原点(0,0)。
② 将客户区dc面积为m_rect的区域“
生成”一个黑色位图(本质上作为遮罩)。
③ 建立客户区dc的兼容内存DC(imagedc)。
④ 将第②步中的黑色位图区域选入内存环境imagedc。
⑤ 将客户区对应于黑色位图的区域“截取”出来。相当于遮罩将下面的图形显示出来。绘制到内存环境imagedc。
⑥ 将内存环境imagedc中的位图输出到打印机。要对位图进行拉缩处理显示。
void CP457Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
CRect m_rect;
m_Image.GetClientRect(m_rect);
CDC *pImageDC = m_Image.GetDC();
int formx,formy;
formx = pImageDC->GetDeviceCaps(LOGPIXELSX);
formy = pImageDC->GetDeviceCaps(LOGPIXELSY);
ReleaseDC(pImageDC);
CDC *pdc1 = GetDC();
int screenx = pdc1->GetDeviceCaps(LOGPIXELSX);
int screeny = pdc1->GetDeviceCaps(LOGPIXELSY);
CPrintDialog dlg(FALSE,PD_ALLPAGES | PD_COLLATE | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE);
if (dlg.DoModal()==IDOK)
{
CDC pdc;
pdc.Attach(dlg.GetPrinterDC());
int printx,printy;
printx = pdc.GetDeviceCaps(LOGPIXELSX);
printy = pdc.GetDeviceCaps(LOGPIXELSY);
double ratex,ratey;
ratex = (double)printx/formx;
ratey = (double)printy/formy;
CClientDC
dc(this);
CBitmap bmp;
bmp.CreateCompatibleBitmap(
&dc,m_rect.Width(),m_rect.Height()); ②
CDC
imagedc;
imagedc.CreateCompatibleDC(&dc); ③
imagedc.SelectObject(&bmp); ④
imagedc.
BitBlt(0,0,m_rect.Width(),m_rect.Height(),
&dc,0,0,SRCCOPY); ⑤
pdc.StartDoc("printimage");
pdc.
StretchBlt(0,0,m_rect.Width()*
ratex,m_rect.Height()*
ratey,
&imagedc,0,0,m_rect.Width(),m_rect.Height(),SRCCOPY); ⑥
pdc.EndDoc();
}
}
① 程序功能,将应用程序客户区面积m_rect打印出来。客户区的左上角为坐标原点(0,0)。
② 将客户区dc面积为m_rect的区域“
生成”一个黑色位图(本质上作为遮罩)。
③ 建立客户区dc的兼容内存DC(imagedc)。
④ 将第②步中的黑色位图区域选入内存环境imagedc。
⑤ 将客户区对应于黑色位图的区域“截取”出来。相当于遮罩将下面的图形显示出来。绘制到内存环境imagedc。
⑥ 将内存环境imagedc中的位图输出到打印机。要对位图进行拉缩处理显示。