📄 drawdlg.cpp
字号:
// DrawDlg.cpp: implementation of the CDrawDlg class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "a1.h"
#include "DrawDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDrawDlg::CDrawDlg()
{
m_iMinPages=1;
m_pOldFont=NULL;
m_pGeneralFont= new CFont;
m_pHeadFont=new CFont; //字高==1/3 inch
m_pFootFont=new CFont; //字高==1/6 inch
m_iFontHeight=0; //字高==1/6 inch
m_iLinesPage=0; //可容纳的行数(包括页眉,页脚)
m_iLinesTotal=0; //页眉占两行
m_iLineHeight=0; //单元格高==1/3 inch
m_iMaxPages=0;
m_iLeftMargin=0; //左边距
m_iRightMargin=0; //右边距
m_rangePageItems=NULL;
m_nColumns=0; //列数
m_iHaveColumnsTitle=1; //是否每页有列标题
m_nSmallTilte=0; //小标题的行数例如:日期,编号......
m_pstrColumnTitle=NULL; //每列标题
m_piCharsColumns=NULL;//每列最大的字符数
m_piWidthColumns=NULL;//每列宽度
m_iTitleLines=2; //标题占的行数
m_iFootLines=1; //页脚占的行数
}
CDrawDlg::~CDrawDlg()
{
delete [] m_rangePageItems;
delete [] m_pstrColumnTitle;
delete [] m_piCharsColumns;
delete [] m_piWidthColumns;
delete m_pGeneralFont;
delete m_pHeadFont;
delete m_pFootFont;
m_pGeneralFont=NULL;
m_pHeadFont=NULL;
m_pFootFont=NULL;
m_rangePageItems=NULL;
m_pstrColumnTitle=NULL; //每列标题
m_piCharsColumns=NULL; //每列最大的字符数
m_piWidthColumns=NULL; //每列宽度
}
void CDrawDlg::PrintPageFooter(CDC* pDC, CPrintInfo* pInfo)
{
CString str;
int a=-pInfo->m_rectDraw.Height();
CString s;
int m_nPage=pInfo->m_nCurPage;
if(pInfo->m_bPreview)
{
pDC->MoveTo(pInfo->m_rectDraw.left, pInfo->m_rectDraw.top);
pDC->LineTo(pInfo->m_rectDraw.left, pInfo->m_rectDraw.bottom);
pDC->LineTo(pInfo->m_rectDraw.right, pInfo->m_rectDraw.bottom);
pDC->LineTo(pInfo->m_rectDraw.right, pInfo->m_rectDraw.top);
pDC->LineTo(pInfo->m_rectDraw.left, pInfo->m_rectDraw.top);
}
str.Format("Page %d", m_nPage);
CSize size = pDC->GetTextExtent(str);
pDC->TextOut(pInfo->m_rectDraw.right - size.cx-this->m_iLineHeight,
pInfo->m_rectDraw.bottom-m_iLineHeight*3/4,str); // right-justified*/
}
//DEL void CDrawDlg::OnEndPrintPreview(CDC *pDC, CPrintInfo *pInfo, POINT point, CPreView *pView)
//DEL {
//DEL m_pGeneralFont->Detach();
//DEL m_pHeadFont->Detach();//Courier New
//DEL pDC->SelectObject(m_pOldFont);
//DEL delete [] this->m_rangePageItems;
//DEL m_rangePageItems=NULL;
//DEL }
//DEL void CDrawDlg::OnEndPrinting(CDC *pDC, CPrintInfo *pInfo)
//DEL {
//DEL
//DEL m_pGeneralFont->Detach();
//DEL m_pHeadFont->Detach();//Courier New
//DEL pDC->SelectObject(m_pOldFont);
//DEL delete [] this->m_rangePageItems;
//DEL m_rangePageItems=NULL;
//DEL }
long CDrawDlg::CalcUnitWidth()
{
CListCtrl* m_pList=this->GetListCtrl();
int i;
int temp;
for(i=0;i<m_nColumns;i++)
{
this->m_piCharsColumns[i]=2;
}
//计算每列的最大字符数;ASCII
for(i=0;i<this->m_nColumns;i++)
{
for(int j=0;j<m_pList->GetItemCount();j++)
{
temp=m_pList->GetItemText(j,i).GetLength();
if(m_piCharsColumns[i]<temp)
this->m_piCharsColumns[i]=temp;
}
}
if(this->m_iHaveColumnsTitle)
{
for(i=0;i<m_nColumns;i++)
{
temp=m_pstrColumnTitle[i].GetLength();
if(m_piCharsColumns[i]<temp)
this->m_piCharsColumns[i]=temp;
}
}
/*
#ifdef _DEBUG
for(int k=0;k<6;k++)
afxDump<<"\n m_iCharsColumns["<<k<<"]"<<m_iCharsColumns[k];
#endif
*/
long total=0;
for(i=0;i<this->m_nColumns;i++)total+=this->m_piCharsColumns[i];
return total;
}
void CDrawDlg::DrawListItems(CDC*pDC,int iCurPage,CPoint ptLeftCurPos,CPoint ptRightCurPos,CListCtrl *m_pList)
{
iCurPage-=this->m_iMinPages;
CPoint t1Unit=ptLeftCurPos; //划线的起始点
CPoint t2Unit=ptRightCurPos;
int i;
if(this->m_rangePageItems[iCurPage].cy-m_rangePageItems[iCurPage].cx+m_iHaveColumnsTitle<0)return;
for(i=this->m_rangePageItems[iCurPage].cx-this->m_iHaveColumnsTitle;i<=this->m_rangePageItems[iCurPage].cy;i++)
{
pDC->MoveTo(t1Unit);
pDC->LineTo(t2Unit);
t1Unit.Offset(0,this->m_iLineHeight);
t2Unit.Offset(0,this->m_iLineHeight);
}
pDC->MoveTo(t1Unit);
pDC->LineTo(t2Unit);
t2Unit=ptLeftCurPos;
for(i=0;i<this->m_nColumns+1;i++)
{
pDC->MoveTo(t1Unit);
pDC->LineTo(t2Unit);
t1Unit.Offset(this->m_piWidthColumns[i],0);
t2Unit.Offset(this->m_piWidthColumns[i],0);
}
CPoint tLeftTopFont=ptLeftCurPos; //写字的起始点
tLeftTopFont.Offset(m_iLineHeight/4,this->m_iLineHeight/4);
CPoint tLeftTopFont2=tLeftTopFont;
bool nocolumntitle=true;
for(i=this->m_rangePageItems[iCurPage].cx-m_iHaveColumnsTitle;i<=this->m_rangePageItems[iCurPage].cy;i++)
{
for(int j=0;j<m_nColumns;j++)
{
if(m_iHaveColumnsTitle&&nocolumntitle)
{
pDC->TextOut(tLeftTopFont.x,tLeftTopFont.y,this->m_pstrColumnTitle[j]);
if(j==m_nColumns-1)nocolumntitle=false;
}
else
{
pDC->TextOut(tLeftTopFont.x,tLeftTopFont.y,m_pList->GetItemText(i,j));
}
tLeftTopFont.Offset(m_piWidthColumns[j],0);
}
tLeftTopFont=tLeftTopFont2;
tLeftTopFont.Offset(0,this->m_iLineHeight);
tLeftTopFont2=tLeftTopFont;
}
}
void CDrawDlg::PrintPageHeader(CDC *pDC, CPrintInfo *pInfo, CString header)
{
CFont* pOldFont;
pOldFont = (CFont*) (pDC->SelectObject(this->m_pHeadFont));
long w=pInfo->m_rectDraw.Width();
CSize size = pDC->GetTextExtent(header);
long pos=(w-size.cx)/2;
pDC->TextOut(pos,this->m_iLineHeight/2,header);
pDC->SelectObject(pOldFont);
}
bool CDrawDlg::InitData(CDC *pDC, CPrintInfo *pInfo, CListCtrl *m_list)
{
int xPix=pDC->GetDeviceCaps(HORZRES);
int yPix=pDC->GetDeviceCaps(VERTRES);
// int xpixperi=pDC->GetDeviceCaps(LOGPIXELSX);
int ypixperi=pDC->GetDeviceCaps(LOGPIXELSY);
return this->InitData(xPix,yPix,ypixperi,pDC,pInfo,m_list);
}
void CDrawDlg::PaintDlg(CDC *pDC,CPrintInfo* pInfo)
{
int ypixperi=pDC->GetDeviceCaps(LOGPIXELSY);
int i=0;
for(int Page=pInfo->GetMinPage();Page<=pInfo->GetMaxPage();Page++,i++)
{
pInfo->m_nCurPage=Page;
pDC->SetWindowOrg(0,-i*(pInfo->m_rectDraw.bottom));
this->PrintPageHeader(pDC,pInfo);
PrintDlg(pDC,pInfo);
this->PrintPageFooter(pDC,pInfo);
}
}
void CDrawDlg::OnBeginPrinting(CDC *pDC, CPrintInfo *pInfo)
{
CDC m_dcPrint;
m_dcPrint.Attach(pInfo->m_pPD->m_pd.hDC);
this->InitData(&m_dcPrint,pInfo,this->GetListCtrl());
m_dcPrint.Detach();
}
bool CDrawDlg::InitData(int xPix,int yPix, int ypixperi,CDC *pDC, CPrintInfo *pInfo, CListCtrl *m_list)
{
this->m_iLineHeight=ypixperi/3;
this->m_iFontHeight=ypixperi/6;
m_iLeftMargin=ypixperi/6; //左边距
m_iRightMargin=ypixperi/6; //右边距
int width=xPix-m_iLeftMargin-m_iRightMargin;
this->m_iLinesPage=yPix/m_iLineHeight;
this->m_iLinesTotal=m_list->GetItemCount();//items;行数
//计算总页数的公式:
//每页都有标题2和页脚1,可能还有列标题,小标题
//m_iMaxPages*m_iLinesPage>m_iLinesTotal+m_iMaxPages*(this->m_bHaveColumnsTitle+2+1);
int iExtra=m_iTitleLines+m_iFootLines;
if(m_iLinesPage<4)
{
AfxMessageBox("纸太小了");
pInfo->SetMaxPage(0);
pInfo->SetMinPage(1);
return false;
}
m_iMaxPages=1;
while(m_iMaxPages*(m_iLinesPage-iExtra-m_iHaveColumnsTitle)<m_iLinesTotal+this->m_nSmallTilte)
this->m_iMaxPages++;
pInfo->SetMaxPage(m_iMaxPages+m_iMinPages-1);
pInfo->SetMinPage(m_iMinPages);
delete [] m_rangePageItems;
m_rangePageItems=NULL;
m_rangePageItems=new CSize[m_iMaxPages];
if(m_iMaxPages==1)
{
m_rangePageItems[0].cx=0;
m_rangePageItems[0].cy=m_iLinesTotal-1;//
}
else
{
m_rangePageItems[0].cx=0;
m_rangePageItems[0].cy=m_iLinesPage-iExtra-m_iHaveColumnsTitle-this->m_nSmallTilte-1;
for(int i=1;i<m_iMaxPages-1;i++)
{
m_rangePageItems[i].cx=(m_iLinesPage-iExtra-m_iHaveColumnsTitle)*i-m_nSmallTilte;
m_rangePageItems[i].cy=m_rangePageItems[i].cx+m_iLinesPage-iExtra-m_iHaveColumnsTitle-1;
}
m_rangePageItems[m_iMaxPages-1].cx=(m_iLinesPage-iExtra-m_iHaveColumnsTitle)*i-m_nSmallTilte;
m_rangePageItems[m_iMaxPages-1].cy=m_iLinesTotal-1;
}
int total=0;int j;
for(j=0;j<this->m_nColumns;j++)total+=this->m_piCharsColumns[j];
for(j=0;j<m_nColumns;j++)
{
this->m_piWidthColumns[j]=MulDiv(width,m_piCharsColumns[j],total);
}
/*
#ifdef _DEBUG
afxDump<<"\n-----------------------------OnBeginPrinting信息-------------";
afxDump<<"\n xPix = "<<xPix;
afxDump<<"\n yPix = "<<yPix;
afxDump<<"\n ypixperi = "<<ypixperi;
afxDump<<"\n m_iLineHeight = "<<m_iLineHeight;
afxDump<<"\n m_iFontHeight = "<<m_iFontHeight;
afxDump<<"\n m_iLinesPage = "<<m_iLinesPage;
afxDump<<"\n m_iLinesTotal = "<<m_iLinesTotal;
afxDump<<"\n m_iMaxPages = "<<m_iMaxPages;
for(int h=0;h<m_iMaxPages;h++)
{
afxDump<<"\n m_rangePageItems["<<h<<"] ="<<m_rangePageItems[h];
}
for(int f=0;f<m_nColumns;f++)
afxDump<<"\n m_piWidthColumns["<<f<<"] ="<<m_piWidthColumns[f];
afxDump<<"\n-------------------------------------------------------------";
#endif
*/
//确定每页内容
m_pGeneralFont->DeleteObject();
m_pGeneralFont->CreateFont(-m_iFontHeight, 0, 0, 0, 400, FALSE, FALSE,
0,GB2312_CHARSET , OUT_DEFAULT_PRECIS,//ANSI_CHARSET
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
VARIABLE_PITCH |FF_SCRIPT , "楷体_GB2312"); //DEFAULT_PITCH FF_MODERN
m_pHeadFont->DeleteObject();
m_pHeadFont->CreateFont(-m_iFontHeight*2, 0, 0, 0, 400, FALSE, FALSE,
0,GB2312_CHARSET , OUT_DEFAULT_PRECIS,//ANSI_CHARSET
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
VARIABLE_PITCH | FF_SCRIPT, "楷体_GB2312");//DEFAULT_PITCH FF_MODERN
return true;
}
int CDrawDlg::GetMaxPages() const
{
return m_iMaxPages;
}
int CDrawDlg::GetTotalChars() const
{
int total=0;
for(int i=0;i<this->m_nColumns;i++)total+=this->m_piCharsColumns[i];
return total;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -