📄 prt.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 + -