📄 printview.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 + -