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

📄 attendancedlg.cpp

📁 考勤系统~实现一般的考勤功能~比如上下班打卡~制定假期等~
💻 CPP
📖 第 1 页 / 共 3 页
字号:
{
	// 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();
		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;
	}

	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++;
		sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems] = sDuty;
	}
	GetYearData();
}

void CAttendanceDlg::GetYearData()
{
	m_ListTotal.DeleteAllItems();
	CString str;
	for(int i=0;i<=m_iMonths;i++)
	{
	double fctwks = 0;
	for(int j=0;j<=sYearTotal[i].iDayItems;j++)
	{
		sYearTotal[i].sAttend[j].tWork = sYearTotal[i].sAttend[j].tAmOffDuty-sYearTotal[i].sAttend[j].tAmOnDuty;
		sYearTotal[i].sAttend[j].tWork += sYearTotal[i].sAttend[j].tPmOffDuty-sYearTotal[i].sAttend[j].tPmOnDuty;
		sYearTotal[i].sAttend[j].tWork += sYearTotal[i].sAttend[j].tNinOffDuty-sYearTotal[i].sAttend[j].tNinOnDuty;
		fctwks += (double)sYearTotal[i].sAttend[j].tWork.GetHours()+(double)sYearTotal[i].sAttend[j].tWork.GetMinutes()/60.0;
	}
	int year = sYearTotal[i].sAttend[0].tAmOnDuty.GetYear();
	int mth = sYearTotal[i].sAttend[0].tAmOnDuty.GetMonth();
	int monthday=MonthDay[mth-1];
	if(mth==2 && fmod(year,4)==0)
		monthday++;
	int wkd = monthday-sYearTotal[i].iHoliday;
	lvitem.iItem=i;
	m_ListTotal.InsertItem(&lvitem);
	str.Format("%d",mth);
	m_ListTotal.SetItemText(i,0,str);

	str.Format("%d",wkd);
	m_ListTotal.SetItemText(i,1,str);

	str.Format("%d",sYearTotal[i].iPay);
	m_ListTotal.SetItemText(i,2,str);

	double DayPay = (double)sYearTotal[i].iPay/(double)wkd;
	DayPay = int(DayPay*100.0+0.5)/100.0;
	str.Format("%6.2f",DayPay);
	m_ListTotal.SetItemText(i,3,str);

//	double fctwks = 0;
//	for(int j=0;j<=sYearTotal[i].iDayItems;j++)
//	{
//		sYearTotal[i].sAttend[j].tWork = sYearTotal[i].sAttend[j].tAmOffDuty-sYearTotal[i].sAttend[j].tAmOnDuty;
//		sYearTotal[i].sAttend[j].tWork += sYearTotal[i].sAttend[j].tPmOffDuty-sYearTotal[i].sAttend[j].tPmOnDuty;
//		fctwks += (double)sYearTotal[i].sAttend[j].tWork.GetHours()+(double)sYearTotal[i].sAttend[j].tWork.GetMinutes()/60.0;
//	}
	fctwks /=8.0;
	fctwks = floor(fctwks*10.0)/10.0;
	str.Format("%.1f",fctwks);
	m_ListTotal.SetItemText(i,4,str);
	int iObtain=(double)sYearTotal[i].iPay*fctwks/(double)wkd;
	str.Format("%d",iObtain);
	m_ListTotal.SetItemText(i,5,str);

	str.Format("%d",sYearTotal[i].iFactPay);
	m_ListTotal.SetItemText(i,6,str);

	}

}

void CAttendanceDlg::OnItemchangedTotal(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	int iItem=pNMListView->iItem;//!
	int n;
	
	if(m_bFirst==true && iItem!=m_iMonths)
	{
		*pResult = 0;
		return;
	}
	m_iTotalSel = iItem;
	CString s;
	s.Format("%d年%2d月份月报 ", sYearTotal[iItem].sAttend[0].tAmOnDuty.GetYear(),sYearTotal[iItem].sAttend[0].tAmOnDuty.GetMonth(),sYearTotal[iItem].sAttend[0].tAmOnDuty.GetDay());
	char* ch = s.GetBuffer(s.GetLength());
	m_cMonth.SetWindowText(ch);
	s.Format("%d年度 年报 ", sYearTotal[iItem].sAttend[0].tAmOnDuty.GetYear());
	ch = s.GetBuffer(s.GetLength());
	m_cYear.SetWindowText(ch);

 		m_iPay = sYearTotal[iItem].iPay;
 		m_iFactPay = sYearTotal[iItem].iFactPay;
		m_iHoliday = sYearTotal[iItem].iHoliday;
		m_ArrayHoliday.SetSize(m_iHoliday);
        for(int iIndex = 0; iIndex < m_iHoliday; ++iIndex)
			m_ArrayHoliday[iIndex] = sYearTotal[iItem].ArrayHoliday[iIndex];
		m_iCurItem = sYearTotal[iItem].iDayItems;
		for(int i=0;i<=m_iCurItem;i++)
			sAttend[i] = sYearTotal[iItem].sAttend[i];
	int year = sAttend[0].tAmOnDuty.GetYear();
	int mth = sAttend[0].tAmOnDuty.GetMonth();
	int monthday=MonthDay[mth-1];
	if(mth==2 && fmod(year,4)==0)
		monthday++;
	m_iWorkDays = monthday-m_iHoliday;
	m_dDayPay = int(((double)m_iPay/(double)m_iWorkDays)*100.0+0.5)/100.0;
	m_dFactWorks = 0;
	for(i=0;i<=m_iCurItem;i++)
		m_dFactWorks += (double)sAttend[i].tWork.GetHours()+(double)sAttend[i].tWork.GetMinutes()/60.0;
	m_dFactWorks /= 8.0;
	m_dFactWorks = floor(m_dFactWorks*100.0)/100.0;
	m_iObtain=(double)m_iPay*double(floor(m_dFactWorks*10.0)/10.0)/(double)m_iWorkDays;
	GetTableData();
	UpdateData(false);

	if(sYearTotal[iItem].sAttend[0].tAmOnDuty.Format("%Y%m")!=m_Time.Format("%Y%m"))
	{
		m_EdtPay.SetReadOnly(true);
		m_EdtFactPay.SetReadOnly(true);
	}
	else
	{
		m_EdtPay.SetReadOnly(false);
		m_EdtFactPay.SetReadOnly(false);
	}

/*	lvitem.iItem=iItem;
	lvitem.stateMask |= LVIS_SELECTED;
	for(i=0;i<=m_iMonths;i++)
	{
		int iState;
		if(iItem==i)
	iState=m_ListTotal.SetItemState(i,2,LVIS_SELECTED);//&lvitem
		else
	iState=m_ListTotal.SetItemState(i,0,LVIS_SELECTED);//&lvitem
	}
*/	*pResult = 0;
}

BOOL CAttendanceDlg::NotifyFunction( UINT id, NMHDR * pTTTStruct, LRESULT * pResult )
{
	pResult = NULL ;	// Not Used 
	id = 0 ;	// Not used 

    TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct;    
	UINT nID = pTTTStruct->idFrom;
	switch ( nID)
	{
		case ID_FILE_OPEN:
			pTTT->lpszText = MAKEINTRESOURCE((LPCSTR)(IDS_FILE_OPEN));
			break ;
		case ID_FILE_SAVEAS:
			pTTT->lpszText = MAKEINTRESOURCE((LPCSTR)(IDS_FILE_SAVEAS));
			break ;
		case ID_PGSETUP:
			pTTT->lpszText = MAKEINTRESOURCE((LPCSTR)(IDS_PGSETUP));
			break ;
		case ID_PRINT:
			pTTT->lpszText = MAKEINTRESOURCE((LPCSTR)(IDS_PRINT));
			break ;
		case ID_PRINT_PREVIEW:
			pTTT->lpszText = MAKEINTRESOURCE((LPCSTR)(IDS_PRINT_PREVIEW));
			break ;
		case ID_ABOUT:
			pTTT->lpszText = MAKEINTRESOURCE((LPCSTR)(IDS_ABOUT));
			break ;
	}
	return(TRUE);
}

void CAttendanceDlg::SetToolBarPosition(int pos)
{
	m_toolbarCtrl = NULL ;
	VERIFY(m_toolbarCtrl == NULL );
	m_toolbarCtrl = new CToolBarCtrl() ;

	CRect wndRect ;
	GetWindowRect(&wndRect);//wndRect.right-100
	CRect rc(0,0,18*9 , 18);//50
//	if ( pos == 0 )//WS_DLGFRAME | CBRS_GRIPPER |
		m_toolbarCtrl->Create(TBSTYLE_TOOLTIPS | TBSTYLE_DROPDOWN |WS_CHILD | WS_VISIBLE | CBRS_GRIPPER | CBRS_FLYBY | CCS_TOP | CCS_NODIVIDER, rc ,this , 0 );
//	else
//		m_toolbarCtrl->Create(TBSTYLE_TOOLTIPS |WS_CHILD | WS_VISIBLE | CBRS_GRIPPER | CCS_BOTTOM  | CCS_NODIVIDER , rc ,this , 0 );

	m_toolbarCtrl->AddButtons(6, btn);
	m_toolbarCtrl->AddBitmap(1, IDR_TOOLBAR);//IDR_MAINFRAME

	CSize sz_btn(18,17);
	m_toolbarCtrl->SetButtonSize(sz_btn);
	
	CSize sz_img(19,18);
	m_toolbarCtrl->SetBitmapSize(sz_img);

	m_toolbarCtrl->AutoSize();
}

void CAttendanceDlg::OnFileOpen() 
{
	// TODO: Add your command handler code here

	CAttendanceApp* app=(CAttendanceApp*)AfxGetApp();
    //CMainFrame* pMFrame=(CMainFrame*)AfxGetMainWnd();
	CFileDialog dlg(true,"atd",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"考勤数据文件(*.atd)|*.atd|所有文件(*.*)|*.*||",NULL);//pMFrame
	
	CString s=m_sOpenPath;
	dlg.m_ofn.lpstrInitialDir=s.GetBuffer(512);
	CString t=m_sAttendFile;
//	CString t="Choose Dir.bmp";
	dlg.m_ofn.lpstrFile=t.GetBuffer(512);//lpstrFile;
	if(dlg.DoModal()==IDCANCEL)
		return;
	m_sFileExt=dlg.GetFileExt();
	char* h=m_sFileExt.GetBuffer(m_sFileExt.GetLength());
	strlwr(h);
	if(strcmp(h,"atd")!=0 )
		return;
	m_sFileExt=dlg.GetFileExt();
	m_sAttendFile=dlg.GetFileName();
	m_sOpenPath=dlg.GetPathName();
	CString str;
	CFile file;//FileNamem_sFileName
	if(file.Open(m_sOpenPath,CFile::modeRead)==0)
	{
		str="打开数据文件:\n"+m_sOpenPath+"\n失败!";
		AfxMessageBox(str);
		return;
	}
	m_sFileExt=dlg.GetFileExt();
	//char* h=m_sFileExt.GetBuffer(m_sFileExt.GetLength());
	//strlwr(h);
	CArchive ar(&file,CArchive::load);

	CWaitCursor wait;
	Serialize(ar);     // save me
	ar.Close();
	file.Close();
	//SetModifiedFlag(FALSE);     // back to unmodified
	
	if(m_iMonths>=0 && sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tAmOnDuty.Format("%Y%m%d")==m_Time.Format("%Y%m%d"))
	{
		m_iCurItem = sYearTotal[m_iMonths].iDayItems;
/*		sYearTotal[m_iMonths].sAttend[m_iCurItem].tAmOnDuty = sDuty.tAmOnDuty;
		sYearTotal[m_iMonths].sAttend[m_iCurItem].tAmOffDuty = sDuty.tAmOffDuty;
		sYearTotal[m_iMonths].sAttend[m_iCurItem].tPmOnDuty = sDuty.tPmOnDuty;
		sYearTotal[m_iMonths].sAttend[m_iCurItem].tPmOffDuty = sDuty.tPmOffDuty;
		sDuty.tWork=(sDuty.tAmOffDuty-sDuty.tAmOnDuty)+(sDuty.tPmOffDuty-sDuty.tPmOnDuty);
*/
		sYearTotal[m_iMonths].sAttend[m_iCurItem] = sDuty;

	}

	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]=sDuty;

	}

	if(m_iMonths>=0 && sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tAmOnDuty.GetYear()==m_Time.GetYear()
		&& sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tAmOnDuty.GetMonth()!=m_Time.GetMonth())
	{
		m_iMonths++;
		sYearTotal[m_iMonths].iPay = m_iMonths-1==-1 ? m_iPay : sYearTotal[m_iMonths-1].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();
		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();

	m_bFirst=true;
	GetYearData();
	m_bFirst=false;

}

void CAttendanceDlg::OnFileSaveas() 
{
	// TODO: Add your command handler code here
	CAttendanceApp* app=(CAttendanceApp*)AfxGetApp();
    //CMainFrame* pMFrame=(CMainFrame*)AfxGetMainWnd();
	CFileDialog dlg(false,"atd",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"考勤数据文件(*.atd)|*.atd|所有文件(*.*)|*.*||",NULL);//pMFrame
	CString s=m_sSavePath;
	dlg.m_ofn.lpstrInitialDir=s.GetBuffer(512);
	CString t=m_sAttendFile;
	dlg.m_ofn.lpstrFile=t.GetBuffer(512);//lpstrFile;
	if(dlg.DoModal()==IDCANCEL)
		return;
	CString filename=dlg.GetFileName();
	s=dlg.GetPathName();
	int index = s.ReverseFind('\\');			
	 //返回索引值左边的所有字符
	m_sSavePath = s.Left(index);
	CString str;
	CFile file;
	if(file.Open(filename,CFile::modeWrite|CFile::modeCreate)==0)
	{
		str="保存数据文件"+filename+"失败\n请改变保存目录后再试试";
		AfxMessageBox(str);
		return;
	}
	m_sFileExt=dlg.GetFileExt();
	char* h=m_sFileExt.GetBuffer(m_sFileExt.GetLength());
	strlwr(h);
	CArchive ar(&file,CArchive::store);

				CWaitCursor wait;
				Serialize(ar);     // save me
				ar.Close();
				file.Close();
			//SetModifiedFlag(false);     // back to unmodified
	
}

void CAttendanceDlg::OnPrint() 
{
	// TODO: Add your command handler code here
	CPrintSelect dlg;
	dlg.m_iPrtSel = m_iPrtSel;
	if(dlg.DoModal() != IDOK)
		return;
	m_iPrtSel = dlg.m_iPrtSel;

	CAttendanceApp* app=(CAttendanceApp*)AfxGetApp();
	app->SetPrntOrientation();
	m_pChildFrame->SendMessage(WM_COMMAND, ID_FILE_PRINT);
	
}

void CAttendanceDlg::OnPrintPreview() 
{
	// TODO: Add your command handler code here
	CPrintSelect dlg;
	dlg.m_iPrtSel = m_iPrtSel;
	if(dlg.DoModal() != IDOK)
		return;
	m_iPrtSel = dlg.m_iPrtSel;

	CAttendanceApp* app=(CAttendanceApp*)AfxGetApp();
	app->SetPrntOrientation();
	m_pChildFrame->ShowWindow(SW_SHOW);//HIDE
	m_pChildFrame->UpdateWindow();
	m_pChildFrame->SendMessage(WM_COMMAND, ID_FILE_PRINT_PREVIEW);
	
}


int CAttendanceDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CDialog::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	CChildFrame* pFrame = new CChildFrame;
	m_pChildFrame = pFrame;

	// create and load the frame with its resources

	pFrame->LoadFrame(IDR_MAINFRAME,
		WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,//,m_pMainWnd
		NULL);

	m_pChildFrame->SetWindowText("打印考勤资料");
	m_pChildFrame->SetIcon(m_hIcon, FALSE);		// Set small icon
	m_pChildFrame->ShowWindow(SW_HIDE);//SHOW
	m_pChildFrame->UpdateWindow();

	
	return 0;
}

void CAttendanceDlg::OnPgsetup() 
{
	// TODO: Add your command handler code here
	CPageSetup dlg;
	dlg.m_iTop = m_iTop;
	dlg.m_iBottom = m_iBottom;
	dlg.m_iLeft = m_iLeft;
	dlg.m_iRight = m_iRight;
//	dlg.m_bChkYear = m_bChkYear;
	if(dlg.DoModal() != IDOK)
		return;
	m_iTop = dlg.m_iTop;
	m_iBottom = dlg.m_iBottom;
	m_iLeft = dlg.m_iLeft;
	m_iRight = dlg.m_iRight;
//	m_bChkYear = dlg.m_bChkYear;

	
}

void CAttendanceDlg::OnUpdateFactpay() 
{
	// 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_EdtFactPay.GetLine(0,buf,10);
	buf[x]=0;
	int i=atoi(buf);
	if(i<0 || i>62000)
		return;
	m_iFactPay = i;
	sYearTotal[m_iMonths].iFactPay = m_iFactPay;
	GetYearData();
	
}

void CAttendanceDlg::OnAbout() 
{
	// TODO: Add your command handler code here
	CAboutDlg dlg;
	dlg.DoModal();

}

⌨️ 快捷键说明

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