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

📄 attendancedlg.cpp

📁 一个完整的考勤处理软件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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;
		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].tWork=m_Time-m_Time;
		sDuty.tAmOnDuty=m_Time;
		sDuty.tAmOffDuty=m_Time;
		sDuty.tPmOnDuty=m_Time;
		sDuty.tPmOffDuty=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;
		
		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);

			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);

			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);

			str=sAttend[j].tWork.Format("%H:%M");
			m_ListAttend.SetItemText(j,6,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;
			}
		}
	}
	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;
			}
		}
	}

}

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;

		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;

	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.tWork.Format("%H:%M");
	m_ListDuty.SetItemText(0,4,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>3000)
		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() 
{
	// TODO: Add your control notification handler code here
	int iState;	
	int nItemSelected=m_ListAttend.GetSelectedCount();//所选表项数	
	int nItemCount=m_ListAttend.GetItemCount();//表项总数	
	if(nItemSelected<1)
		return;
	int	n=0;
	for(int i=0;i<nItemCount;i++)             //i=nItemCount-1;i>=0;i--)
	{		
		iState=m_ListAttend.GetItemState(i,LVIS_SELECTED);
		if(iState!=0)
		{
		//	m_cList.DeleteItem(i);
			for(int j=i-n;j<m_iCurItem;j++)
			{
				sAttend[j]=sAttend[j+1];
				sYearTotal[m_iTotalSel].sAttend[j]=sYearTotal[m_iTotalSel].sAttend[j+1];
			}
			m_iCurItem--;
			sYearTotal[m_iTotalSel].iDayItems--;
			void* x=(void*)&sAttend[m_iCurItem+1];
			memset(x,0,sizeof(Attend));
			n++;
		}
	}
	if(sYearTotal[m_iTotalSel].iDayItems==-1)
	{
		for(i=m_iTotalSel;i<=m_iMonths;i++)
			sYearTotal[i]=sYearTotal[i+1];
		m_iMonths--;
	}
	if(m_iMonths==-1 || m_iMonths>=0 && (sYearTotal[m_iMonths].sAttend[0].tAmOnDuty.GetYear()==m_Time.GetYear() 
											&& sYearTotal[m_iMonths].sAttend[0].tAmOnDuty.GetMonth()!=m_Time.GetMonth()))
	{
		m_iMonths++;
		sYearTotal[m_iMonths].iPay = m_iPay;
		sYearTotal[m_iMonths].iDayItems = 0;
		sYearTotal[m_iMonths].sAttend[0] = sDuty;

		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();

⌨️ 快捷键说明

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