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

📄 attendancedlg.cpp

📁 一个个人考勤软件,它从系统时钟获取时间信息,可逐日记录下个人每天的工作时间,按月统计汇总,按年形成文件.可以查看过去的记录,也可把记录按月打印出来.或进行年汇总
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			CWaitCursor wait;
			Serialize(ar);     // save mem_sCfgFile
			ar.Close();
			file.Close();
//			m_sOpenPath=m_sSavePath;
			m_iPay = sYearTotal[m_iMonths-1].iPay;
			m_iMonths = -1;
		}
	}

	if(m_iMonths>=0 && sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tAmOnDuty.Format("%Y%m%d")==m_Time.Format("%Y%m%d"))
	{
/*		m_iPay = sYearTotal[m_iMonths].iPay;
		m_iHoliday = sYearTotal[m_iMonths].iHoliday;
		m_ArrayHoliday.SetSize(m_iHoliday);
        for(int iIndex = 0; iIndex < m_iHoliday; ++iIndex)
			m_ArrayHoliday[iIndex] = sYearTotal[m_iMonths].ArrayHoliday[iIndex];

		for(int i=0;i<=m_iCurItem;i++)
			sAttend[i] = sYearTotal[m_iMonths].sAttend[i];
*/		m_iCurItem = sYearTotal[m_iMonths].iDayItems;
		sDuty.tAmOnDuty=sYearTotal[m_iMonths].sAttend[m_iCurItem].tAmOnDuty;
		sDuty.tAmOffDuty=sYearTotal[m_iMonths].sAttend[m_iCurItem].tAmOffDuty;
		sDuty.tPmOnDuty=sYearTotal[m_iMonths].sAttend[m_iCurItem].tPmOnDuty;
		sDuty.tPmOffDuty=sYearTotal[m_iMonths].sAttend[m_iCurItem].tPmOffDuty;
		sDuty.tNinOnDuty=sYearTotal[m_iMonths].sAttend[m_iCurItem].tNinOnDuty;
		sDuty.tNinOffDuty=sYearTotal[m_iMonths].sAttend[m_iCurItem].tNinOffDuty;
		sDuty.tWork=(sDuty.tAmOffDuty-sDuty.tAmOnDuty)+(sDuty.tPmOffDuty-sDuty.tPmOnDuty)+(sDuty.tNinOffDuty-sDuty.tNinOnDuty);
	}

	if(m_iMonths>=0 && sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tAmOnDuty.Format("%Y%m")==m_Time.Format("%Y%m")
		&& sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tAmOnDuty.GetDay()!=m_Time.GetDay())
	{
		sYearTotal[m_iMonths].iDayItems++;
		m_iCurItem = sYearTotal[m_iMonths].iDayItems;
		sYearTotal[m_iMonths].sAttend[m_iCurItem].tAmOnDuty=m_Time;
		sYearTotal[m_iMonths].sAttend[m_iCurItem].tAmOffDuty=m_Time;
		sYearTotal[m_iMonths].sAttend[m_iCurItem].tPmOnDuty=m_Time;
		sYearTotal[m_iMonths].sAttend[m_iCurItem].tPmOffDuty=m_Time;
		sYearTotal[m_iMonths].sAttend[m_iCurItem].tNinOnDuty=m_Time;
		sYearTotal[m_iMonths].sAttend[m_iCurItem].tNinOffDuty=m_Time;
		sYearTotal[m_iMonths].sAttend[m_iCurItem].tWork=m_Time-m_Time;
		sDuty.tAmOnDuty=m_Time;
		sDuty.tAmOffDuty=m_Time;
		sDuty.tPmOnDuty=m_Time;
		sDuty.tPmOffDuty=m_Time;
		sDuty.tNinOnDuty=m_Time;
		sDuty.tNinOffDuty=m_Time;
		sDuty.tWork=m_Time-m_Time;
	}

	if(m_iMonths==-1 || (m_iMonths>=0 && sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tAmOnDuty.Format("%Y%m")!=m_Time.Format("%Y%m")))
	{
		m_iMonths++;
		sYearTotal[m_iMonths].iPay = m_iMonths-1==-1 ? m_iPay : sYearTotal[m_iMonths-1].iPay;
		if(m_iMonths==0)
		{
			
			CString s;
			s.Format("%d元",sYearTotal[m_iMonths].iPay);
			s =	"祝贺您! 新的工作或新一年的工作又开始了!\n\n默认的或从上一年继承下来的月工资是:"+s;
			s += "\n\n有没有变化? 如果有变化,请别忘记在\"月全勤工资\"一栏中改正过来!";
			char* ch = s.GetBuffer(s.GetLength());
			::MessageBox(NULL,ch,"提醒",MB_OK|MB_ICONQUESTION);
		}
		sYearTotal[m_iMonths].iFactPay =0;
		sYearTotal[m_iMonths].iDayItems = 0;
/*		m_ArrayHoliday.SetSize(m_iHoliday);
        for(int iIndex = 0; iIndex < m_iHoliday; ++iIndex)
			m_ArrayHoliday[iIndex] = sYearTotal[m_iMonths].ArrayHoliday[iIndex];
*/		sYearTotal[m_iMonths].sAttend[0].tAmOnDuty = m_Time;
		sYearTotal[m_iMonths].sAttend[0].tAmOffDuty = m_Time;
		sYearTotal[m_iMonths].sAttend[0].tPmOnDuty = m_Time;
		sYearTotal[m_iMonths].sAttend[0].tPmOffDuty = m_Time;
		sYearTotal[m_iMonths].sAttend[0].tNinOnDuty = m_Time;
		sYearTotal[m_iMonths].sAttend[0].tNinOffDuty = m_Time;
		sYearTotal[m_iMonths].sAttend[0].tWork=m_Time-m_Time;
		sDuty.tAmOnDuty=m_Time;
		sDuty.tAmOffDuty=m_Time;
		sDuty.tPmOnDuty=m_Time;
		sDuty.tPmOffDuty=m_Time;
		sDuty.tNinOnDuty=m_Time;
		sDuty.tNinOffDuty=m_Time;
		sDuty.tWork=m_Time-m_Time;
		m_iHoliday=0;
	int year = sYearTotal[m_iMonths].sAttend[0].tAmOnDuty.GetYear();
	int mth = sYearTotal[m_iMonths].sAttend[0].tAmOnDuty.GetMonth();
	int monthday=MonthDay[mth-1];
	if(mth==2 && fmod(year,4)==0)
		monthday++;
		int day = sYearTotal[m_iMonths].sAttend[0].tAmOnDuty.GetDay();
		int wk = sYearTotal[m_iMonths].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;
		
		for(int i=0;i<monthday;i++)
		{
			wk = wk1+fmod(i,7);
			if(wk>7) wk-=7;
			
			if(wk==1 || wk==7)
			{
				//m_ArrayHoliday.Add(i+1);
				sYearTotal[m_iMonths].ArrayHoliday[m_iHoliday] = i+1;//m_ArrayHoliday[m_iHoliday];
				m_iHoliday++;
			}
		}
		//m_iWorkDays=monthday-m_iHoliday;
		sYearTotal[m_iMonths].iHoliday = m_iHoliday;
	}

	GetDutyData();

	GetYearData();
	m_bFirst=false;

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CAttendanceDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CAttendanceDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CAttendanceDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

// Automation servers should not exit when a user closes the UI
//  if a controller still holds on to one of its objects.  These
//  message handlers make sure that if the proxy is still in use,
//  then the UI is hidden but the dialog remains around if it
//  is dismissed.

void CAttendanceDlg::OnClose() 
{
	if (CanExit())
		CDialog::OnClose();
}

void CAttendanceDlg::OnOK() 
{

	if (CanExit())
	{
		if(sYearTotal[0].sAttend[0].tAmOnDuty.GetYear()==m_Time.GetYear())
			m_sAttendFile="考勤"+m_Time.Format("%Y年");
		else
			m_sAttendFile="考勤"+sYearTotal[0].sAttend[0].tAmOnDuty.Format("%Y年");
		m_sAttendFile+=".atd";
		CString filename=m_sSavePath+"\\"+m_sAttendFile;
		m_sFileExt="atd";
		CFile file;
		if(file.Open(filename,CFile::modeWrite|CFile::modeCreate)!=0)
		{
			CArchive ar(&file,CArchive::store);

			CWaitCursor wait;
			Serialize(ar);     // save mem_sCfgFile
			ar.Close();
			file.Close();
		}
		CDialog::OnOK();
	}
}

void CAttendanceDlg::OnCancel() 
{
	if (CanExit())
		CDialog::OnCancel();
}

BOOL CAttendanceDlg::CanExit()
{
	// If the proxy object is still around, then the automation
	//  controller is still holding on to this application.  Leave
	//  the dialog around, but hide its UI.
	if (m_pAutoProxy != NULL)
	{
		ShowWindow(SW_HIDE);
		return FALSE;
	}
	m_pChildFrame->ShowWindow(SW_SHOW);     // destroy preview view

	return TRUE;
}

void CAttendanceDlg::GetTableData()
{
	m_ListAttend.DeleteAllItems();
	CString str;
	for(int j=0;j<=m_iCurItem;j++)
	{
		sAttend[j].tWork = sAttend[j].tAmOffDuty-sAttend[j].tAmOnDuty;
		sAttend[j].tWork += sAttend[j].tPmOffDuty-sAttend[j].tPmOnDuty;
		sAttend[j].tWork += sAttend[j].tNinOffDuty-sAttend[j].tNinOnDuty;
		
		lvitem.iItem=j;
		m_ListAttend.InsertItem(&lvitem);
		str.Format("%d",sAttend[j].tAmOnDuty.GetDay());//j+1
		m_ListAttend.SetItemText(j,0,str);

		if(sAttend[j].tAmOnDuty!=0)
		{
			int n=sAttend[j].tAmOnDuty.GetDayOfWeek();
			str=WeekTable[n-1];
			m_ListAttend.SetItemText(j,1,str);

			if(sAttend[j].tAmOnDuty==sAttend[j].tAmOffDuty)
			{
				str=_T(" ");
				m_ListAttend.SetItemText(j,2,str);
				m_ListAttend.SetItemText(j,3,str);
			}
			else
			{
				str=sAttend[j].tAmOnDuty.Format("%H:%M");
				m_ListAttend.SetItemText(j,2,str);

				str=sAttend[j].tAmOffDuty.Format("%H:%M");
				m_ListAttend.SetItemText(j,3,str);
			}

			if(sAttend[j].tPmOnDuty==sAttend[j].tPmOffDuty)
			{
				str=_T(" ");
				m_ListAttend.SetItemText(j,4,str);
				m_ListAttend.SetItemText(j,5,str);
			}
			else
			{
				str=sAttend[j].tPmOnDuty.Format("%H:%M");
				m_ListAttend.SetItemText(j,4,str);

				str=sAttend[j].tPmOffDuty.Format("%H:%M");
				m_ListAttend.SetItemText(j,5,str);
			}

			if(sAttend[j].tNinOnDuty==sAttend[j].tNinOffDuty)
			{
				str=_T(" ");
				m_ListAttend.SetItemText(j,6,str);
				m_ListAttend.SetItemText(j,7,str);
			}
			else
			{
				str=sAttend[j].tNinOnDuty.Format("%H:%M");
				m_ListAttend.SetItemText(j,6,str);

				str=sAttend[j].tNinOffDuty.Format("%H:%M");
				m_ListAttend.SetItemText(j,7,str);
			}

			str=sAttend[j].tWork.Format("%H:%M");
			m_ListAttend.SetItemText(j,8,str);
		}
	}
}

void CAttendanceDlg::Serialize(CArchive &ar)
{
	if (ar.IsStoring() && m_sFileExt=="atd")
	{
		ar<<m_iTop;
		ar<<m_iBottom;
		ar<<m_iLeft;
		ar<<m_iRight;
		ar<<m_iMonths;
		for(int i=0;i<=m_iMonths;i++)
		{
			ar<<sYearTotal[i].iPay;
			ar<<sYearTotal[i].iFactPay;
			ar<<sYearTotal[i].iHoliday;
            for(int iIndex = 0; iIndex < sYearTotal[i].iHoliday; ++iIndex)
				ar<<sYearTotal[i].ArrayHoliday[iIndex];
			ar<<sYearTotal[i].iDayItems;
			for(int j=0;j<=sYearTotal[i].iDayItems;j++)
			{
				ar<<sYearTotal[i].sAttend[j].tAmOnDuty;
				ar<<sYearTotal[i].sAttend[j].tAmOffDuty;
				ar<<sYearTotal[i].sAttend[j].tPmOnDuty;
				ar<<sYearTotal[i].sAttend[j].tPmOffDuty;
				ar<<sYearTotal[i].sAttend[j].tNinOnDuty;
				ar<<sYearTotal[i].sAttend[j].tNinOffDuty;
			}
		}
	}
	else
	{
		ar>>m_iTop;
		ar>>m_iBottom;
		ar>>m_iLeft;
		ar>>m_iRight;
		ar>>m_iMonths;
		for(int i=0;i<=m_iMonths;i++)
		{
			ar>>sYearTotal[i].iPay;
			ar>>sYearTotal[i].iFactPay;
			ar>>sYearTotal[i].iHoliday;
			for(int iIndex = 0; iIndex < sYearTotal[i].iHoliday; ++iIndex)
				ar>>sYearTotal[i].ArrayHoliday[iIndex];
			ar>>sYearTotal[i].iDayItems;
			for(int j=0;j<=sYearTotal[i].iDayItems;j++)
			{
				ar>>sYearTotal[i].sAttend[j].tAmOnDuty;
				ar>>sYearTotal[i].sAttend[j].tAmOffDuty;
				ar>>sYearTotal[i].sAttend[j].tPmOnDuty;
				ar>>sYearTotal[i].sAttend[j].tPmOffDuty;
				ar>>sYearTotal[i].sAttend[j].tNinOnDuty;//=sYearTotal[i].sAttend[j].tPmOffDuty;
				ar>>sYearTotal[i].sAttend[j].tNinOffDuty;//=sYearTotal[i].sAttend[j].tPmOffDuty;
			}
		}
	}

}

void CAttendanceDlg::OnColumnclickDuty(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	if(sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tAmOnDuty.GetYear()!=m_Time.GetYear())
	{
		*pResult = 0;
		return;
	}
	int iSubItem=pNMListView->iSubItem;

 	UINT ui=pNMHDR->code;

	bool b=sYearTotal[0].sAttend[0].tAmOnDuty.GetYear()==m_Time.GetYear();

	switch(iSubItem)
	{
	case 0:
		sDuty.tAmOnDuty=CTime::GetCurrentTime();
		if(b) sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tAmOnDuty=sDuty.tAmOnDuty;
	case 1:
		sDuty.tAmOffDuty=CTime::GetCurrentTime();
		if(b) sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tAmOffDuty=sDuty.tAmOffDuty;
	case 2:
		sDuty.tPmOnDuty=CTime::GetCurrentTime();
		if(b) sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tPmOnDuty=sDuty.tPmOnDuty;
	case 3:
		sDuty.tPmOffDuty=CTime::GetCurrentTime();
		if(b) sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tPmOffDuty=sDuty.tPmOffDuty;
	case 4:
		sDuty.tNinOnDuty=CTime::GetCurrentTime();
		if(b) sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tNinOnDuty=sDuty.tNinOnDuty;
	case 5:
		sDuty.tNinOffDuty=CTime::GetCurrentTime();
		if(b) sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tNinOffDuty=sDuty.tNinOffDuty;

		GetDutyData();

/*		if(sAttend[m_iCurItem].tAmOnDuty.GetMonth()==m_Time.GetMonth())
		{
			sAttend[m_iCurItem]=sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems];
			m_ListAttend.DeleteItem(m_iCurItem);
			lvitem.iItem=m_iCurItem;
			m_ListAttend.InsertItem(&lvitem);

			str.Format("%d",sAttend[m_iCurItem].tAmOnDuty.GetDay());//j+1
			m_ListAttend.SetItemText(m_iCurItem,0,str);

			sAttend[m_iCurItem].tWork = sAttend[m_iCurItem].tAmOffDuty-sAttend[m_iCurItem].tAmOnDuty;
			sAttend[m_iCurItem].tWork += sAttend[m_iCurItem].tPmOffDuty-sAttend[m_iCurItem].tPmOnDuty;

			n=sAttend[m_iCurItem].tAmOnDuty.GetDayOfWeek();
			str=WeekTable[n-1];
			m_ListAttend.SetItemText(m_iCurItem,1,str);

			str=sAttend[m_iCurItem].tAmOnDuty.Format("%H:%M");
			m_ListAttend.SetItemText(m_iCurItem,2,str);

			str=sAttend[m_iCurItem].tAmOffDuty.Format("%H:%M");
			m_ListAttend.SetItemText(m_iCurItem,3,str);

			str=sAttend[m_iCurItem].tPmOnDuty.Format("%H:%M");
			m_ListAttend.SetItemText(m_iCurItem,4,str);

			str=sAttend[m_iCurItem].tPmOffDuty.Format("%H:%M");
			m_ListAttend.SetItemText(m_iCurItem,5,str);

			str=sAttend[m_iCurItem].tWork.Format("%H:%M");
			m_ListAttend.SetItemText(m_iCurItem,6,str);
		}
*/		if(b) GetYearData();
	default:
		break;
	}
	
	*pResult = 0;
}

void CAttendanceDlg::GetDutyData()
{
	m_ListDuty.DeleteAllItems();
	CString str;

	lvitem.iItem=0;
	m_ListDuty.InsertItem(&lvitem);

	sDuty.tWork = sDuty.tAmOffDuty-sDuty.tAmOnDuty;
	sDuty.tWork += sDuty.tPmOffDuty-sDuty.tPmOnDuty;
	sDuty.tWork += sDuty.tNinOffDuty-sDuty.tNinOnDuty;

	str=sDuty.tAmOnDuty.Format("%H:%M");
	m_ListDuty.SetItemText(0,0,str);

	str=sDuty.tAmOffDuty.Format("%H:%M");
	m_ListDuty.SetItemText(0,1,str);

	str=sDuty.tPmOnDuty.Format("%H:%M");
	m_ListDuty.SetItemText(0,2,str);

	str=sDuty.tPmOffDuty.Format("%H:%M");
	m_ListDuty.SetItemText(0,3,str);

	str=sDuty.tNinOnDuty.Format("%H:%M");
	m_ListDuty.SetItemText(0,4,str);

	str=sDuty.tNinOffDuty.Format("%H:%M");
	m_ListDuty.SetItemText(0,5,str);

	str=sDuty.tWork.Format("%H:%M");
	m_ListDuty.SetItemText(0,6,str);
}

void CAttendanceDlg::OnHoliday() 
{
	// TODO: Add your control notification handler code here
	CDualListDialog dlg;
	dlg.m_pParentDlg=this;
	if(dlg.DoModal()==IDOK)
	{
	m_dDayPay = (double)m_iPay/(double)m_iWorkDays;
	m_iObtain=m_dFactWorks*m_dDayPay;
	sYearTotal[m_iMonths].iHoliday = m_iHoliday;
	for(int i=0;i<m_iHoliday;i++)
		sYearTotal[m_iMonths].ArrayHoliday[i] = m_ArrayHoliday[i];

	GetYearData();
	//UpdateData(false);
	}
	
}

void CAttendanceDlg::OnUpdatePay() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function to send the EM_SETEVENTMASK message to the control
	// with the ENM_UPDATE flag ORed into the lParam mask.
	
	// TODO: Add your control notification handler code here
	if(sYearTotal[m_iMonths].sAttend[0].tAmOnDuty.Format("%Y%m")!=m_Time.Format("%Y%m"))
		return;
	char buf[10];
	int x=m_EdtPay.GetLine(0,buf,10);
	buf[x]=0;
	int i=atoi(buf);
	if(i<0 || i>62000)
		return;
	m_iPay = i;
	m_dDayPay = (double)m_iPay/(double)m_iWorkDays;
	m_iObtain=m_dFactWorks*m_dDayPay;
	sYearTotal[m_iMonths].iPay = m_iPay;
	GetYearData();
//	UpdateData(false);
	
}

void CAttendanceDlg::OnDelete() 

⌨️ 快捷键说明

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