📄 attendancedlg.cpp
字号:
{
// 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 + -