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

📄 example_2view.cpp

📁 基于mfc的DAO数据库连接编程,并包含图形的报表的生成以及表格报表的底层建模
💻 CPP
字号:
// Example_2View.cpp : implementation of the CExample_2View class
//

#include "stdafx.h"
#include "Example_2.h"

#include "Example_2Doc.h"
#include "Example_2View.h"

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

/////////////////////////////////////////////////////////////////////////////
// CExample_2View

IMPLEMENT_DYNCREATE(CExample_2View, CScrollView)

BEGIN_MESSAGE_MAP(CExample_2View, CScrollView)
	//{{AFX_MSG_MAP(CExample_2View)
	ON_COMMAND(ID_INDEX1, OnIndex1)
	ON_COMMAND(ID_INDEX2, OnIndex2)
	ON_COMMAND(ID_INDEX3, OnIndex3)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CExample_2View construction/destruction

CExample_2View::CExample_2View()
{
	// TODO: add construction code here

}

CExample_2View::~CExample_2View()
{
}

BOOL CExample_2View::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CExample_2View drawing

void CExample_2View::OnDraw(CDC* pDC)
{	
	
	CExample_2Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	if(m_option==1)
		Dbar(n,fdn);
	if(m_option==2)
	{

	pDoc->m_Exaset.MoveFirst();
	if(pDoc->m_Exaset.IsEOF()||pDoc->m_Exaset.IsBOF())
		return;
	pDC->SetMapMode(MM_TWIPS);

	LOGFONT logFont[2];

	logFont[0].lfHeight=460;
	logFont[0].lfWidth=0;
	logFont[0].lfEscapement=0;
	logFont[0].lfOrientation=0;
	logFont[0].lfWeight=FW_NORMAL;
	logFont[0].lfItalic=0;
	logFont[0].lfUnderline=0;
	logFont[0].lfStrikeOut=0;
	logFont[0].lfCharSet=ANSI_CHARSET;
	logFont[0].lfOutPrecision=OUT_DEFAULT_PRECIS;
	logFont[0].lfClipPrecision=OUT_DEFAULT_PRECIS;
	logFont[0].lfQuality=PROOF_QUALITY;
	logFont[0].lfPitchAndFamily=VARIABLE_PITCH|FF_ROMAN;
	strcpy(logFont[0].lfFaceName,"Times New Roman");
	
	
	logFont[1].lfHeight=360;
	logFont[1].lfWidth=0;
	logFont[1].lfEscapement=0;
	logFont[1].lfOrientation=0;
	logFont[1].lfWeight=FW_NORMAL;
	logFont[1].lfItalic=0;
	logFont[1].lfUnderline=0;
	logFont[1].lfStrikeOut=0;
	logFont[1].lfCharSet=ANSI_CHARSET;
	logFont[1].lfClipPrecision=CLIP_DEFAULT_PRECIS;
	logFont[1].lfQuality=PROOF_QUALITY;
	logFont[1].lfPitchAndFamily=VARIABLE_PITCH|FF_ROMAN;
	strcpy(logFont[0].lfFaceName,"Times New Roman");

	CFont font[2];

	font[0].CreateFontIndirect(&logFont[0]);
	font[1].CreateFontIndirect(&logFont[1]);
	CFont *oldFont=pDC->SelectObject(&font[0]);

	int vs1,vs2,vs3,vs4,vs;
	int hs;//开始的横坐标	
	int rw;//列宽
	int mlh;//max line height
	int pn,ph,ph0;//ph 应该是paper height ,pn应该是paper number
	int loopn;

	vs1=-900;
	vs2=-600;
	vs3=-400;
	vs4=-2400;

	hs=1100;
	
	rw=900;
//	ph=0;
	pn=0;
	ph0=14031+2780;

	RECT Rect0,Rect[11];

	Rect0.left=hs;
	Rect0.right=Rect0.left+rw*11;
	Rect0.top=vs1;
	Rect0.bottom=Rect0.top+vs2;

	Rect[0].left=hs;
	Rect[0].right=Rect[0].left+rw;
	Rect[0].top=Rect0.bottom+vs3;
	Rect[0].bottom=Rect[0].top+vs4;

	loopn=0;

	while(loopn<=9)
	{
		Rect[loopn+1].left=Rect[loopn].right;
		Rect[loopn+1].right=Rect[loopn+1].left+rw;
		Rect[loopn+1].top=Rect[0].top;
		Rect[loopn+1].bottom=Rect[0].bottom;
		loopn=loopn+1;

	}
	UINT nFormat1,nFormat2,nFormat3;
	nFormat1=DT_CENTER;
	nFormat2=DT_CENTER|DT_WORDBREAK;
	nFormat3=DT_CENTER|DT_WORDBREAK|DT_CALCRECT;

	CString Title,fth[11];
	Title="某地区国内生产总值表(单位:亿元)";
	fth[0]="年份";
	fth[1]="国民生产总值";
	fth[2]="国内生产总值";
	fth[3]="第一产业";
	fth[4]="第二产业";
	fth[5]="工业";
	fth[6]="建筑业";
	fth[7]="第三产业";
	fth[8]="交通运输仓储邮电通信业";
	fth[9]="批发和零售贸易餐饮业";
	fth[10]="人均国内生产总值(元)";

	pDC->DrawText(Title,-1,&Rect0,nFormat1);//写第一页的表头	

	pDC->SelectObject(&font[1]);

	vs=Rect[0].top+160;
	pDC->MoveTo(Rect[0].left,vs);//这两句是画表头下的横线
	pDC->LineTo(hs+rw*11,vs);

	loopn=0;
	while(loopn<=10)
	{
		pDC->DrawText(fth[loopn],-1,&Rect[loopn],nFormat2);
		loopn=loopn+1;
	}
	mlh=2300;
	CString fs[11];
	while(! pDoc->m_Exaset.IsBOF()&&! pDoc->m_Exaset.IsEOF())
	{
		vs=vs-mlh-100;
		pDC->MoveTo(Rect[0].left,vs);//这两句是画表的横线每行都画
		pDC->LineTo(hs+rw*11,vs);

		fs[0].Format("%1d",pDoc->m_Exaset.m_fy);
		fs[1].Format("%1d",pDoc->m_Exaset.m_f1);
		fs[2].Format("%1d",pDoc->m_Exaset.m_f2);
		fs[3].Format("%1d",pDoc->m_Exaset.m_f3);
		fs[4].Format("%1d",pDoc->m_Exaset.m_f4);
		fs[5].Format("%1d",pDoc->m_Exaset.m_f5);
		fs[6].Format("%1d",pDoc->m_Exaset.m_f6);
		fs[7].Format("%1d",pDoc->m_Exaset.m_f7);
		fs[8].Format("%1d",pDoc->m_Exaset.m_f8);
		fs[9].Format("%1d",pDoc->m_Exaset.m_f9);
		fs[10].Format("%1d",pDoc->m_Exaset.m_f10);

		mlh=0;
		loopn=0;
		while(loopn<=10)
			{
			fs[loopn].TrimRight();
			if(fs[loopn].GetLength()==0)
				fs[loopn]=" ";
			if(fabs(pDC->DrawText(fs[loopn],&Rect[loopn],nFormat3))>=mlh)
				mlh=int(fabs(pDC->DrawText(fs[loopn],&Rect[loopn],nFormat3)));
			loopn=loopn+1;

			}
			Rect[0].left=hs;
			Rect[0].right=Rect[0].left+rw;
			loopn=0;
			while(loopn<=9)
			{
				Rect[loopn+1].left=Rect[loopn].right;
				Rect[loopn+1].right=Rect[loopn+1].left+rw;
				loopn=loopn+1;
			}
			ph=vs+pn*ph0-1300;

			if(-ph>=ph0)
			{
				pn=pn+1;
				loopn=0;
				while(loopn<=9)
				{
				pDC->MoveTo(hs+(loopn+1)*rw-50,Rect0.bottom+vs3+160);
				pDC->LineTo(hs+(loopn+1)*rw-50,vs);
				loopn=loopn+1;
				}
				vs1=-900-ph0;

				Rect0.top=vs1;
				Rect0.bottom=Rect0.top+vs2;

				Rect[0].top=Rect0.bottom+vs3;
				Rect[0].bottom=Rect[0].top+vs4;

				loopn=0;
				while(loopn<=9)
				{
					Rect[loopn+1].top=Rect[0].top;
					Rect[loopn+1].bottom=Rect[0].bottom;
					loopn=loopn+1;
				}
				pDC->SelectObject(&font[0]);
				pDC->DrawText(Title,-1,&Rect0,nFormat1);//写第二页的表头
				pDC->SelectObject(&font[1]);

			    vs=Rect[0].top+160;
	
				pDC->MoveTo(Rect[0].left,vs);
				pDC->LineTo(hs+rw*11,vs);

				loopn=0;

				while(loopn<=10)//写第二页的表项
				{
					pDC->DrawText(fth[loopn],-1,&Rect[loopn],nFormat2);
					loopn=loopn+1;

				}
				mlh=2300;
				vs=vs-mlh-100;
				pDC->MoveTo(Rect[0].left,vs);
				pDC->LineTo(hs+rw*11,vs);

			}//if到此为止

		Rect[0].top=vs-80;
		Rect[0].bottom=Rect[0].top+vs4;
		loopn=1;
		while(loopn<=10)
		{
			Rect[loopn].top=Rect[0].top;
			Rect[loopn].bottom=Rect[0].bottom;
			loopn=loopn+1;

		}
		mlh=0;
		loopn=0;
		while(loopn<=10)
		{
			fs[loopn].TrimRight();
			if(fs[loopn].GetLength()==0)
				fs[loopn]=" ";
			if(fabs(pDC->DrawText(fs[loopn],&Rect[loopn],nFormat2))>=mlh)
				mlh=int(fabs(pDC->DrawText(fs[loopn],&Rect[loopn],nFormat2)));
			loopn=loopn+1;

		}
		pDoc->m_Exaset.MoveNext();
	}
		vs=vs-mlh-100;
	//	pDC->MoveTo(Rect[0].left,vs);//这两句是画第一行数据下的横线
	//	pDC->LineTo(hs+rw*11,vs);

		loopn=0;
		while(loopn<=9)//此循环用于画第2页竖线
		{
			pDC->MoveTo(hs+(loopn+1)*rw-50,Rect0.bottom+vs3+160);
			pDC->LineTo(hs+(loopn+1)*rw-50,vs);
			loopn=loopn+1;

		}
		pDC->SelectObject(oldFont);
	}	

}

void CExample_2View::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	
	CSize sizeTotal;
	// TODO: calculate the total size of this view
	SIZE Size={DRAWWIDTH,DRAWHEIGHT};
	SetScrollSizes(MM_TEXT,Size);
	sizeTotal.cx = sizeTotal.cy = 100;
	SetScrollSizes(MM_TEXT, sizeTotal);
}

/////////////////////////////////////////////////////////////////////////////
// CExample_2View printing

BOOL CExample_2View::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	m_option=2;
	return DoPreparePrinting(pInfo);
}

void CExample_2View::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// TODO: add extra initialization before printing
	m_PageHeight=pDC->GetDeviceCaps(VERTRES);//设置打印页面的高度相素,取得打印页面的尺寸
	m_PageHeight=pDC->GetDeviceCaps(HORZRES);//设置打印页面的款度相素

	m_NumRows=DRAWHEIGHT/m_PageHeight+(DRAWHEIGHT%m_PageHeight>0);
	m_NumCols=DRAWWIDTH/m_PageWidth+(DRAWWIDTH%m_PageWidth>0);
	pInfo->SetMinPage(1);//设置最小打印页数即第一页的页号
	pInfo->SetMaxPage(m_NumRows*m_NumCols);//设置最大页数即最后一页的页号

	CScrollView::OnBeginPrinting(pDC,pInfo);
}

void CExample_2View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CExample_2View diagnostics

#ifdef _DEBUG
void CExample_2View::AssertValid() const
{
	CScrollView::AssertValid();
}

void CExample_2View::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CExample_2Doc* CExample_2View::GetDocument() // non-debug version is inline
{
	
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CExample_2Doc)));
	return (CExample_2Doc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CExample_2View message handlers

void CExample_2View::Dbar(int n,CString fdn)
{
	CExample_2Doc* pDoc=GetDocument();
	ASSERT_VALID(pDoc);

	pDoc->m_Exaset.MoveFirst();
	if(pDoc->m_Exaset.IsBOF()||pDoc->m_Exaset.IsEOF())
		return;
	CClientDC ClientDC(this);
	OnPrepareDC(&ClientDC);

	CBrush Brush[2],Brushc;

	CPen Pen[2],Penc;

	CBrush *PtrOldBrush;
	CPen *PtrOldPen;

	Pen[0].CreatePen(PS_SOLID,1,RGB(200,200,254));
	Pen[1].CreatePen(PS_SOLID,1,RGB(0,0,0));

	Brush[0].CreateSolidBrush(RGB(254,234,234));
	Brush[1].CreateSolidBrush(RGB(0,255,0));

	Brushc.CreateSolidBrush(ClientDC.GetBkColor());
	Penc.CreatePen(PS_SOLID,1,ClientDC.GetBkColor());
	PtrOldBrush=ClientDC.SelectObject(&Brushc);
	PtrOldPen=ClientDC.SelectObject(&Penc);

	RECT RClient;
	GetClientRect(&RClient);
	ClientDC.Rectangle(&RClient);

	ClientDC.SelectObject(&Pen[0]);
	ClientDC.SelectObject(&Brush[0]);
	//PtrOldPen=ClientDC.SelectObject(&Pen[0]);
	//PtrOldBrush=ClientDC.SelectObject(&Brush[0]);//这句是为了给背景添色

	LOGFONT logFont[2];

	logFont[0].lfHeight=24;
	logFont[0].lfWidth=0;
	logFont[0].lfEscapement=0;
	logFont[0].lfOrientation=0;
	logFont[0].lfWeight=FW_NORMAL;
	logFont[0].lfItalic=0;
	logFont[0].lfUnderline=0;
	logFont[0].lfStrikeOut=0;
	logFont[0].lfCharSet=ANSI_CHARSET;
	logFont[0].lfOutPrecision=OUT_DEFAULT_PRECIS;
	logFont[0].lfClipPrecision=OUT_DEFAULT_PRECIS;
	logFont[0].lfQuality=PROOF_QUALITY;
	logFont[0].lfPitchAndFamily=VARIABLE_PITCH|FF_ROMAN;
	strcpy(logFont[0].lfFaceName,"Times New Roman");
	UINT position=20;
	
	logFont[1].lfHeight=16;
	logFont[1].lfWidth=6;
	logFont[1].lfEscapement=0;
	logFont[1].lfOrientation=0;
	logFont[1].lfWeight=FW_NORMAL;
	logFont[1].lfItalic=0;
	logFont[1].lfUnderline=0;
	logFont[1].lfStrikeOut=0;
	logFont[1].lfCharSet=ANSI_CHARSET;
	logFont[1].lfClipPrecision=CLIP_DEFAULT_PRECIS;
	logFont[1].lfQuality=PROOF_QUALITY;
	logFont[1].lfPitchAndFamily=VARIABLE_PITCH|FF_ROMAN;
	strcpy(logFont[1].lfFaceName,"Times New Roman");

	CFont font[2];

	font[0].CreateFontIndirect(&logFont[0]);
	font[1].CreateFontIndirect(&logFont[1]);

	CFont *oldFont=ClientDC.SelectObject(&font[0]);

	fdn="某地区"+fdn;
	ClientDC.TextOut(285,position,fdn);//position已经在上边定义过了 为20

	ClientDC.Rectangle(30,55,765,315);//绘制表格边界
	ClientDC.SelectObject(&Pen[1]);//以下三条开始为绘制直条做准备
	ClientDC.SelectObject(&Brush[1]);
	ClientDC.SelectObject(&font[1]);

	int x1,x2,y;//x1,x2分别是条形图中直条的左上角和右下角的x坐标;y是直条的左上角图标
	int fld,age;//fld从记录集中读取选定的变量(即选定数据表中的某个字段)的值;age从记录集中读取的对应与数据表中字段fy的变量的值。
	int rectw=15;//直条的宽度
	int space=10;//相邻两直条之间的距离
	float rectmaxh=140;//直条的最大高度
	float scale;//与记录内字段的最大比值
	int loopn;
	CString fy;

	switch(n)
	{
	case 1:scale=rectmaxh/6784;
		  break;
	case 2:scale=rectmaxh/6877;
		  break;
	case 10:scale=rectmaxh/544;

	}

	loopn=1;
	x2=30;

	while(!pDoc->m_Exaset.IsEOF())
	{
	age=pDoc->m_Exaset.m_fy;
	switch(n)
		{
			case 1:fld=pDoc->m_Exaset.m_f1;
				break;
			case 2:fld=pDoc->m_Exaset.m_f2;
				break;
			case 10:fld=pDoc->m_Exaset.m_f10;		
		}
	x1=x2+space;
	x2=x1+rectw;
	y=315-(int)(fld*scale);
	ClientDC.Rectangle(x1,y,x2,315);
	fy.Format("%1d",age);
	if(fmod(loopn,2.0)!=0)
		ClientDC.TextOut(x1-8,320,fy);
		pDoc->m_Exaset.MoveNext();
		loopn=loopn+1;
	}
	ClientDC.SelectObject(PtrOldPen);
	ClientDC.SelectObject(PtrOldBrush);
	ClientDC.SelectObject(oldFont);
}

void CExample_2View::OnIndex1() 
{
	// TODO: Add your command handler code here
	n=1;
	fdn="国民生产总值";
	Dbar(n,fdn);
}

void CExample_2View::OnIndex2() 
{
	// TODO: Add your command handler code here
	n=2;
	fdn="国内生产总值";
	Dbar(n,fdn);
}

void CExample_2View::OnIndex3() 
{
	// TODO: Add your command handler code here
	n=10;
	fdn="人均国内生产总值";
	Dbar(n,fdn);
}

void CExample_2View::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	CScrollView::OnPrepareDC(pDC, pInfo);
	if(pInfo==NULL)
		return;
	int CurRow=pInfo->m_nCurPage/m_NumCols+(pInfo->m_nCurPage%m_NumCols>0);
	int CurCol=(pInfo->m_nCurPage-1)%m_NumCols+1;

	pDC->SetViewportOrg
		(-m_PageWidth*(CurCol-1),
		-m_PageHeight*(CurRow-1));
}

BOOL CExample_2View::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class
	m_option=0;
	return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}

⌨️ 快捷键说明

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