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

📄 example_3view.cpp

📁 基于mfc的ODBC数据库连接编程,并包含图形的报表的生成以及动态表格报表的建模
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Example_3View.cpp : implementation of the CExample_3View class
//

#include "stdafx.h"
#include "Example_3.h"

#include "Example_3Doc.h"
#include "Example_3View.h"

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

/////////////////////////////////////////////////////////////////////////////
// CExample_3View

IMPLEMENT_DYNCREATE(CExample_3View, CScrollView)

BEGIN_MESSAGE_MAP(CExample_3View, CScrollView)
	//{{AFX_MSG_MAP(CExample_3View)
	ON_COMMAND(ID_INDEX1, OnIndex1)
	ON_COMMAND(ID_INDEX2, OnIndex2)
	ON_COMMAND(ID_INDEX3, OnIndex3)
	ON_COMMAND(ID_FILE_PRINT_DIRECTLY,OnFilePrintDirectly)
	//}}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_3View construction/destruction

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

}

CExample_3View::~CExample_3View()
{

}

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

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CExample_3View drawing

void CExample_3View::OnDraw(CDC* pDC)
{
	CExample_3Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	if(m_option==1)
		Dline(n,fdn);
	if(m_option==2)
		Ptable(pDC);
}

void CExample_3View::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();

	
	// TODO: calculate the total size of this view
	SIZE Size={DRAWWIDTH,DRAWHEIGHT};
	SetScrollSizes(MM_TEXT,Size);
}

/////////////////////////////////////////////////////////////////////////////
// CExample_3View printing

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

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

	int pl=(int)(Ptable(pDC)/1440*2.54*10*10);//开始动态分页
	m_NumCols=1;
	m_NumRows=pl/m_PageHeight+(pl%m_PageHeight>0);//上章pl处为DRAWHEIGHT,动态分页结束,以上三行也是原理同第2章唯一不同之处,也是所谓的动态分页
	//调用Ptable返回整个打印图形的垂直高度,以此计算整个图形所需要的叶数,因为横向不用分页,所以总叶数就是m_NumRows		
	pInfo->SetMinPage(1);//设置最小打印页数即第一页的页号
	pInfo->SetMaxPage(m_NumRows*m_NumCols);//设置最大页数即最后一页的页号

	CScrollView::OnBeginPrinting(pDC,pInfo);
}

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

/////////////////////////////////////////////////////////////////////////////
// CExample_3View diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CExample_3View message handlers




void CExample_3View::Dline(int n, CString fdn)
{
	CExample_3Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->m_pRs->MoveFirst();
	if(pDoc->m_pRs->BOF||pDoc->m_pRs->EndOfFile)
		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(255,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(180,position,fdn);//position已经在上边定义过了 为20
	ClientDC.Rectangle(25,55,565,315);//绘制表格边界
	ClientDC.SelectObject(&Pen[1]);//以下三条开始为绘制直条做准备
	ClientDC.SelectObject(&Brush[1]);
	ClientDC.SelectObject(&font[1]);

	int x,y;//x,y分别是折线图上点的横纵坐标,为传给函数MoveTo,LineTo的参数
	int recn=16;//记录集中的记录数目
	int xspc;//每两点之间横坐标差的绝对值
	float hl;//记录集中该种价格指数的最低值
	int yl=185;//折线图在窗口内的最大纵坐标
	float scale;//(折线图在窗口内的最大纵坐标-折线图在窗口内的最小纵坐标)/(记录集中该种价格指数的最大值-记录集中该种价格指数的最小值)

	int loopn;

	int age;
	float fld;
	CString fy;

	xspc=(int)((565-25)/recn-1);
	switch(n)
	{
	case 1:hl=(float)(99);
		scale=(float)((yl-55)/(124.2-hl));
		break;
	case 2:hl=(float)(100.6);
		scale=(float)((yl-55)/(126.6-hl));
		break;
	case 3:hl=(float)(100.7);
		scale=(float)((yl-55)/(127.6-hl));
	}
	age=pDoc->m_rsRecSet.m_Cfy;
	switch(n)
	{
	case 1:fld=pDoc->m_rsRecSet.m_Cf1;
		break;
	case 2:fld=pDoc->m_rsRecSet.m_Cf2;
		break;
	case 3:fld=pDoc->m_rsRecSet.m_Cf3;
		break;
	}
	x=25;
	pDoc->m_pRs->MoveNext();
	ClientDC.MoveTo(x,315);
	ClientDC.LineTo(x,309);
	while(!pDoc->m_pRs->EndOfFile)
	{
		x=x+xspc;
		pDoc->m_pRs->MoveNext();
		ClientDC.MoveTo(x,315);
		ClientDC.LineTo(x,309);	
	}

	x=25;
	y=(int)(yl-(fld-hl)*scale);
	ClientDC.MoveTo(x,y);
	pDoc->m_pRs->MoveFirst();
	pDoc->m_pRs->MoveNext();
	loopn=1;
	while(!pDoc->m_pRs->EndOfFile)
	{
	fy.Format("%1d",age);
		if(fmod(loopn,2.0)!=0)
		ClientDC.TextOut(x-14,320,fy);

	age=pDoc->m_rsRecSet.m_Cfy;
	switch(n)
	{
	case 1:fld=pDoc->m_rsRecSet.m_Cf1;
		break;
	case 2:fld=pDoc->m_rsRecSet.m_Cf2;
		break;
	case 3:fld=pDoc->m_rsRecSet.m_Cf3;
		break;
	}
	x=x+xspc;
	y=(int)(yl-(fld-hl)*scale);
	ClientDC.LineTo(x,y);

	pDoc->m_pRs->MoveNext();
	loopn=loopn+1;

	}
	ClientDC.SelectObject(PtrOldPen);
	ClientDC.SelectObject(PtrOldBrush);
	ClientDC.SelectObject(oldFont);

}

⌨️ 快捷键说明

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