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

📄 printview.cpp

📁 自编的一个实用的学生成绩处理管理系统。支持.dbf文件
💻 CPP
字号:
// PrintView.cpp : implementation of the CPrintView class
//

#include "stdafx.h"
#include "MyStudent.h"

#include "MyStudentDoc.h"
#include "PrintView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CPrintView

IMPLEMENT_DYNCREATE(CPrintView, CScrollView)

BEGIN_MESSAGE_MAP(CPrintView, CScrollView)
	//{{AFX_MSG_MAP(CPrintView)
	ON_WM_CHAR()
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CPrintView construction/destruction

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

}

CPrintView::~CPrintView()
{
}

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

	return CScrollView::PreCreateWindow(cs);
}

void CPrintView::OnInitialUpdate()
{
	CSize sizeTotal;
	// TODO: calculate the total size of this view
	sizeTotal.cx = 100;
	sizeTotal.cy = 100;
	SetScrollSizes(MM_TEXT, sizeTotal);
	CScrollView::OnInitialUpdate();
	m_tagview=1;
	m_line=20;
	m_linebase=20;
	m_page=600;
	m_pagebase=600;

}

/////////////////////////////////////////////////////////////////////////////
// CPrintView drawing

void CPrintView::OnDraw(CDC* pDC)
{
	//--------------获取文档指针和记录集指针-----------------------
	CMyStudentDoc* pDoc=(CMyStudentDoc*)GetDocument();
	CMyStudentSet* pSet=(CMyStudentSet*)(&pDoc->m_myStudentSet);
	if(pSet->m_pDatabase==NULL)return;
	// ---------------------设置表格中要用到的字体-----------------
	CFont* oldfont;
	CFont title_font;
	CFont content_font;
	title_font.CreateFont(24,0,0,0,FW_THIN,FALSE,FALSE,FALSE,
		GB2312_CHARSET,OUT_TT_PRECIS,CLIP_TT_ALWAYS,
		DEFAULT_QUALITY,DEFAULT_PITCH,"华文琥珀");
	content_font.CreateFont(18,0,0,0,FW_THIN,FALSE,FALSE,FALSE,
		GB2312_CHARSET,OUT_TT_PRECIS,CLIP_TT_ALWAYS,
		DEFAULT_QUALITY,DEFAULT_PITCH,"FIXEDSYS");
	//-------------------------------------------------------------
	pDC->SetTextColor(RGB(68,56,156));
	pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextAlign(TA_CENTER|TA_BASELINE);//居中对齐
	//-------------------------------------------------------------
	CPoint start;
	CSize  rowteam;
	CSize  cellsize;
	char tempstr[12];
	if(m_tagview==1)//---显示整体情况
	{	
		start=CPoint(100,100);//表格起始左上角坐标
		rowteam=CSize(pDoc->m_recordcount,pSet->GetODBCFieldCount());
		cellsize=CSize(90,25);
		SetScrollSizes(MM_TEXT, CSize(rowteam.cy*cellsize.cx+2*start.x,
			rowteam.cx*cellsize.cy+cellsize.cy*pDoc->m_classanalysis.GetSize()+300));//设置图大小
		drawtable(pDC,start,rowteam,cellsize);//绘制表格
		//-----------------填入记录数据--------------------------------
		//------------------------写标题-------------------------------
		oldfont=pDC->SelectObject(&title_font);
		sprintf(tempstr,"%d",pDoc->m_recordcount);
		pDC->TextOut(start.x+cellsize.cx*pSet->GetODBCFieldCount()/2,
			start.y-cellsize.cy,pSet->GetTableName()+"(共"+tempstr+"人)");
		pDC->SelectObject(oldfont);
		pDC->SelectObject(&content_font);
		//---------------------写表头----------------------------------
		pDC->TextOut(start.x+(int)(cellsize.cx*0.5),start.y+cellsize.cy/2+6,"序 号");
		pDC->TextOut(start.x+(int)(cellsize.cx*1.5),start.y+cellsize.cy/2+6,"学 号");
		pDC->TextOut(start.x+(int)(cellsize.cx*2.5),start.y+cellsize.cy/2+6,"姓 名");
		pDC->TextOut(start.x+(int)(cellsize.cx*3.5),start.y+cellsize.cy/2+6,"班 级");
		pDC->TextOut(start.x+(int)(cellsize.cx*4.5),start.y+cellsize.cy/2+6,"平 时");
		pDC->TextOut(start.x+(int)(cellsize.cx*5.5),start.y+cellsize.cy/2+6,"期 中");
		pDC->TextOut(start.x+(int)(cellsize.cx*6.5),start.y+cellsize.cy/2+6,"期 末");
		pDC->TextOut(start.x+(int)(cellsize.cx*7.5),start.y+cellsize.cy/2+6,"最 终");
		pDC->TextOut(start.x+(int)(cellsize.cx*8.5),start.y+cellsize.cy/2+6,"备 注");
		//--------------------写记录集数据-----------------------------
		pSet->MoveFirst();
		for(int i=0;i<pDoc->m_recordcount;i++)
		{
			sprintf(tempstr,"%d",pSet->m_idnum);
			pDC->TextOut(start.x+(int)(cellsize.cx*0.5),start.y+cellsize.cy*(i+1)+cellsize.cy/2+6,tempstr);
			sprintf(tempstr,"%s",pSet->m_stunum);
			pDC->TextOut(start.x+(int)(cellsize.cx*1.5),start.y+cellsize.cy*(i+1)+cellsize.cy/2+6,tempstr);
			sprintf(tempstr,"%s",pSet->m_name);
			pDC->TextOut(start.x+(int)(cellsize.cx*2.5),start.y+cellsize.cy*(i+1)+cellsize.cy/2+6,tempstr);
			sprintf(tempstr,"%s",pSet->m_class);
			pDC->TextOut(start.x+(int)(cellsize.cx*3.5),start.y+cellsize.cy*(i+1)+cellsize.cy/2+6,tempstr);
			sprintf(tempstr,"%d",pSet->m_normal);
			pDC->TextOut(start.x+(int)(cellsize.cx*4.5),start.y+cellsize.cy*(i+1)+cellsize.cy/2+6,tempstr);
			sprintf(tempstr,"%d",pSet->m_midterm);
			pDC->TextOut(start.x+(int)(cellsize.cx*5.5),start.y+cellsize.cy*(i+1)+cellsize.cy/2+6,tempstr);
			sprintf(tempstr,"%d",pSet->m_endterm);
			pDC->TextOut(start.x+(int)(cellsize.cx*6.5),start.y+cellsize.cy*(i+1)+cellsize.cy/2+6,tempstr);
			sprintf(tempstr,"%d",pSet->m_final);
			pDC->TextOut(start.x+(int)(cellsize.cx*7.5),start.y+cellsize.cy*(i+1)+cellsize.cy/2+6,tempstr);
			sprintf(tempstr,"%s",pSet->m_note);
			pDC->TextOut(start.x+(int)(cellsize.cx*8.5),start.y+cellsize.cy*(i+1)+cellsize.cy/2+6,tempstr);
			if(pSet->IsEOF())break;
			pSet->SetAbsolutePosition(i+2);//记录集从1到recordcount
		}
		pSet->MoveFirst();
		//=====================成绩分析数据表格==============================================
		start=CPoint(start.x-50,start.y+cellsize.cy*rowteam.cx+100);//表格起始左上角坐标
		rowteam=CSize(pDoc->m_classanalysis.GetSize(),10);
		cellsize=CSize(90,25);
		drawtable(pDC,start,rowteam,cellsize);//绘制表格
		oldfont=pDC->SelectObject(&title_font);//绘制表格标题
		pDC->TextOut(start.x+cellsize.cx*10/2,start.y-cellsize.cy,"学生成绩分析表");
		pDC->SelectObject(oldfont);
		//----------------绘制表头------------------------------------
		char fieldstr[10][10]={"班级名称","有效人数","50分以下","50-59分","60-69分",
			"70-79分","80-89分","90-100分","平均成绩",	"通过率"};		
		for(i=0;i<10;i++)
		{
			pDC->TextOut(start.x+(int)((i+0.5)*cellsize.cx),start.y+cellsize.cy/2+6,fieldstr[i]);
		}
		//----------------绘制内容------------------------------------
		for(i=0;i<pDoc->m_classanalysis.GetSize();i++)
		{
			sprintf(tempstr,"%s",((CClassAnalysis*)(pDoc->m_classanalysis.GetAt(i)))->m_classname);
			pDC->TextOut(start.x+int(cellsize.cx*0.5),start.y+(int)((i+1.5)*cellsize.cy)+6,tempstr);
			sprintf(tempstr,"%d",((CClassAnalysis*)(pDoc->m_classanalysis.GetAt(i)))->m_classnum);
			pDC->TextOut(start.x+int(cellsize.cx*1.5),start.y+(int)((i+1.5)*cellsize.cy)+6,tempstr);
			sprintf(tempstr,"%d",((CClassAnalysis*)(pDoc->m_classanalysis.GetAt(i)))->m_50);
			pDC->TextOut(start.x+int(cellsize.cx*2.5),start.y+(int)((i+1.5)*cellsize.cy)+6,tempstr);
			sprintf(tempstr,"%d",((CClassAnalysis*)(pDoc->m_classanalysis.GetAt(i)))->m_50_59);
			pDC->TextOut(start.x+int(cellsize.cx*3.5),start.y+(int)((i+1.5)*cellsize.cy)+6,tempstr);
			sprintf(tempstr,"%d",((CClassAnalysis*)(pDoc->m_classanalysis.GetAt(i)))->m_60_69);
			pDC->TextOut(start.x+int(cellsize.cx*4.5),start.y+(int)((i+1.5)*cellsize.cy)+6,tempstr);
			sprintf(tempstr,"%d",((CClassAnalysis*)(pDoc->m_classanalysis.GetAt(i)))->m_70_79);
			pDC->TextOut(start.x+int(cellsize.cx*5.5),start.y+(int)((i+1.5)*cellsize.cy)+6,tempstr);
			sprintf(tempstr,"%d",((CClassAnalysis*)(pDoc->m_classanalysis.GetAt(i)))->m_80_89);
			pDC->TextOut(start.x+int(cellsize.cx*6.5),start.y+(int)((i+1.5)*cellsize.cy)+6,tempstr);
			sprintf(tempstr,"%d",((CClassAnalysis*)(pDoc->m_classanalysis.GetAt(i)))->m_90_100);
			pDC->TextOut(start.x+int(cellsize.cx*7.5),start.y+(int)((i+1.5)*cellsize.cy)+6,tempstr);
			sprintf(tempstr,"%7.4f",((CClassAnalysis*)(pDoc->m_classanalysis.GetAt(i)))->m_average);
			pDC->TextOut(start.x+int(cellsize.cx*8.5),start.y+(int)((i+1.5)*cellsize.cy)+6,tempstr);
			sprintf(tempstr,"%7.5f",((CClassAnalysis*)(pDoc->m_classanalysis.GetAt(i)))->m_passrate);
			pDC->TextOut(start.x+int(cellsize.cx*9.5),start.y+(int)((i+1.5)*cellsize.cy)+6,tempstr);
		}
	}
	//------------------------------------------------------------------
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	else if(m_tagview==0)//按班级显示数据
	{
		SetScrollSizes(MM_TEXT, CSize(100,100));
		CSize aa=(100,100);
	}
}

//===============================================================================
//---------------------绘制表格-------------------------------------------------
void CPrintView::drawtable(CDC *pDC, CPoint start, CSize rowteam, CSize cellsize)
{
	//参数说明:
	//pDC:绘图设备描述表;	start:表格的左上角坐标;		
	//rowteam:表格的行数(不记表头行)和列数	cellsize:表格单元格的宽度和高度。
	//-------------------------------------------
	CPen outborder;
	outborder.CreatePen(PS_SOLID,2,RGB(0,0,0));
	CPen inborder;
	inborder.CreatePen(PS_SOLID,1,RGB(128,128,128));
	//----------------绘制外框-------------------
	pDC->SelectObject(&outborder);
	pDC->Rectangle(start.x-3,start.y-3,
		start.x+rowteam.cy*cellsize.cx+4,
		start.y+(rowteam.cx+1)*cellsize.cy+4);
	//----------------绘制内框-------------------
	pDC->SelectObject(&inborder);
	pDC->Rectangle(start.x,start.y,
		start.x+rowteam.cy*cellsize.cx,
		start.y+(rowteam.cx+1)*cellsize.cy);
	//---------------------------------------------
	pDC->SelectObject(&outborder);
	pDC->MoveTo(start.x,start.y+cellsize.cy);
	pDC->LineTo(start.x+rowteam.cy*cellsize.cx-2,start.y+cellsize.cy);
	//---------------绘制网格----------------------
	pDC->SelectObject(&inborder);
	for(int i=0;i<rowteam.cx-1;i++)//横线
	{
		pDC->MoveTo(start.x,start.y+cellsize.cy*(i+2));
		pDC->LineTo(start.x+rowteam.cy*cellsize.cx,start.y+cellsize.cy*(i+2));
	}
	for(int j=0;j<rowteam.cy-1;j++)	//纵线
	{
		pDC->MoveTo(start.x+cellsize.cx*(j+1),start.y);
		pDC->LineTo(start.x+cellsize.cx*(j+1),start.y+cellsize.cy*(rowteam.cx+1));
	}
}


/////////////////////////////////////////////////////////////////////////////
// CPrintView printing

BOOL CPrintView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CPrintView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

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

/////////////////////////////////////////////////////////////////////////////
// CPrintView diagnostics

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

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

#endif //_DEBUG


⌨️ 快捷键说明

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