///选择打印机对话框
CDC memDC;
HDC hdcPrint = NULL;
CPrintDialog dlg(FALSE);
if (true) //打印按钮,不弹出选择对话框,获取默认打印设备
{
PRINTDLG printInfo;
ZeroMemory(&printInfo,sizeof(printInfo)); //清空该结构
printInfo.lStructSize = sizeof(printInfo);
printInfo.hwndOwner = 0;
printInfo.hDevMode = 0;
printInfo.hDevNames = 0;
//这个是关键,PD_RETURNDC 如果不设这个标志,就拿不到hDC了
//PD_RETURNDEFAULT 这个就是得到默认打印机,不需要弹出设置对话框
printInfo.Flags = PD_RETURNDC | PD_RETURNDEFAULT | PD_ALLPAGES;
PrintDlg(&printInfo);//调用API拿出默认打印机
DWORD rst = CommDlgExtendedError();//看看出错没有
if(rst != 0)
{//出错了,清空标志再次调用API,此时就会弹出打印设置对话框供用户选择了
printInfo.Flags = 0;
PrintDlg(&printInfo);
}
hdcPrint = printInfo.hDC; //得到打印DC,输出到打印
}
else //弹出对话框选择打印设备
{
dlg.DoModal();
hdcPrint = dlg.GetPrinterDC();
}
if(hdcPrint == NULL)
{
AfxMessageBox(_T("打印机初始化失败!"));
return;
}
memDC.Attach(hdcPrint);
if(memDC.m_hDC == NULL)
return;
int nPaperSize_X = memDC.GetDeviceCaps(HORZSIZE); // 纸张宽度
int nPaperSize_Y = memDC.GetDeviceCaps(VERTSIZE); // 纸张高度
int xP = memDC.GetDeviceCaps(LOGPIXELSX); //x方向每英寸像素点数
int yP = memDC.GetDeviceCaps(LOGPIXELSY); //y方向每英寸像素点数
double xPix = (DOUBLE)xP*10/254; //每 mm 宽度的像素
double yPix = (DOUBLE)yP*10/254; //每 mm 高度的像素
TCHAR szTitle[] = _T("ecg_printer");
//真正打印部分
static DOCINFO di = {sizeof (DOCINFO), szTitle} ;
//开始文档打印/ start print
//
if(memDC.StartDoc( &di ) < 0) // startdoc-----enddoc
{
AfxMessageBox(_T("连接到打印机化败!"));
}
else
{
//开始页
if(memDC.StartPage() < 0)
{
AfxMessageBox(_T("打印失败!"));
memDC.AbortDoc();
return;
}
else
{
//上横线
memDC.MoveTo(100, int(10 * yPix));
memDC.LineTo(100, int(110 * yPix) );
memDC.MoveTo(200, int(10 * yPix));
memDC.LineTo(200, int(160 * yPix) );
memDC.MoveTo(300, int(10 * yPix));
memDC.LineTo(300, int(210 * yPix) );
memDC.MoveTo(400, int(10 * yPix));
memDC.LineTo(400, int(260 * yPix) );
memDC.EndPage();
}
memDC.EndDoc();
}
memDC.DeleteDC();
打印功能经常用到,也整理了好多次了。但是每次用完后都随手丢了。这次记录下来,以防后查。