打印預(yù)覽實(shí)現(xiàn)流程:
首先調(diào)用CFormView::OnFilePrintPreview,再依次調(diào)用自己的所重寫的虛函數(shù)OnPreparePrinting(CPrintInfo* pInfo)、OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)、OnPrint(CDC* pDC, CPrintInfo* pInfo)、CFormView::OnPrint(pDC, pInfo);,當(dāng)關(guān)閉打印預(yù)覽時調(diào)用OnEndPrinting(CDC* pDC, CPrintInfo* pInfo) ,結(jié)束打印。
部分代碼:
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
BOOL CElectronValveView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
pInfo->SetMinPage(1); //設(shè)置打印文件起始頁
pInfo->SetMaxPage(1); //設(shè)置打印文件終止頁
return DoPreparePrinting(pInfo);
}
void CElectronValveView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
m_ChartCtrl.GetBottomAxis()->GetGrid()->SetColor(BlackColor);//設(shè)置柵格顏色為黑色,不然打印的時候太淡
m_ChartCtrl.GetLeftAxis()->GetGrid()->SetColor(BlackColor);
}
void CElectronValveView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
m_ChartCtrl.GetBottomAxis()->GetGrid()->SetColor(BlueColor);//恢復(fù)顏色,不然控件中也是這個顏色了。
m_ChartCtrl.GetLeftAxis()->GetGrid()->SetColor(BlueColor);
}
void CElectronValveView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: add customized printing code here
CMainFrame* pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd
CDC *pCurrentDC = GetDC(); // will have dimensions of the client area
CSize PaperPixelsPerInch(pDC->GetDeviceCaps(LOGPIXELSX), pDC->GetDeviceCaps(LOGPIXELSY));
//獲得打印紙設(shè)備每英寸的像素數(shù),應(yīng)該是一樣的。
CSize ScreenPixelsPerInch(pCurrentDC->GetDeviceCaps(LOGPIXELSX), pCurrentDC->GetDeviceCaps(LOGPIXELSY));
//應(yīng)該是獲得屏幕的每英寸的像素數(shù),應(yīng)該是一樣的
CSize m_PaperSize,m_LogicalPageSize;
m_PaperSize = CSize(pDC->GetDeviceCaps(HORZRES), pDC->GetDeviceCaps(VERTRES));
//把紙張所得的像素對應(yīng)的屏幕大小得到。
m_LogicalPageSize.cx = ScreenPixelsPerInch.cx * m_PaperSize.cx / PaperPixelsPerInch.cx * 3 / 4;
m_LogicalPageSize.cy = ScreenPixelsPerInch.cy * m_PaperSize.cy / PaperPixelsPerInch.cy * 3 / 4;
//這里必須這樣設(shè),是為了和ChartCtrl中的打印對應(yīng)起來。
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(m_LogicalPageSize);
pDC->SetViewportExt(m_PaperSize);
pDC->SetWindowOrg(0, 0);
CRect rcClient,rcClient1;
GetClientRect(&rcClient1); //得到的仍然是打印預(yù)覽顯示客戶區(qū)的大小
rcClient=pInfo->m_rectDraw;//打印紙的客戶區(qū)
double ratioX,ratioY;
ratioX=(double)rcClient.right/(double)rcClient1.Width();
ratioY=(double)rcClient.bottom/(double)rcClient1.Height();
int nWid,left,right;
CFont *pOldFont;
CFont fnBig,fnBig1;
CPen Pen,*OldPen;
//畫主框
Pen.CreatePen(PS_SOLID,2,RGB(0,0,0));
OldPen=pDC->SelectObject(&Pen);
pDC->Rectangle(20,20,m_LogicalPageSize.cx-20,m_LogicalPageSize.cy-20);
pDC->SelectObject(OldPen);
//畫標(biāo)題欄
pDC->MoveTo(20,60);
pDC->LineTo(m_LogicalPageSize.cx-20,60);
pDC->MoveTo(20,85);
pDC->LineTo(m_LogicalPageSize.cx-20,85);
pDC->SelectObject(&Pen);
pDC->MoveTo(20,110);
pDC->LineTo(m_LogicalPageSize.cx-20,110);
pDC->SelectObject(OldPen);
pDC->MoveTo(196,60);
pDC->LineTo(196,110);
pDC->MoveTo(390,60);
pDC->LineTo(390,110);
//畫結(jié)果欄
pDC->MoveTo(20,430);
pDC->LineTo(m_LogicalPageSize.cx-20,430);
pDC->MoveTo(85,430);
pDC->LineTo(85,470);//測量結(jié)果1分界線豎線
pDC->MoveTo((m_LogicalPageSize.cx-85-100)/4+85,430);//開啟響應(yīng)時間分界線
pDC->LineTo((m_LogicalPageSize.cx-85-100)/4+85,470);
pDC->MoveTo((m_LogicalPageSize.cx-85-100)/4*2+85,430);
pDC->LineTo((m_LogicalPageSize.cx-85-100)/4*2+85,470);
pDC->MoveTo((m_LogicalPageSize.cx-85-100)/4*3+85,430);
pDC->LineTo((m_LogicalPageSize.cx-85-100)/4*3+85,470);
pDC->MoveTo((m_LogicalPageSize.cx-85-100)/4*4+85,430);
pDC->LineTo((m_LogicalPageSize.cx-85-100)/4*4+85,470);
pDC->MoveTo(20,450);
pDC->LineTo(m_LogicalPageSize.cx-20,450);
pDC->SelectObject(&Pen);
pDC->MoveTo(20,470);
pDC->LineTo(m_LogicalPageSize.cx-20,470);
pDC->SelectObject(OldPen);
//寫標(biāo)題
fnBig.CreatePointFont(200,"黑體",pDC);
pOldFont=pDC->SelectObject(&fnBig);
nWid=rcClient1.Width();
left=rcClient1.left;
right=rcClient1.right;
pDC->SetTextAlign(TA_CENTER);
pDC->TextOut(m_LogicalPageSize.cx/2,30,"XXX性能測試報告");
fnBig.DeleteObject();
fnBig.CreatePointFont(110,"宋體",pDC);
pOldFont=pDC->SelectObject(pOldFont);
pOldFont=pDC->SelectObject(&fnBig);
pDC->SetTextAlign(TA_LEFT);
pDC->TextOut(25,67,"產(chǎn)品名稱:"+pMain->m_strProductName);
pDC->TextOut(25,92,"產(chǎn)品圖號:"+pMain->m_strProductPictureNo);
pDC->TextOut(201,67,"檢測時間:"+pMain->m_strMeasureTime0);
pDC->TextOut(201,92,"生產(chǎn)廠家:"+pMain->m_strProductFactory);
pDC->TextOut(395,67,"產(chǎn)品編號:"+pMain->m_strProductBianHao);
pDC->TextOut(395,92,"檢 驗 員:"+pMain->m_strMeasurerName);
CString aa;
aa.Format("%d(ms)",m_iPreviousTime1);
fnBig.DeleteObject();
fnBig.CreatePointFont(85,"宋體",pDC);
pDC->SelectObject(&fnBig);
pDC->TextOut(25,420,"預(yù)置電信號時間:"+aa);
aa.Format("%d",m_iCurveNumber1);
pDC->TextOut(150,420,"曲線數(shù)量:"+aa);
fnBig1.CreatePointFont(100,"宋體",pDC);
pOldFont=pDC->SelectObject(&fnBig1);
pDC->TextOut(25,455,"測試結(jié)果");
pDC->TextOut(90,435,"開啟響應(yīng)時間(ms)");
pDC->TextOut(120,455,m_strOpenResponseTime);
pDC->TextOut((m_LogicalPageSize.cx-85-100)/4+85+5,435,"開啟換向時間(ms)");
pDC->TextOut((m_LogicalPageSize.cx-85-100)/4+85+5+30,455,m_strOpenInvertTime);
pDC->TextOut((m_LogicalPageSize.cx-85-100)/4*2+85+5,435,"關(guān)閉響應(yīng)時間(ms)");
pDC->TextOut((m_LogicalPageSize.cx-85-100)/4*2+85+5+30,455,m_strCloseResponseTime);
pDC->TextOut((m_LogicalPageSize.cx-85-100)/4*3+85+5,435,"關(guān)閉換向時間(ms)");
pDC->TextOut((m_LogicalPageSize.cx-85-100)/4*3+85+5+30,455,m_strCloseInvertTime);
pDC->TextOut((m_LogicalPageSize.cx-85-100)/4*4+85+10,435,"檢測結(jié)論");
//最后一欄
fnBig.DeleteObject();
fnBig.CreatePointFont(130,"宋體",pDC);
pDC->SelectObject(&fnBig);
pDC->TextOut(m_LogicalPageSize.cx-180,m_LogicalPageSize.cy-20-20,"審核:");
pDC->SetTextAlign(TA_LEFT);
CPoint offset(16,110);
m_ChartCtrl.Print1(offset,pDC,pInfo,0);//調(diào)用chart類來畫表格和曲線
fnBig.DeleteObject();
CFormView::OnPrint(pDC, pInfo);
}
本程序利用ChartCtrl來實(shí)現(xiàn)繪制表格和曲線。