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

📄 childview.cpp

📁 一个完整的考勤处理软件
💻 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;//m_psd.ptPaperSize.x-
		CurRegion.cy=app->m_pMiddle->m_iBottom*100;//m_psd.ptPaperSize.y-
		pDC->HIMETRICtoDP(&CurOrg);
		pDC->HIMETRICtoDP(&CurRegion);
		CurRegion.cx=pDC->GetDeviceCaps(HORZRES)-CurRegion.cx;
		CurRegion.cy=pDC->GetDeviceCaps(VERTRES)-CurRegion.cy;
		CString s;
		CSize size;
		CRect rect;
		rect.SetRect(CurOrg.cx,CurOrg.cy,CurRegion.cx,CurRegion.cy);
		CRgn rgn;
		rgn.CreateRectRgnIndirect(&rect);
		CBrush Brugreen;
		Brugreen.CreateSolidBrush(RGB(0,0,0));
		pDC->FrameRgn(&rgn,&Brugreen,5,5);
		rgn.DeleteObject();
		LOGFONT lf;
		::GetObject(GetCurrentObject(pDC->GetSafeHdc(),OBJ_FONT),sizeof(LOGFONT),&lf);
		lf.lfHeight=ch*17/16;
		lf.lfWidth=cw*26/25;
		lf.lfWeight=FW_BLACK;

		CFont ft,*pOldFont;
		ft.CreateFontIndirect(&lf);
		pOldFont=pDC->SelectObject(&ft);
		char* 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);
		pDC->TextOut((CurOrg.cx+CurRegion.cx)/2,CurOrg.cy-size.cy/2,s);

		pDC->SetTextAlign(TA_LEFT);
		pDC->SelectObject(pOldFont);
		ft.DeleteObject();
		int year = app->m_pMiddle->sAttend[0].tAmOnDuty.GetYear();
		int mth = app->m_pMiddle->sAttend[0].tAmOnDuty.GetMonth();
		int monthday=MonthDay[mth-1];
		if(mth==2 && fmod(year,4)==0)
			monthday++;

		double fctwks = 0;
		for(int 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;
			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+2*cw,CurOrg.cy+size.cy,s);
		s.Format("本月全勤工资:    %d元",app->m_pMiddle->m_iPay);
		pDC->TextOut((CurOrg.cx+CurRegion.cx)/2+2*cw,CurOrg.cy+size.cy,s);
		fctwks /=8.0;
		s.Format("本月实际出勤:   %.1f天",fctwks);
		pDC->TextOut(CurOrg.cx+2*cw,CurOrg.cy+size.cy*2,s);
		s.Format("本月出勤工资:    %4d元",app->m_pMiddle->m_iObtain);
		pDC->TextOut((CurOrg.cx+CurRegion.cx)/2+2*cw,CurOrg.cy+size.cy*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+size.cy*3,s);
		s="星期";
		pDC->TextOut(CurOrg.cx+6*cw,CurOrg.cy+size.cy*3,s);
		s="休?";
		pDC->TextOut(CurOrg.cx+10*cw,CurOrg.cy+size.cy*3,s);
		s="Am 点到";
		pDC->TextOut(CurOrg.cx+15*cw,CurOrg.cy+size.cy*3,s);
		s="午饭";
		pDC->TextOut(CurOrg.cx+21*cw,CurOrg.cy+size.cy*3,s);
		s="Pm 点到";
		pDC->TextOut(CurOrg.cx+27*cw,CurOrg.cy+size.cy*3,s);
		s="下班";
		pDC->TextOut(CurOrg.cx+33*cw,CurOrg.cy+size.cy*3,s);
		s="日工时";
		pDC->TextOut(CurOrg.cx+40*cw,CurOrg.cy+size.cy*3,s);
		for(int i=1;i<=monthday;i++)
		{
			s.Format("%d",i);
			pDC->TextOut(CurOrg.cx+3*cw,CurOrg.cy+size.cy*(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+size.cy*(3+i),s);

			for(int 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+10*cw,CurOrg.cy+size.cy*(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)
			{
				s=app->m_pMiddle->sAttend[j].tAmOnDuty.Format("%H:%M");
				pDC->TextOut(CurOrg.cx+15*cw,CurOrg.cy+size.cy*(3+i),s);

				s=app->m_pMiddle->sAttend[j].tAmOffDuty.Format("%H:%M");
				pDC->TextOut(CurOrg.cx+21*cw,CurOrg.cy+size.cy*(3+i),s);

				s=app->m_pMiddle->sAttend[j].tPmOnDuty.Format("%H:%M");
				pDC->TextOut(CurOrg.cx+27*cw,CurOrg.cy+size.cy*(3+i),s);

				s=app->m_pMiddle->sAttend[j].tPmOffDuty.Format("%H:%M");
				pDC->TextOut(CurOrg.cx+33*cw,CurOrg.cy+size.cy*(3+i),s);

				s=app->m_pMiddle->sAttend[j].tWork.Format("%H:%M");
				pDC->TextOut(CurOrg.cx+40*cw,CurOrg.cy+size.cy*(3+i),s);
			}

		}

		for(i=0;i<=monthday+1 && CurOrg.cy+size.cy*(3+i)<=CurRegion.cy;i++)
		{
			pDC->MoveTo(CurOrg.cx+2*cw,CurOrg.cy+size.cy*(3+i));
			pDC->LineTo(CurRegion.cx-2*cw,CurOrg.cy+size.cy*(3+i));
		}
		pDC->MoveTo(CurOrg.cx+2*cw,CurOrg.cy+size.cy*3);
		pDC->LineTo(CurOrg.cx+2*cw,CurOrg.cy+size.cy*(3+monthday+1));
		pDC->MoveTo(CurRegion.cx-2*cw,CurOrg.cy+size.cy*3);
		pDC->LineTo(CurRegion.cx-2*cw,CurOrg.cy+size.cy*(3+monthday+1));

		pDC->MoveTo(CurOrg.cx+4*cw,CurOrg.cy+size.cy*3);
		pDC->LineTo(CurOrg.cx+4*cw,CurOrg.cy+size.cy*(3+monthday+1));
		pDC->MoveTo(CurOrg.cx+8*cw,CurOrg.cy+size.cy*3);
		pDC->LineTo(CurOrg.cx+8*cw,CurOrg.cy+size.cy*(3+monthday+1));
		pDC->MoveTo(CurOrg.cx+12*cw,CurOrg.cy+size.cy*3);
		pDC->LineTo(CurOrg.cx+12*cw,CurOrg.cy+size.cy*(3+monthday+1));
		pDC->MoveTo(CurOrg.cx+18*cw,CurOrg.cy+size.cy*3);
		pDC->LineTo(CurOrg.cx+18*cw,CurOrg.cy+size.cy*(3+monthday+1));
		pDC->MoveTo(CurOrg.cx+24*cw-1,CurOrg.cy+size.cy*3);
		pDC->LineTo(CurOrg.cx+24*cw-1,CurOrg.cy+size.cy*(3+monthday+1));
		pDC->MoveTo(CurOrg.cx+24*cw+1,CurOrg.cy+size.cy*3);
		pDC->LineTo(CurOrg.cx+24*cw+1,CurOrg.cy+size.cy*(3+monthday+1));
		pDC->MoveTo(CurOrg.cx+30*cw,CurOrg.cy+size.cy*3);
		pDC->LineTo(CurOrg.cx+30*cw,CurOrg.cy+size.cy*(3+monthday+1));
		pDC->MoveTo(CurOrg.cx+36*cw,CurOrg.cy+size.cy*3);
		pDC->LineTo(CurOrg.cx+36*cw,CurOrg.cy+size.cy*(3+monthday+1));
		if(app->m_pMiddle->m_bChkYear==true)
		{
			ft.CreateFontIndirect(&lf);
			pDC->SelectObject(&ft);
			chr = s.GetBuffer(20);
			app->m_pMiddle->m_cYear.GetWindowText(chr,20);
			s=chr;
			pDC->TextOut((CurOrg.cx+CurRegion.cx)/2,CurOrg.cy+size.cy*(4+i),s);
			pDC->SelectObject(pOldFont);
			ft.DeleteObject();

			s="月份";
			pDC->TextOut(CurOrg.cx+7*cw/2,CurOrg.cy+size.cy*(6+i),s);
			s="法定工作日";
			pDC->TextOut(CurOrg.cx+17*cw/2,CurOrg.cy+size.cy*(6+i),s);
			s="全勤工资";
			pDC->TextOut(CurOrg.cx+16*cw,CurOrg.cy+size.cy*(6+i),s);
			s="实际出勤日";
			pDC->TextOut(CurOrg.cx+24*cw,CurOrg.cy+size.cy*(6+i),s);
			s="出勤工资";
			pDC->TextOut(CurOrg.cx+32*cw,CurOrg.cy+size.cy*(6+i),s);
			s="实发工资";
			pDC->TextOut(CurOrg.cx+40*cw,CurOrg.cy+size.cy*(6+i),s);

			int iMonths=app->m_pMiddle->m_iMonths;
			for(int k=0;k<=iMonths;k++)
			{
				mth = app->m_pMiddle->sYearTotal[k].sAttend[0].tAmOnDuty.GetMonth();
				s.Format("%d月",mth);
				pDC->TextOut(CurOrg.cx+7*cw/2,CurOrg.cy+size.cy*(7+i+k),s);

				monthday=MonthDay[mth-1];
				if(mth==2 && fmod(year,4)==0)
					monthday++;
				int workday=monthday-app->m_pMiddle->sYearTotal[k].iHoliday;
				s.Format("%d天",workday);
				pDC->TextOut(CurOrg.cx+8*cw,CurOrg.cy+size.cy*(7+i+k),s);
				s.Format("%d元",app->m_pMiddle->sYearTotal[k].iPay);
				pDC->TextOut(CurOrg.cx+16*cw,CurOrg.cy+size.cy*(7+i+k),s);
				fctwks=0;
				for(int j=0;j<=app->m_pMiddle->sYearTotal[k].iDayItems;j++)
				{
					app->m_pMiddle->sYearTotal[k].sAttend[j].tWork = app->m_pMiddle->sYearTotal[k].sAttend[j].tAmOffDuty-app->m_pMiddle->sYearTotal[k].sAttend[j].tAmOnDuty;
					app->m_pMiddle->sYearTotal[k].sAttend[j].tWork += app->m_pMiddle->sYearTotal[k].sAttend[j].tPmOffDuty-app->m_pMiddle->sYearTotal[k].sAttend[j].tPmOnDuty;
					fctwks += (double)app->m_pMiddle->sYearTotal[k].sAttend[j].tWork.GetHours()+(double)app->m_pMiddle->sYearTotal[k].sAttend[j].tWork.GetMinutes()/60.0;
				}
				fctwks /=8.0;
				s.Format("%.1f天",fctwks);
				pDC->TextOut(CurOrg.cx+24*cw,CurOrg.cy+size.cy*(7+i+k),s);
				int iObtain=app->m_pMiddle->sYearTotal[k].iPay*fctwks/workday;
				s.Format("%4d元",iObtain);
				pDC->TextOut(CurOrg.cx+32*cw,CurOrg.cy+size.cy*(7+i+k),s);
				s.Format("%4d元",app->m_pMiddle->sYearTotal[k].iFactPay);
				pDC->TextOut(CurOrg.cx+40*cw,CurOrg.cy+size.cy*(7+i+k),s);

			}
			for(j=0;j<=iMonths+2 && CurOrg.cy+size.cy*(6+i+j)<=CurRegion.cy;j++)
			{
				pDC->MoveTo(CurOrg.cx+2*cw,CurOrg.cy+size.cy*(6+i+j));
				pDC->LineTo(CurRegion.cx-2*cw,CurOrg.cy+size.cy*(6+i+j));
			}
			pDC->MoveTo(CurOrg.cx+2*cw,CurOrg.cy+size.cy*(6+i));
			pDC->LineTo(CurOrg.cx+2*cw,CurOrg.cy+size.cy*(6+i+iMonths+2));
			pDC->MoveTo(CurRegion.cx-2*cw,CurOrg.cy+size.cy*(6+i));
			pDC->LineTo(CurRegion.cx-2*cw,CurOrg.cy+size.cy*(6+i+iMonths+2));

			pDC->MoveTo(CurOrg.cx+5*cw,CurOrg.cy+size.cy*(6+i));
			pDC->LineTo(CurOrg.cx+5*cw,CurOrg.cy+size.cy*(6+i+iMonths+2));
			pDC->MoveTo(CurOrg.cx+12*cw,CurOrg.cy+size.cy*(6+i));
			pDC->LineTo(CurOrg.cx+12*cw,CurOrg.cy+size.cy*(6+i+iMonths+2));
			pDC->MoveTo(CurOrg.cx+20*cw,CurOrg.cy+size.cy*(6+i));
			pDC->LineTo(CurOrg.cx+20*cw,CurOrg.cy+size.cy*(6+i+iMonths+2));
			pDC->MoveTo(CurOrg.cx+28*cw,CurOrg.cy+size.cy*(6+i));
			pDC->LineTo(CurOrg.cx+28*cw,CurOrg.cy+size.cy*(6+i+iMonths+2));
			pDC->MoveTo(CurOrg.cx+36*cw,CurOrg.cy+size.cy*(6+i));
			pDC->LineTo(CurOrg.cx+36*cw,CurOrg.cy+size.cy*(6+i+iMonths+2));
		}

		pDC->SetTextAlign(TA_LEFT);
	}

}

void CChildView::OnFilePrint()
{
	CView::OnFilePrint();
}

BOOL CChildView::OnPreparePrinting(CPrintInfo* pInfo) 
{
	// TODO: call DoPreparePrinting to invoke the Print dialog box
//	CAttendanceApp* app=(CAttendanceApp*)AfxGetApp();//岚增
//	app->OnFilePrintSetup();
	return CWrapperView::OnPreparePrinting(pInfo);
}

⌨️ 快捷键说明

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