创建一个基于对话框的工程,向窗体中添加一个编辑框控件,静态文本控件,列表视图控件,和三个按钮控件。
插入一个新的对话框资源,设置关联类名CPreview,该类用来完成预览功能。
具体设计请看:
在预览类的头文件中:
bool isfont;
LOGFONT logfont;
int LineWidth;
CListCtrl *PrintGrid;
void PreviewGrid(CDC * dc,bool isprint);
void GetPrintRate(double &ratex,double &ratey);
实现文件中:
void CPreview::PreviewGrid(CDC * dc,bool isprint)
{
if (PrintGrid == NULL)
return ;
double ratex,ratey;
if (isprint)
GetPrintRate(ratex,ratey);
else
ratex = ratey = 1;
int columns = PrintGrid->GetHeaderCtrl()->GetItemCount();
int items = PrintGrid->GetItemCount();
CFont font;
if (isfont)
font.CreateFontIndirect(&logfont);
else
font.CreatePointFont(90,"宋体",dc);
dc->SelectObject(&font);
CPen pen(PS_SOLID,LineWidth,RGB(0,0,0));
if (LineWidth > 0)
dc->SelectObject(&pen);
for (int i = 0;i< columns;i++)
{
CRect rect;
PrintGrid->GetHeaderCtrl()->GetItemRect(i,&rect);
rect.left *= ratex;
rect.top *= ratey;
rect.right *= ratex;
rect.bottom *= ratey;
if (i>0)
rect.OffsetRect(-(int)(i*ratex),0);
dc->Rectangle(&rect);
LVCOLUMN column;
char mm[255];
column.mask = LVCF_TEXT;
column.pszText = mm;
column.cchTextMax = 255;
PrintGrid->GetColumn(i,&column);
dc->SetBkMode(TRANSPARENT);
dc->TextOut(rect.left + 2*ratex,rect.top + 2*ratey,column.pszText);
}
for (int n = 0 ;n < items;n++)
{
CRect rect;
PrintGrid->GetItemRect(n,&rect,LVIR_BOUNDS);
rect.left *= ratex;
rect.top *= ratey;
rect.right *= ratex;
rect.bottom *= ratey;
rect.OffsetRect(0,-(3+n)*ratey);
rect.InflateRect(0,0,-(columns - 1)*ratex,0);
dc->Rectangle(&rect);
for (int m = 0;m<columns;m++)
{
CRect rectw;
PrintGrid->GetHeaderCtrl()->GetItemRect(m,&rectw);
rectw.left *= ratex;
rectw.top *= ratey;
rectw.right *= ratex;
rectw.bottom *= ratey;
dc->MoveTo(rectw.right - m -1,rect.top);
dc->LineTo(rectw.right - m -1,rect.bottom);
CString text = PrintGrid->GetItemText(n,m);
dc->TextOut(rectw.left,rect.top,text);
}
}
}
void CPreview::GetPrintRate(double &ratex,double &ratey)
{
//CClientDC sdc(this);
CDC *sdc=GetDC();
CPrintDialog pdlg(false);
pdlg.GetDefaults();
CDC pdc;
pdc.Attach(pdlg.GetPrinterDC());
ratex = pdc.GetDeviceCaps(LOGPIXELSX) /
sdc->GetDeviceCaps(LOGPIXELSX);
ratey = pdc.GetDeviceCaps(LOGPIXELSY) /
sdc->GetDeviceCaps(LOGPIXELSY);
}
对于基本的打印程序的知识,请看《打印程序代码常用的函数或结构体粗讲》