当前位置:C++技术网 > 资讯 > 打印表格基本实现-设置预览,字体,线宽1

打印表格基本实现-设置预览,字体,线宽1

更新时间:2016-01-27 21:53:01浏览次数:1+次

表格的打印是报表打印设计中的一种常见形式,所以在对表格进行打印时,边线及字体的设置也是非常重要的。表格的绘制非常简单,只要循环表格的所有行和列来绘制表格的线条没再将表格中的文字绘制到相应的单元格中,即可完成对表格的绘制操作。对于线条的宽度与字体的选择就需要通过指定的设置来完成了。
创建一个基于对话框的工程,向窗体中添加一个编辑框控件,静态文本控件,列表视图控件,和三个按钮控件。

插入一个新的对话框资源,设置关联类名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);
}
对于基本的打印程序的知识,请看《打印程序代码常用的函数或结构体粗讲