📄 childview.cpp
字号:
// ChildView.cpp : implementation of the CChildView class
//
#include "stdafx.h"
//#include "Preview.h"
#include "attendance.h"
#include "ChildView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(CChildView, CWrapperView)
/////////////////////////////////////////////////////////////////////////////
// CChildView
CChildView::CChildView()
{
}
CChildView::~CChildView()
{
}
BEGIN_MESSAGE_MAP(CChildView,CWrapperView)
//{{AFX_MSG_MAP(CChildView)
ON_WM_PAINT()
ON_COMMAND(ID_FILE_PRINT, OnFilePrint)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CChildView message handlers
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CWnd::PreCreateWindow(cs))
return FALSE;
cs.dwExStyle |= WS_EX_CLIENTEDGE;
cs.style &= ~WS_BORDER;
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL);
return TRUE;
}
void CChildView::OnPaint()
{
CPaintDC dc(this); // device context for painting
OnDraw(&dc);
// Do not call CWnd::OnPaint() for painting messages
}
void CChildView::OnDraw(CDC* pDC)
{
CAttendanceApp* app=(CAttendanceApp*)AfxGetApp();
CRect rectClient;
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
int cw=tm.tmMaxCharWidth;
int ch=tm.tmHeight;
bool bl=pDC->IsPrinting();
if(bl)//pDC->IsPrinting()
{
pDC->SetMapMode(MM_TEXT);
SIZE CurOrg;
CurOrg.cx=app->m_pMiddle->m_iLeft*100;
CurOrg.cy=app->m_pMiddle->m_iTop*100;
//打印区域的宽度和高度
SIZE CurRegion;
CurRegion.cx=app->m_pMiddle->m_iRight*100;
CurRegion.cy=app->m_pMiddle->m_iBottom*100;
pDC->HIMETRICtoDP(&CurOrg);
pDC->HIMETRICtoDP(&CurRegion);
CurRegion.cx=pDC->GetDeviceCaps(HORZRES)-CurRegion.cx;
CurRegion.cy=pDC->GetDeviceCaps(VERTRES)-CurRegion.cy;
CFont ft,*pOldFont;
LOGFONT lf;
char* chr;
CString s;
CSize size;
CRect rect;
int i;
int year;
int mth;
int monthday;
int j;
double fctwks;
int day;
int wk;
int wks;
CBrush Brugreen;
Brugreen.CreateSolidBrush(RGB(0,0,0));
if(app->m_pMiddle->m_iPrtSel==0 || app->m_pMiddle->m_iPrtSel==1)
{
rect.SetRect(CurOrg.cx,CurOrg.cy,CurRegion.cx,CurRegion.cy);
CRgn rgn;
rgn.CreateRectRgnIndirect(&rect);
pDC->FrameRgn(&rgn,&Brugreen,5,5);
rgn.DeleteObject();
::GetObject(GetCurrentObject(pDC->GetSafeHdc(),OBJ_FONT),sizeof(LOGFONT),&lf);
lf.lfHeight=ch*30/16;//17/16
lf.lfWidth=cw*26/25;
lf.lfWeight=FW_BLACK;
ft.CreateFontIndirect(&lf);
pOldFont=pDC->SelectObject(&ft);
chr = s.GetBuffer(20);
app->m_pMiddle->m_cMonth.GetWindowText(chr,20);
s=chr;
//size=pDC->GetOutputTabbedTextExtent(s,0,NULL);
size=pDC->GetOutputTextExtent(s);
pDC->SetTextAlign(TA_CENTER);//TA_LEFT
pDC->TextOut((CurOrg.cx+CurRegion.cx)/2,CurOrg.cy-size.cy/2,s);
// pDC->TextOut(CurOrg.cx+2*cw,CurOrg.cy+ch,s);//
pDC->SetTextAlign(TA_LEFT);
pDC->SelectObject(pOldFont);
ft.DeleteObject();
year = app->m_pMiddle->sAttend[0].tAmOnDuty.GetYear();
mth = app->m_pMiddle->sAttend[0].tAmOnDuty.GetMonth();
monthday=MonthDay[mth-1];
if(mth==2 && fmod(year,4)==0)
monthday++;
fctwks = 0;
for(j=0;j<=app->m_pMiddle->m_iCurItem;j++)
{
app->m_pMiddle->sAttend[j].tWork = app->m_pMiddle->sAttend[j].tAmOffDuty-app->m_pMiddle->sAttend[j].tAmOnDuty;
app->m_pMiddle->sAttend[j].tWork += app->m_pMiddle->sAttend[j].tPmOffDuty-app->m_pMiddle->sAttend[j].tPmOnDuty;
app->m_pMiddle->sAttend[j].tWork += app->m_pMiddle->sAttend[j].tNinOffDuty-app->m_pMiddle->sAttend[j].tNinOnDuty;
fctwks += (double)app->m_pMiddle->sAttend[j].tWork.GetHours()+(double)app->m_pMiddle->sAttend[j].tWork.GetMinutes()/60.0;
}
s.Format("本月法定工作日: %d天",monthday-app->m_pMiddle->m_iHoliday);
pDC->TextOut(CurOrg.cx+4*cw,CurOrg.cy+ch,s);//size.cy
// pDC->TextOut(CurOrg.cx+size.cx+4*cw,CurOrg.cy+ch,s);
s.Format("本月全勤工资:%6d元",app->m_pMiddle->m_iPay);
// pDC->TextOut((CurOrg.cx+CurRegion.cx)/2+6*cw,CurOrg.cy+ch,s);//size.cy
pDC->TextOut(CurRegion.cx-16*cw,CurOrg.cy+ch,s);
fctwks /=8.0;
fctwks = floor(fctwks*10.0)/10.0;
s.Format("本月实际出勤: %.1f天",fctwks);
pDC->TextOut(CurOrg.cx+4*cw,CurOrg.cy+ch*2,s);//size.cy*2
// pDC->TextOut(CurOrg.cx+size.cx+4*cw,CurOrg.cy+ch*2,s);
s.Format("本月出勤工资:%6d元",app->m_pMiddle->m_iObtain);
// pDC->TextOut((CurOrg.cx+CurRegion.cx)/2+6*cw,CurOrg.cy+ch*2,s);//size.cy*2
pDC->TextOut(CurRegion.cx-16*cw,CurOrg.cy+ch*2,s);
int day = app->m_pMiddle->sAttend[0].tAmOnDuty.GetDay();
int wk = app->m_pMiddle->sAttend[0].tAmOnDuty.GetDayOfWeek();//1..7
int wks = day/7;
int surplus = fmod(day-1,7);//0..6
int wk1 = surplus>=wk ? wk+7-surplus : wk-surplus;
pDC->SetTextAlign(TA_CENTER);
s="日期";
pDC->TextOut(CurOrg.cx+3*cw,CurOrg.cy+ch*3,s);
s="星期";
pDC->TextOut(CurOrg.cx+6*cw,CurOrg.cy+ch*3,s);
s="休?";
pDC->TextOut(CurOrg.cx+19*cw/2,CurOrg.cy+ch*3,s);
s="Am 点到";
pDC->TextOut(CurOrg.cx+13*cw,CurOrg.cy+ch*3,s);
s="午饭";
pDC->TextOut(CurOrg.cx+17*cw,CurOrg.cy+ch*3,s);
s="Pm 点到";
pDC->TextOut(CurOrg.cx+21*cw,CurOrg.cy+ch*3,s);
s="下班";
pDC->TextOut(CurOrg.cx+25*cw,CurOrg.cy+ch*3,s);
s="晚间工作";
pDC->TextOut(CurOrg.cx+59*cw/2,CurOrg.cy+ch*3,s);
s="准备就寝";
pDC->TextOut(CurOrg.cx+69*cw/2,CurOrg.cy+ch*3,s);
s="日工时";
pDC->TextOut((CurOrg.cx+37*cw+CurRegion.cx-2*cw)/2,CurOrg.cy+ch*3,s);
for(i=1;i<=monthday;i++)
{
s.Format("%d",i);
pDC->TextOut(CurOrg.cx+3*cw,CurOrg.cy+ch*(3+i),s);
wk = wk1+fmod(i-1,7);
if(wk>7) wk-=7;
s=WeekTable[wk-1];
pDC->TextOut(CurOrg.cx+6*cw,CurOrg.cy+ch*(3+i),s);
for(j=0;j<app->m_pMiddle->m_iHoliday && app->m_pMiddle->m_ArrayHoliday[j]!=i;j++);
if(j<app->m_pMiddle->m_iHoliday)
{
s="公休";
pDC->TextOut(CurOrg.cx+19*cw/2,CurOrg.cy+ch*(3+i),s);
}
for(j=0;j<=app->m_pMiddle->m_iCurItem && app->m_pMiddle->sAttend[j].tAmOnDuty.GetDay()!=i;j++);
if(j<=app->m_pMiddle->m_iCurItem)
{
if(app->m_pMiddle->sAttend[j].tAmOnDuty!=app->m_pMiddle->sAttend[j].tAmOffDuty)
{
s=app->m_pMiddle->sAttend[j].tAmOnDuty.Format("%H:%M");
pDC->TextOut(CurOrg.cx+13*cw,CurOrg.cy+ch*(3+i),s);
s=app->m_pMiddle->sAttend[j].tAmOffDuty.Format("%H:%M");
pDC->TextOut(CurOrg.cx+17*cw,CurOrg.cy+ch*(3+i),s);
}
if(app->m_pMiddle->sAttend[j].tPmOnDuty!=app->m_pMiddle->sAttend[j].tPmOffDuty)
{
s=app->m_pMiddle->sAttend[j].tPmOnDuty.Format("%H:%M");
pDC->TextOut(CurOrg.cx+21*cw,CurOrg.cy+ch*(3+i),s);
s=app->m_pMiddle->sAttend[j].tPmOffDuty.Format("%H:%M");
pDC->TextOut(CurOrg.cx+25*cw,CurOrg.cy+ch*(3+i),s);
}
if(app->m_pMiddle->sAttend[j].tNinOnDuty!=app->m_pMiddle->sAttend[j].tNinOffDuty)
{
s=app->m_pMiddle->sAttend[j].tNinOnDuty.Format("%H:%M");
pDC->TextOut(CurOrg.cx+59*cw/2,CurOrg.cy+ch*(3+i),s);
s=app->m_pMiddle->sAttend[j].tNinOffDuty.Format("%H:%M");
pDC->TextOut(CurOrg.cx+69*cw/2,CurOrg.cy+ch*(3+i),s);
}
if(app->m_pMiddle->sAttend[j].tWork!=0)
{
s=app->m_pMiddle->sAttend[j].tWork.Format("%H:%M");
pDC->TextOut((CurOrg.cx+37*cw+CurRegion.cx-2*cw)/2,CurOrg.cy+ch*(3+i),s);
}
}
}
for(i=0;i<=monthday+1 && CurOrg.cy+ch*(3+i)<=CurRegion.cy;i++)
{
pDC->MoveTo(CurOrg.cx+2*cw,CurOrg.cy+ch*(3+i));
pDC->LineTo(CurRegion.cx-2*cw,CurOrg.cy+ch*(3+i));
}
pDC->MoveTo(CurOrg.cx+2*cw,CurOrg.cy+ch*3);
pDC->LineTo(CurOrg.cx+2*cw,CurOrg.cy+ch*(3+monthday+1));
pDC->MoveTo(CurRegion.cx-2*cw,CurOrg.cy+ch*3);
pDC->LineTo(CurRegion.cx-2*cw,CurOrg.cy+ch*(3+monthday+1));
pDC->MoveTo(CurOrg.cx+4*cw,CurOrg.cy+ch*3);
pDC->LineTo(CurOrg.cx+4*cw,CurOrg.cy+ch*(3+monthday+1));
pDC->MoveTo(CurOrg.cx+8*cw,CurOrg.cy+ch*3);
pDC->LineTo(CurOrg.cx+8*cw,CurOrg.cy+ch*(3+monthday+1));
pDC->MoveTo(CurOrg.cx+11*cw,CurOrg.cy+ch*3);
pDC->LineTo(CurOrg.cx+11*cw,CurOrg.cy+ch*(3+monthday+1));
pDC->MoveTo(CurOrg.cx+15*cw,CurOrg.cy+ch*3);
pDC->LineTo(CurOrg.cx+15*cw,CurOrg.cy+ch*(3+monthday+1));
pDC->MoveTo(CurOrg.cx+19*cw-1,CurOrg.cy+ch*3);
pDC->LineTo(CurOrg.cx+19*cw-1,CurOrg.cy+ch*(3+monthday+1));
pDC->MoveTo(CurOrg.cx+23*cw+1,CurOrg.cy+ch*3);
pDC->LineTo(CurOrg.cx+23*cw+1,CurOrg.cy+ch*(3+monthday+1));
pDC->MoveTo(CurOrg.cx+27*cw,CurOrg.cy+ch*3);
pDC->LineTo(CurOrg.cx+27*cw,CurOrg.cy+ch*(3+monthday+1));
pDC->MoveTo(CurOrg.cx+32*cw,CurOrg.cy+ch*3);
pDC->LineTo(CurOrg.cx+32*cw,CurOrg.cy+ch*(3+monthday+1));
pDC->MoveTo(CurOrg.cx+37*cw,CurOrg.cy+ch*3);
pDC->LineTo(CurOrg.cx+37*cw,CurOrg.cy+ch*(3+monthday+1));
//pDC->MoveTo(CurOrg.cx+39*cw,CurOrg.cy+size.cy*3);
//pDC->LineTo(CurOrg.cx+39*cw,CurOrg.cy+size.cy*(3+monthday+1));
}
if(app->m_pMiddle->m_iPrtSel == 2)
{
CurOrg.cy=1;
int cy=CurOrg.cy;
CurRegion.cy=pDC->GetDeviceCaps(VERTRES);
HDC hdc=pDC->GetSafeHdc();
int iMonths=app->m_pMiddle->m_iMonths;
int pageHeight=pDC->GetDeviceCaps(VERTRES);
for(int k=0;k<=iMonths;k++)//1
{
::GetObject(GetCurrentObject(pDC->GetSafeHdc(),OBJ_FONT),sizeof(LOGFONT),&lf);
lf.lfHeight=ch*30/16;
lf.lfWidth=cw*26/25;
lf.lfWeight=FW_BLACK;
ft.CreateFontIndirect(&lf);
pOldFont=pDC->SelectObject(&ft);
struct YearTotal sYearTotal = app->m_pMiddle->sYearTotal[k];//m_nCurPage+
int iDays = sYearTotal.iDayItems;
s.Format("%d年%2d月份月报 ", sYearTotal.sAttend[0].tAmOnDuty.GetYear(),sYearTotal.sAttend[0].tAmOnDuty.GetMonth());//,sYearTotal[k].sAttend[0].tAmOnDuty.GetDay());
//size=pDC->GetOutputTabbedTextExtent(s,0,NULL);
size=pDC->GetOutputTextExtent(s);
pDC->SetTextAlign(TA_LEFT);//TA_CENTER
// pDC->TextOut((CurOrg.cx+CurRegion.cx)/2,CurOrg.cy-size.cy/2,s);
pDC->TextOut(CurOrg.cx+2*cw,CurOrg.cy,s);//+ch
pDC->SetTextAlign(TA_LEFT);
pDC->SelectObject(pOldFont);
ft.DeleteObject();
year = sYearTotal.sAttend[0].tAmOnDuty.GetYear();
mth = sYearTotal.sAttend[0].tAmOnDuty.GetMonth();
monthday=MonthDay[mth-1];
if(mth==2 && fmod(year,4)==0)
monthday++;
fctwks = 0;
for(j=0;j<=iDays;j++)
{
sYearTotal.sAttend[j].tWork = sYearTotal.sAttend[j].tAmOffDuty-sYearTotal.sAttend[j].tAmOnDuty;
sYearTotal.sAttend[j].tWork += sYearTotal.sAttend[j].tPmOffDuty-sYearTotal.sAttend[j].tPmOnDuty;
sYearTotal.sAttend[j].tWork += sYearTotal.sAttend[j].tNinOffDuty-sYearTotal.sAttend[j].tNinOnDuty;
fctwks += (double)sYearTotal.sAttend[j].tWork.GetHours()+(double)sYearTotal.sAttend[j].tWork.GetMinutes()/60.0;
}
int iWorkDays = monthday-sYearTotal.iHoliday;
s.Format("本月法定工作日: %d天",iWorkDays);
// pDC->TextOut(CurOrg.cx+2*cw,CurOrg.cy+size.cy,s);
pDC->TextOut(CurOrg.cx+size.cx+4*cw,CurOrg.cy,s);//+ch
s.Format("本月全勤工资:%6d元",sYearTotal.iPay);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -