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

📄 drawdlg.cpp

📁 这是一个信息管理系统的源代码
💻 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 + -