⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prt.cpp

📁 通用报表打印类使用说明 主要功能: 1 – 自动分页 2 – 自动划出纵横表格线 3 – 支持横向 / 纵向打印 4 – 支持打印输出或生成文本文件 使用方法: 1.Copy prt.h
💻 CPP
字号:
//==========================================================================================
// prt.cpp

#include "stdafx.h"
#include "prt_demo.h"	// <-- Add project main header file hear
#include "prt.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CPrt::CPrt(CWnd* pParent):CDialog(CPrt::IDD, pParent)
{
	//{{AFX_DATA_INIT(CPrt)
	//}}AFX_DATA_INIT
	pRow=new PRTROW();
	m_fpGetRowFun=NULL;
	m_brush.CreateSolidBrush(RGB(240,240,228));
	LandScape=0;
}

void CPrt::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPrt)
	DDX_Control(pDX, IDC_FILE_BZ, m_File);
	DDX_Control(pDX, IDC_SELE1, m_sele);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CPrt, CDialog)
	//{{AFX_MSG_MAP(CPrt)
	ON_WM_CLOSE()
	ON_BN_CLICKED(ID_PRT, OnPrt)
	ON_WM_CTLCOLOR()
	ON_BN_CLICKED(IDC_GETFILE, OnGetfile)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CPrt::OnClose() 
{
	CDialog::OnClose();
	DeleteObject(hDC);
	pDC->Detach();
	pDC->DeleteDC();
	DeleteObject(m_brush);
	DeleteObject(ft_head);
	DeleteObject(ft_note);
	DeleteObject(ft_body);
	delete pRow;
}

BOOL CPrt::OnInitDialog() 
{
	CDialog::OnInitDialog();
	int k=Get_Printer();
	if(k==0) return false;
	CRect rect;
	int w,h,m_left,m_top;
	w=::GetSystemMetrics(SM_CXFULLSCREEN);
	h=::GetSystemMetrics(SM_CYFULLSCREEN);
	GetWindowRect(rect);
	m_left=w-rect.Width()-40;
	m_top=h-rect.Height()-24;
	SetWindowPos(this,m_left,m_top,0,0,SWP_NOSIZE|SWP_NOZORDER);
//----------------------------------------------------------------
	CString str;
	if(pRow->title) SetDlgItemText(IDC_PRT_NAME,pRow->title);
	str.Format("( 共 %d 页 )",pRow->page_max);
	SetDlgItemText(IDC_PAGE,str);
	m_sele.SetCheck(true);
	SetDlgItemInt(IDC_PAGE1,1);
	SetDlgItemInt(IDC_PAGE2,pRow->page_max);
//----------------------------------------------------------------
	LOGFONT lf;
	lf.lfHeight=30;
	lf.lfWidth=0;
	lf.lfEscapement=0;
	lf.lfOrientation=0;
	lf.lfWeight=FW_BOLD;
	lf.lfItalic=0;
	lf.lfUnderline=0;
	lf.lfStrikeOut=0;
	lf.lfCharSet=DEFAULT_CHARSET;
	lf.lfOutPrecision=OUT_DEFAULT_PRECIS;
	lf.lfClipPrecision=CLIP_DEFAULT_PRECIS;
	lf.lfQuality=DEFAULT_QUALITY;
	lf.lfPitchAndFamily=DEFAULT_PITCH|FF_MODERN;
	strcpy(lf.lfFaceName,"黑体");
//----------------------------------------------------------------
	ft_title.CreateFontIndirect(&lf);
	lf.lfHeight=16;
	lf.lfWeight=FW_NORMAL;
	strcpy(lf.lfFaceName,"System");
	ft_note.CreateFontIndirect(&lf);
	strcpy(lf.lfFaceName,"System");
	lf.lfHeight=16;
	ft_body.CreateFontIndirect(&lf);
//----------------------------------------------------------------
	df.lpszDocName="PrintJob";
	df.lpszOutput=NULL;
	df.lpszDatatype=NULL;
	df.fwType=0;
	df.cbSize=sizeof(df);
//----------------------------------------------------------------
	return true;
}

int CPrt::Get_Printer()
{
	char pp[101];
	CString str;
	int k,j;
	GetProfileString("windows","device","NoPrinter",pp,100);
	if(strcmp("NoPrinter",pp)==0){
		MessageBox("打印机设备不存在","设备错误",MB_ICONSTOP|MB_OK);
		return 0;
	}
	for(k=0;k<100;k++) if(pp[k]==',') pp[k]=0;
	hDC=::CreateDC(NULL,pp,NULL,NULL);
	if(hDC==NULL){
		str.Format("打印机 < %s > 设备错误!",pp); 
		MessageBox(str,"设备错误",MB_ICONSTOP|MB_OK);
		return 0;
	}
	pDC=new CDC();
	if(!pDC->Attach(hDC)){
		str.Format("打印机 < %s > 设备连接错误!",pp);
		MessageBox(str,"设备错误",MB_ICONSTOP|MB_OK);
		return 0;
	}
	str.Format(" %s",pp);
	SetDlgItemText(IDC_PRT_DEVICE,str);
	Set_LandScape();
	pDC->SetMapMode(MM_LOENGLISH);
	k=pDC->GetDeviceCaps(HORZSIZE);
	j=pDC->GetDeviceCaps(VERTSIZE);
	pRow->width=(int)((double)k/25.4*100.0);
	pRow->height=(int)((double)j/25.4*100.0);
	pRow->row_count=(int)((pRow->height-235)/21);
	pRow->page_max=(int)((double)(pRow->row_sum-1)/pRow->row_count)+1;
	return 1;
}

void CPrt::OnPrt() 
{
	int k,j;
	pRow->op_code=PRTROW::stGetHeader;
	if(m_fpGetRowFun) k=(GetParent()->*m_fpGetRowFun)(pRow);
	k=m_sele.GetCheck();
	if(k){
		pRow->page1=1;
		pRow->page2=pRow->page_max;
	}else{
		pRow->page1=GetDlgItemInt(IDC_PAGE1);
		pRow->page2=GetDlgItemInt(IDC_PAGE2);
	}
	if((pRow->page1>pRow->page2)||(pRow->page1<1)||(pRow->page2>pRow->page_max)){
		AfxMessageBox("选择了错误的页数,操作失败!",MB_ICONSTOP|MB_OK);
		return;
	}
	if(m_File.GetCheck()){
		k=DoPrintFile();
		if(k==0) return;
		MessageBox("打印到文件完成!","提示信息",MB_ICONINFORMATION|MB_OK);
		SendMessage(WM_CLOSE);
		return;
	}
//----------------------------------------------------------------
	CSize cs;
	pDC->SetMapMode(MM_LOENGLISH);
	p_ft_old=(CFont*)pDC->SelectObject(&ft_body);
	k=0;
	for(j=0;j<pRow->col_count;j++){
		pRow->px[j]=k;
		cs=pDC->GetOutputTextExtent(pRow->hx[j]);
		k+=cs.cx+9;
	}
	pRow->row_width=k;
	pDC->SelectObject(p_ft_old);
//----------------------------------------------------------------
	DoPrint();
	SendMessage(WM_CLOSE);	
}

HBRUSH CPrt::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	UINT nID=pWnd->GetDlgCtrlID();
	switch(nID){
	case IDC_PRT_DEVICE:	pDC->SetTextColor(RGB(8,16,64));
							pDC->SetBkColor(RGB(240,240,228));
							return m_brush;
	case IDC_PRT_NAME:		pDC->SetTextColor(RGB(128,8,64));
							pDC->SetBkColor(RGB(240,240,228));
							return m_brush;
	case IDC_PAGE1:
	case IDC_PAGE2:			pDC->SetTextColor(RGB(0,0,96));
							pDC->SetBkColor(RGB(240,240,228));
							return m_brush;
	default:				pDC->SetTextColor(RGB(32,0,64));
	}
	return hbr;
}

void CPrt::SetGetRowCallback(int (CWnd::*fpGetRowFun)(PRTROW *))
{
	m_fpGetRowFun=fpGetRowFun;
}

int CPrt::DoPrint()
{
	int k,j,l;
	int m,pos=60;
	pRow->page=pRow->page1;
	pDC->StartDoc(&df);
	pDC->SetBkMode(TRANSPARENT);
	m=(int)((pRow->width-pRow->row_width)/2);
	while(pRow->page<=pRow->page2){
		pDC->StartPage();
		pDC->SetMapMode(MM_LOENGLISH);
//-------------------------------------------------------
		p_ft_old=(CFont *)pDC->SelectObject(&ft_title);
		pDC->SetTextAlign(TA_CENTER);
		k=(int)(m+pRow->row_width/2);
		pDC->TextOut(k,-pos,pRow->head);
		pDC->SelectObject(&ft_note);
		pos+=50;
		pDC->TextOut(k,-pos,pRow->head_m);
		pDC->SetTextAlign(TA_RIGHT);
		pDC->TextOut(m+pRow->row_width,-pos,pRow->head_r);
		pDC->SetTextAlign(TA_LEFT);
		pDC->TextOut(m,-pos,pRow->head_l);
		pDC->SelectObject(&ft_body);
		pos+=36;
		pDC->MoveTo(m,-pos);
		pDC->LineTo(m+pRow->row_width,-pos);
		pDC->MoveTo(m,-pos-1);
		pDC->LineTo(m+pRow->row_width,-pos-1);
		for(k=0;k<pRow->col_count;k++){
			pDC->MoveTo(m+pRow->px[k],-pos);
			pDC->LineTo(m+pRow->px[k],-pos-26);
			pDC->TextOut(m+pRow->px[k]+5,-pos-4,pRow->hx[k]);
		}
		pDC->MoveTo(m,-pos-26);
		pDC->LineTo(m+pRow->row_width,-pos-26);
		pDC->LineTo(m+pRow->row_width,-pos);
		pDC->MoveTo(m,-pos-25);
		pDC->LineTo(m+pRow->row_width,-pos-25);
		pDC->SelectObject(&ft_body);
		pos+=26;
		for(j=0;j<pRow->row_count;j++){
			pRow->row=j;
			pRow->op_code=PRTROW::stGetRow;
			l=(GetParent()->*m_fpGetRowFun)(pRow);
			if(l==0) break;
			for(k=0;k<pRow->col_count;k++){
				pDC->MoveTo(m+pRow->px[k],-pos);
				pDC->LineTo(m+pRow->px[k],-pos-21);
				pDC->TextOut(m+pRow->px[k]+5,-pos-2,pRow->tx[k]);
			}
			pDC->MoveTo(m+pRow->row_width,-pos);
			pDC->LineTo(m+pRow->row_width,-pos-21);
			pos+=21;
			pDC->MoveTo(m,-pos);
			pDC->LineTo(m+pRow->row_width,-pos);
		}
		pRow->foot_l.Format("打印日期: %s",CTime::GetCurrentTime().Format("%Y年%m月%d日 %H:%M"));
		pDC->TextOut(m,-pos-30,pRow->foot_l);
		pDC->SetTextAlign(TA_RIGHT);
		pRow->head_r.Format("第 %d 页 , 共 %d 页",pRow->page,pRow->page_max);
		pDC->TextOut(m+pRow->row_width,-pos-30,pRow->head_r);
//-------------------------------------------------------
		pDC->SelectObject(p_ft_old);
		pDC->EndPage();
		pRow->page++;
	}
	pDC->EndDoc();
	return 1;
}

void CPrt::OnGetfile() 
{
	CFileDialog dlg(true,"txt","prt.txt");
	if(dlg.DoModal()==IDOK){
		ss=dlg.GetPathName();
		SetDlgItemText(IDC_FILE,ss);
	}
}

int CPrt::DoPrintFile()
{
	char RT[3];
	int k,j,l,len,t;
	CString str_hd,str_line,str_hline,str_blank;
	CFile cf;
	RT[0]=0x0d;
	RT[1]=0x0a;
	RT[2]=0;
	GetDlgItemText(IDC_FILE,ss);
	if(ss.GetLength()==0){
		MessageBox("请指定打印文件名!","打印中止",MB_ICONSTOP|MB_OK);
		return 0;
	}
	k=cf.Open(ss,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
	if(!k){
		MessageBox("打开文件失败!","打印中止",MB_ICONSTOP|MB_OK);
		return 0;
	}
	len=1;
	str="|";
	for(k=0;k<pRow->col_count;k++){
		len+=pRow->hx[k].GetLength()+1;
		str+=pRow->hx[k];
		str+="|";
	}
	str_hd=str;
	str_hd+=RT;
	str_line=str_hline=str_blank="";
	for(k=0;k<len;k++){
		str_line+="-";
		str_hline+="=";
		str_blank+=" ";
	}
	str_line+=RT;
	str_hline+=RT;
//-------------------------------------------------------------------
	pRow->page=pRow->page1;
	while(pRow->page<=pRow->page2){
		cf.Write(RT,2);
		str.Format("%s%s%s",str_blank,pRow->head,RT);
		l=int((len+pRow->head.GetLength())/2)+2;
		cf.Write(str.Right(l),l);
		ss=pRow->head_l+pRow->head_m+pRow->head_r;
		cf.Write(ss,ss.GetLength());
		cf.Write(RT,2);
		cf.Write(str_hline,len+2);
		cf.Write(str_hd,len+2);
		cf.Write(str_hline,len+2);
		for(j=0;j<pRow->row_count;j++){
			pRow->row=j;
			pRow->op_code=PRTROW::stGetRow;
			l=(GetParent()->*m_fpGetRowFun)(pRow);
			if(l==0) break;
			cf.Write("|",1);
			for(k=0;k<pRow->col_count;k++){
				l=pRow->hx[k].GetLength();
				t=pRow->tx[k].GetLength();
				cf.Write(pRow->tx[k],t);
				while(t++<l) cf.Write(" ",1);
				cf.Write("|",1);
			}
			cf.Write(RT,2);
		}
		cf.Write(str_hline,len+2);
		cf.Write(RT,2);
		str.Format("%s第 %d 页,共 %d 页%s",str_blank,pRow->page,pRow->page_max,RT);
		cf.Write(str.Right(len+2),len+2);
		pRow->page++;
	}
	cf.Close();
	return 1;
}

void CPrt::Set_LandScape()
{
	CPrintDialog mypd(0); // 构造打印设置对话框对象,但不显示   
	mypd.GetDefaults();   // 检取缺省打印设备的设备环境   
	DEVMODE *dm=mypd.GetDevMode(); // 提取缺省打印机的DEVMODE数据   
	if(LandScape==1) dm->dmOrientation=DMORIENT_LANDSCAPE;	//   重新修改纸张的打印方向(横向打印)
	else dm->dmOrientation=DMORIENT_PORTRAIT;	//   重新修改纸张的打印方向(纵向打印)
	pDC->ResetDC(dm);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -