www.gusucode.com > VC++个人考勤软件源代码-源码程序 > VC++个人考勤软件源代码-源码程序/code/attendanceDlg.cpp

    //Download by http://www.NewXing.com
// attendanceDlg.cpp : implementation file
//

#include "stdafx.h"
#include "attendance.h"
#include "attendanceDlg.h"
#include "DlgProxy.h"
#include "DualListDialog.h"
#include "PageSetup.h"
#include "PrintSelect.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
/*
#define ID_FILE_OPEN	WM_USER + 100 
#define ID_FILE_SAVEAS	WM_USER + 101 
#define ID_PRINT		WM_USER + 102 
#define ID_PRINT_PREVIEW	WM_USER + 103
*/
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	CButton	m_ctrlMore;
	CString	m_sEmail;
	CString	m_sWWW;
	CString	m_sExplain;
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnBtnMore();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
private:
	BOOL	m_bToggleSize;
	CRect	m_rectFull;
	CRect	m_rectHalf;
	void ToggleSize() ;
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	m_sEmail = _T("Email:   ylguang@21cn.com");
	m_sWWW = _T("http://www.vckbase.com/code/viewcode.asp?id=1471\nhttp://www.vchelp.net/vchelp/view_article.asp?ft=2&article_id=128");
	m_sExplain = _T("");
	//}}AFX_DATA_INIT
	m_sExplain.LoadString(IDS_EXPLAIN);//华文隶书
	m_bToggleSize=FALSE;
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	DDX_Control(pDX, IDC_BTN_MORE, m_ctrlMore);
	DDX_Text(pDX, IDC_EDT_EMAIL, m_sEmail);
	DDX_Text(pDX, IDC_EDT_WWW, m_sWWW);
	DDX_Text(pDX, IDC_STATIC_EXPLAIN, m_sExplain);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
	ON_BN_CLICKED(IDC_BTN_MORE, OnBtnMore)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BOOL CAboutDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	// save our full size
	GetWindowRect(&m_rectFull);
	m_rectHalf=m_rectFull;

	// calculate our half size based on bottom of "More" button
	CRect rect;
	m_ctrlMore.GetWindowRect(&rect);
	m_rectHalf.bottom=rect.bottom+10; // + 10 for cosmetics

	// toggle window size
	ToggleSize();
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CAboutDlg::OnBtnMore() 
{
	// TODO: Add your control notification handler code here
	ToggleSize();	
	
}

void CAboutDlg::ToggleSize() 
{
	CRect rect;
	CString str;
	if (m_bToggleSize)
	{
		str="<< 收拢吧";
		rect=m_rectFull;
	}
	else
	{
		str="算法说明>>";
		rect=m_rectHalf;
	}
	SetWindowPos(NULL,0,0,rect.Width(),rect.Height(),SWP_NOZORDER|SWP_NOMOVE);
	m_ctrlMore.SetWindowText(str);
	m_bToggleSize=!m_bToggleSize;
}

/////////////////////////////////////////////////////////////////////////////
// CAttendanceDlg dialog

IMPLEMENT_DYNAMIC(CAttendanceDlg, CDialog);

CAttendanceDlg::CAttendanceDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CAttendanceDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CAttendanceDlg)
	m_sYearMonth = _T("");
	m_dDayPay = 0.0;
	m_iObtain = 0;
	m_iPay = 2000;
	m_iWorkDays = 0;
	m_dFactWorks = 0.0;
	m_iFactPay = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_pAutoProxy = NULL;
	m_toolbarCtrl = NULL ;

	m_iBottom = 0;
	m_iLeft = 0;
	m_iRight = 0;
	m_iTop = 0;
	m_iPrtSel = 0;

	m_iCurItem = 0;
	for(int i=0;i<=31;i++)
	{
		//sAttend[i].iDate=0;
		//sAttend[i].iWeek=0;
		sAttend[i].tAmOnDuty=0;
		sAttend[i].tAmOffDuty=0;
		sAttend[i].tPmOnDuty=0;
		sAttend[i].tPmOffDuty=0;
		sAttend[i].tWork=0;
	}
	sDuty.tAmOnDuty=0;
	sDuty.tAmOffDuty=0;
	sDuty.tPmOnDuty=0;
	sDuty.tPmOffDuty=0;
	sDuty.tWork=0;
	m_iHoliday=-1;
	m_iMonths=-1;
	m_bFirst=true;
	m_iTotalSel=0;

}

CAttendanceDlg::~CAttendanceDlg()
{
	// If there is an automation proxy for this dialog, set
	//  its back pointer to this dialog to NULL, so it knows
	//  the dialog has been deleted.
	if (m_pAutoProxy != NULL)
		m_pAutoProxy->m_pDialog = NULL;

}

void CAttendanceDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAttendanceDlg)
	DDX_Control(pDX, IDOK, m_BtnOk);
	DDX_Control(pDX, IDC_FACTPAY, m_EdtFactPay);
	DDX_Control(pDX, IDC_STATIC_YEAR, m_cYear);
	DDX_Control(pDX, IDC_STATIC_MONTH, m_cMonth);
	DDX_Control(pDX, IDC_WORKDAYS, m_EdtWorkDays);
	DDX_Control(pDX, IDC_PAY, m_EdtPay);
	DDX_Control(pDX, IDC_OBTAIN, m_EdtObtain);
	DDX_Control(pDX, IDC_FACTWORKS, m_EDtFactWorks);
	DDX_Control(pDX, IDC_DAYPAY, m_EdtDayPay);
	DDX_Control(pDX, IDC_DUTY, m_ListDuty);
	DDX_Control(pDX, IDC_TOTAL, m_ListTotal);
	DDX_Control(pDX, IDC_ATTENDANCE, m_ListAttend);
	DDX_Text(pDX, IDC_YEAR_MONTH, m_sYearMonth);
	DDX_Text(pDX, IDC_DAYPAY, m_dDayPay);
	DDV_MinMaxDouble(pDX, m_dDayPay, 0., 2000.);
	DDX_Text(pDX, IDC_OBTAIN, m_iObtain);
	DDV_MinMaxInt(pDX, m_iObtain, 0, 62000);
	DDX_Text(pDX, IDC_PAY, m_iPay);
	DDV_MinMaxInt(pDX, m_iPay, 0, 62000);
	DDX_Text(pDX, IDC_WORKDAYS, m_iWorkDays);
	DDV_MinMaxInt(pDX, m_iWorkDays, 0, 31);
	DDX_Text(pDX, IDC_FACTWORKS, m_dFactWorks);
	DDV_MinMaxDouble(pDX, m_dFactWorks, 0., 31.);
	DDX_Text(pDX, IDC_FACTPAY, m_iFactPay);
	DDV_MinMaxInt(pDX, m_iFactPay, 0, 62000);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAttendanceDlg, CDialog)
	//{{AFX_MSG_MAP(CAttendanceDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_CLOSE()
	ON_NOTIFY(LVN_COLUMNCLICK, IDC_DUTY, OnColumnclickDuty)
	ON_BN_CLICKED(IDC_HOLIDAY, OnHoliday)
	ON_EN_UPDATE(IDC_PAY, OnUpdatePay)
	ON_BN_CLICKED(IDC_DELETE, OnDelete)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_TOTAL, OnItemchangedTotal)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(ID_FILE_SAVEAS, OnFileSaveas)
	ON_COMMAND(ID_PRINT_PREVIEW, OnPrintPreview)
	ON_WM_CREATE()
	ON_COMMAND(ID_PRINT, OnPrint)
	ON_COMMAND(ID_PGSETUP, OnPgsetup)
	ON_EN_UPDATE(IDC_FACTPAY, OnUpdateFactpay)
	ON_COMMAND(ID_ABOUT, OnAbout)
	//}}AFX_MSG_MAP
	ON_NOTIFY_EX( TTN_NEEDTEXT, 0, NotifyFunction )
	//ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	//ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAttendanceDlg message handlers

BOOL CAttendanceDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	CAttendanceApp* app=(CAttendanceApp*)AfxGetApp();
//	app->pDeskTop=GetDesktopWindow();

	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	btn[0].iBitmap = 0 ;
	btn[0].idCommand = ID_FILE_OPEN ;
	btn[0].fsState = TBSTATE_ENABLED  ;
	btn[0].fsStyle = TBSTYLE_BUTTON  ;
	btn[0].dwData = 0 ;
	btn[0].iString = 0;

	btn[1].iBitmap = 1 ;
	btn[1].idCommand = ID_FILE_SAVEAS ;
	btn[1].fsState = TBSTATE_ENABLED  ;
	btn[1].fsStyle = TBSTYLE_BUTTON ;
	btn[1].dwData = 0 ;
	btn[1].iString = 1;

	btn[2].iBitmap = 2 ;
	btn[2].idCommand = ID_PGSETUP ;
	btn[2].fsState = TBSTATE_ENABLED  ;
	btn[2].fsStyle = TBSTYLE_BUTTON ;
	btn[2].dwData = 0 ;
	btn[2].iString = 2;

	btn[3].iBitmap = 3 ;
	btn[3].idCommand = ID_PRINT ;
	btn[3].fsState = TBSTATE_ENABLED  ;
	btn[3].fsStyle = TBSTYLE_BUTTON ;
	btn[3].dwData = 0 ;
	btn[3].iString = 3;

	btn[4].iBitmap = 4 ;
	btn[4].idCommand = ID_PRINT_PREVIEW ;
	btn[4].fsState = TBSTATE_ENABLED  ;
	btn[4].fsStyle = TBSTYLE_BUTTON ;
	btn[4].dwData = 0 ;
	btn[4].iString = 4;

	btn[5].iBitmap = 5 ;
	btn[5].idCommand = ID_ABOUT ;
	btn[5].fsState = TBSTATE_ENABLED  ;
	btn[5].fsStyle = TBSTYLE_BUTTON ;
	btn[5].dwData = 0 ;
	btn[5].iString = 5;

	//Enable the Tool Tips with the following line
	EnableToolTips(TRUE);

	SetToolBarPosition(0);

/*	CString s;
	s.Format("%d年%2d月份月报 ", m_Time.GetYear(),m_Time.GetMonth());
	char* ch = s.GetBuffer(s.GetLength());
	m_cMonth.SetWindowText(ch);
	s.Format("%d年度 年报 ", m_Time.GetYear());
	ch = s.GetBuffer(s.GetLength());
	m_cYear.SetWindowText(ch);
*/
	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

 	// TODO: Add extra initialization here
	//DWORD dwStyle = m_ListAttend.GetStyle();LVS_EX_FULLROWSELECT|
	DWORD dwStyle = m_ListDuty.GetStyle();
	dwStyle |= LVS_EX_GRIDLINES | LVS_SHOWSELALWAYS;
	dwStyle &= !LVS_EX_TRACKSELECT;
	m_ListDuty.SetExtendedStyle(dwStyle);
	m_ListDuty.SetBkColor(RGB(240,247,233));
	m_ListDuty.SetTextBkColor(RGB(240,247,233));

	RECT rect;
	m_ListDuty.GetClientRect(&rect);

	LV_COLUMN lvc;
	lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH |LVCF_FMT;
	lvc.fmt=LVCFMT_CENTER;
	lvc.iSubItem = 0;
	lvc.pszText = _T("Am 点到");
	lvc.cx = 60;
	m_ListDuty.InsertColumn(1,&lvc);
	lvc.iSubItem = 1;
	lvc.pszText = _T("午饭");
	lvc.cx = 60;
	m_ListDuty.InsertColumn(2,&lvc);
	lvc.iSubItem = 2;
	lvc.pszText = _T("Pm 点到");
	lvc.cx = 60;
	m_ListDuty.InsertColumn(3,&lvc);
	lvc.iSubItem = 3;
	lvc.pszText = _T("下班");
	lvc.cx = 60;
	m_ListDuty.InsertColumn(4,&lvc);
	lvc.iSubItem = 4;
	lvc.pszText = _T("晚间工作");
	lvc.cx = 70;
	m_ListDuty.InsertColumn(5,&lvc);
	lvc.iSubItem = 5;
	lvc.pszText = _T("结束");
	lvc.cx = 70;
	m_ListDuty.InsertColumn(6,&lvc);
	lvc.iSubItem = 6;
	lvc.pszText = _T("日工时");
	lvc.cx = rect.right-6*60-20;
	m_ListDuty.InsertColumn(7,&lvc);

	dwStyle = m_ListAttend.GetStyle();
	dwStyle |= LVS_EX_GRIDLINES |LVS_EX_FULLROWSELECT|LVS_SHOWSELALWAYS ;
	m_ListAttend.SetExtendedStyle(dwStyle);
	m_ListAttend.SetBkColor(RGB(240,247,233));
	m_ListAttend.SetTextBkColor(RGB(240,247,233));

	m_ListAttend.GetClientRect(&rect);
//	LV_COLUMN lvc;
	lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH |LVCF_FMT;
	lvc.fmt=LVCFMT_CENTER;
	lvc.iSubItem = 0;
	lvc.pszText = _T("日期");//NO.
	lvc.cx = 40;
	m_ListAttend.InsertColumn(1,&lvc);
	lvc.iSubItem = 1;
	lvc.pszText = _T("星期");//NO.
	lvc.cx = 60;
	m_ListAttend.InsertColumn(2,&lvc);
	lvc.iSubItem = 2;
	lvc.pszText = _T("Am 点到");
	lvc.cx = 60;
	m_ListAttend.InsertColumn(3,&lvc);
	lvc.iSubItem = 3;
	lvc.pszText = _T("午饭");
	lvc.cx = 55;
	m_ListAttend.InsertColumn(4,&lvc);
	lvc.iSubItem = 4;
	lvc.pszText = _T("Pm 点到");
	lvc.cx = 60;
	m_ListAttend.InsertColumn(5,&lvc);
	lvc.iSubItem = 5;
	lvc.pszText = _T("下班");
	lvc.cx = 55;
	m_ListAttend.InsertColumn(6,&lvc);
	lvc.iSubItem = 6;
	lvc.pszText = _T("晚间工作");
	lvc.cx = 70;
	m_ListAttend.InsertColumn(7,&lvc);
	lvc.iSubItem = 7;
	lvc.pszText = _T("结束");
	lvc.cx = 60;
	m_ListAttend.InsertColumn(8,&lvc);
	lvc.iSubItem = 8;
	lvc.pszText = _T("日工时");
	lvc.cx = rect.right-40-7*60;
	m_ListAttend.InsertColumn(9,&lvc);
//
	dwStyle = m_ListTotal.GetStyle();
	dwStyle |= LVS_EX_GRIDLINES |LVS_EX_FULLROWSELECT|LVS_SHOWSELALWAYS ;
	m_ListTotal.SetExtendedStyle(dwStyle);
	m_ListTotal.SetBkColor(RGB(240,247,233));
	m_ListTotal.SetTextBkColor(RGB(240,247,233));

	m_ListTotal.GetClientRect(&rect);
//	LV_COLUMN lvc;
	lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH |LVCF_FMT;
	lvc.fmt=LVCFMT_CENTER;
	lvc.iSubItem = 0;
	lvc.pszText = _T("月份");//NO.
	lvc.cx = 40;
	m_ListTotal.InsertColumn(1,&lvc);
	lvc.iSubItem = 1;
	lvc.pszText = _T("法定工作日");//NO.
	lvc.cx = 80;
	m_ListTotal.InsertColumn(2,&lvc);
	lvc.iSubItem = 2;
	lvc.pszText = _T("全勤工资");
	lvc.cx = 75;
	m_ListTotal.InsertColumn(3,&lvc);
	lvc.iSubItem = 3;
	lvc.pszText = _T("日均工资额");
	lvc.cx = 85;
	m_ListTotal.InsertColumn(4,&lvc);
	lvc.iSubItem = 4;
	lvc.pszText = _T("实出勤日");
	lvc.cx = 75;
	m_ListTotal.InsertColumn(5,&lvc);
	lvc.iSubItem = 5;
	lvc.pszText = _T("出勤工资");
	lvc.cx = 75;
	m_ListTotal.InsertColumn(6,&lvc);
	lvc.iSubItem = 6;
	lvc.pszText = _T("实发工资");
	lvc.cx = rect.right-430;
	m_ListTotal.InsertColumn(6,&lvc);

	lvitem.pszText="";
	lvitem.mask=LVIF_TEXT;
    lvitem.iSubItem=0;

//	CTime time=CTime::GetCurrentTime();
//	CTimeSpan tm=time-m_Time;

	m_iCurDate=m_Time.GetDay();
	m_iMaxDate=m_iCurDate;

//	CAttendanceApp* app=(CAttendanceApp*)AfxGetApp();
	m_sOpenPath = app->m_pszHelpFilePath;
	int index = m_sOpenPath.ReverseFind('\\');			
	m_sOpenPath = m_sOpenPath.Left(index);

	m_sSavePath=m_sOpenPath;
	m_sAttendFile="考勤"+m_Time.Format("%Y年");
	m_sAttendFile+=".atd";
	CString filename=m_sOpenPath+"\\"+m_sAttendFile;
	m_sFileExt="atd";
	CFile file;
	if(file.Open(filename,CFile::modeRead)!=0)
	{
		CArchive ar(&file,CArchive::load);

		CWaitCursor wait;
		Serialize(ar);     // save mem_sCfgFile
		ar.Close();
		file.Close();
		m_sOpenPath=m_sSavePath;
	}else
	{
		CString s = m_Time.Format("%Y");
		char* ch = s.GetBuffer(s.GetLength());
		int	i = atoi(ch);
		i--;
		itoa(i,ch,10);
		s = "考勤"+s;
		s += "年";
		s += ".atd";
		filename=m_sOpenPath+"\\"+s;
		if(file.Open(filename,CFile::modeRead)!=0)
		{
			CArchive ar(&file,CArchive::load);

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

}