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

📄 listctrlcess.cpp

📁 一个简单的个人所得税计算器,可以编辑税率表和所在地列表.
💻 CPP
字号:
// ListCtrlCess.cpp : implementation file
//

#include "stdafx.h"
#include "pitc.h"
#include "ListCtrlCess.h"
#include "MainFrm.h"
#include "BCMenu.h"

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

//extern int curCess; 
/////////////////////////////////////////////////////////////////////////////
// CListCtrlCess

CListCtrlCess::CListCtrlCess()
{
}

CListCtrlCess::~CListCtrlCess()
{
}


BEGIN_MESSAGE_MAP(CListCtrlCess, CMyListCtrl)
	//{{AFX_MSG_MAP(CListCtrlCess)
	ON_WM_RBUTTONDOWN()
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
	ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnItemchanged)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CListCtrlCess message handlers
void CListCtrlCess::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult) 
{
	//AfxMessageBox("CListCtrlCess::OnItemchanged");
	int count=GetSelectedCount();
    POSITION pos = GetFirstSelectedItemPosition();
	int m=GetNextSelectedItem(pos);

    CMainFrame *pMain;
	pMain=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
	if(m>-1)
	{
		pMain->m_bCessEdit=TRUE;
	    pMain->m_bCessDelete=TRUE;
	    //curCess=m;
	}
	else
	{
		pMain->m_bCessEdit=FALSE;
	    pMain->m_bCessDelete=FALSE;
	    //curCess=m;
	}


	////
	*pResult = 0;
}

void CListCtrlCess::UpdateNum()
{
	CString str;
	for(int i=0;i<GetItemCount();i++)
	{
		str.Format("%d",i+1);
		SetItemText(i,0,str);
	}


}

void CListCtrlCess::OnRButtonDown(UINT nFlags, CPoint point) 
{
	CMyListCtrl::OnRButtonDown(nFlags, point);
	// TODO: Add your message handler code here and/or call default
	
	CMainFrame *pMain;
	pMain=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
	
	//BCMenu menu;
	CMenu menu;
	if(menu.CreatePopupMenu())
		{
		    menu.AppendMenu(MF_STRING, ID_CESS_INSERT, "插入税率");
			menu.AppendMenu(MF_STRING, ID_CESS_ADD, "添加税率");
			if(pMain->m_bCessEdit)
			    menu.AppendMenu(MF_ENABLED|MF_STRING, ID_CESS_EDIT, "修改税率");
			else
				menu.AppendMenu(MF_DISABLED|MF_GRAYED, ID_CESS_EDIT, "修改税率");
			if(pMain->m_bCessDelete)
                menu.AppendMenu(MF_ENABLED|MF_STRING, ID_CESS_DELETE, "删除税率");
			else
				menu.AppendMenu(MF_DISABLED|MF_GRAYED, ID_CESS_DELETE, "删除税率");

			menu.AppendMenu(MF_ENABLED|MF_STRING, ID_CESS_CLEAR, "清空税率表");
			menu.AppendMenu(MF_STRING, MF_SEPARATOR);
			menu.AppendMenu(MF_STRING, ID_CONFIG_NEW, "新建配置");
			menu.AppendMenu(MF_STRING, ID_CONFIG_LOAD, "加载配置");
			menu.AppendMenu(MF_STRING, ID_CONFIG_SAVE, "保存配置");
			
			CPoint pt;
			pt=point;
			this->ClientToScreen(&pt);
			menu.TrackPopupMenu(TPM_LEFTALIGN, pt.x, pt.y, pMain);
			//menu.DestroyMenu();//采用BCMenu后要执行清理


		}
	/////
}

BOOL CListCtrlCess::ExamCess()
{
	int count;
	CString str;
	count=this->GetItemCount();
	/*
	if(count==0)
	{
		AfxMessageBox("税率表不能为空!");
		return FALSE;
	}
	*/
    ////条件1
	if (count>0)
	{
        SetItemText(0,1,"0.00");//第一级的超过值置为0
		SetItemText(count-1,2,"∞");//最高级的至值置为∞
	}

	

	if(count==1)//只有一个级别
	{
		SetItemText(count-1,4,"0");
	}
    if(count>=2)//2个级别以上
	{
	    for(int i=0;i<count;i++)
		{
			if(i<count-1)//最高级的至值不用取了
			{
				if(GetItemText(i,2)=="∞" && i>=0)
				{
					str=GetItemText(i+1,1);
					SetItemText(i,2,str);
					//如果不是最高级的至值为∞,则将该级别至值置为下一级别的超过值
				}
			}
		   str.Format("%.2f",ComputSub(i+1));
           SetItemText(i,4,str);//计算速算扣除数;
		}
	     //条件2
		for(i=0;i<count-1;i++)
		{
			if(atof(GetItemText(i,1))>=atof(GetItemText(i,2)))
            {
				str.Format("第%s级中的超过值应<至值!",GetItemText(i,0));
		    	AfxMessageBox(str);
				SetItemState(-1, 0, LVNI_SELECTED);//取消所有的item选中状态,执行后,item_cur可能会改变
		        SetFocus();
                SetItemState(i,LVNI_SELECTED,LVNI_SELECTED);
			    return FALSE;
			}
		}
	    for(int j=0;j<count;j++)
		{
			
			////条件3
		    if(atof(GetItemText(j,3))<=0 || atof(GetItemText(j,3))>=100)
			{
		    	str.Format("第%s级中的税率值应该>0且<100!",GetItemText(j,0));
		    	AfxMessageBox(str);
				SetItemState(-1, 0, LVNI_SELECTED);//取消所有的item选中状态,执行后,item_cur可能会改变
		        SetFocus();
                SetItemState(j,LVNI_SELECTED,LVNI_SELECTED);
			    return FALSE;
			}

         }
        
		for(int k=1;k<count;k++)
		{

            ////条件4
			if( GetItemText(k,1)!=GetItemText(k-1,2) )
			{
				str.Format("第%s级中的超过值应该=第%s级别中的至值",GetItemText(k,0),GetItemText(k-1,0));
		    	AfxMessageBox(str);
				SetItemState(-1, 0, LVNI_SELECTED);//取消所有的item选中状态,执行后,item_cur可能会改变
		        SetFocus();
                SetItemState(k,LVNI_SELECTED,LVNI_SELECTED);
			    return FALSE;
			}
		}

	}

	return TRUE;

}

double CListCtrlCess::ComputSub(int num)
{
	/*
	速算扣除数由系统根据税率表计算得到,方法如下:
设    N,表示级别数,N=1,2,3…
Vmin[N],表示第N级别的超过值
Vmax[N],表示第N级别的超过值
R[N],表示第N级别的税率
S[N],表示第N级别的速算扣除数

那么
                      i=1
S[N]=Vmin[N] * R[N] - Σ( ( Vmax[i]-Vmin[i] ) * R[i] )
                      i<N
*/
	//ASSERT(num>=2);
    double S;
    if(num==1)
	{
		S=0.00;
		return S;
	}

	double temp=0.00;
	double Vmin,Vmax,R;
	for(int i=0;i<num-1;i++)
	{ 
		Vmax=atof(GetItemText(i,2));
        Vmin=atof(GetItemText(i,1));
		R=atof(GetItemText(i,3));
		temp=temp + ( Vmax - Vmin ) * R*0.01;
	}
	
    Vmin=atof(GetItemText(num-1,1));
    R=atof(GetItemText(num-1,3));
	S=Vmin * R*0.01 - temp;

    S=((CPITCApp*)AfxGetApp())->Sswr(S,2);//保留2位小数
	return S;

}

int CListCtrlCess::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CMyListCtrl::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	SetExtendedStyle(LVS_REPORT|LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
    //::SendMessage(pListArea->m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,
     // LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);

	InsertColumn(0,"级数",LVCFMT_CENTER,40);
	InsertColumn(1,"全月应纳税所得额超过(>)  (元)",LVCFMT_RIGHT,190);
	InsertColumn(2,"全月应纳税所得额至(<=)  (元)",LVCFMT_RIGHT,190);
    InsertColumn(3,"税率  (%)",LVCFMT_RIGHT,75);
	InsertColumn(4,"速算扣除数  (元)",LVCFMT_RIGHT,110);
	//m_wndListCtrlArrea.EnableSort(FALSE);

	/*
	CString from[10]={"0","500","2000","5000","20000","40000","60000","80000","100000","∞"};
	//CString to[9]={"500","2000","5000","20000","40000","60000","80000","100000","--"};
	CString taxrate[9]={"5","10","15","20","25","30","35","40","45"};
	CString sub[9]={"0","25","125","375","1375","3375","6375","10375","15375"};
	int nitem;
	CString str;
	for(int i=0;i<9;i++)
	{
		str.Format("%d",i+1);
		nitem=InsertItem(i,str);
		
		SetItemText(nitem,1,from[i]);
        SetItemText(nitem,2,from[i+1]);
		SetItemText(nitem,3,taxrate[i]);
		SetItemText(nitem,4,sub[i]);
		
	}
	*/

	
	CString str;
	str="未加载配置文件";
	m_cToolTipCtrl.Create(this,TTS_ALWAYSTIP);
    //m_cToolTipCtrl.SetDelayTime(100);
	m_cToolTipCtrl.AddTool(this,str);
	////
	return 0;
}

BOOL CListCtrlCess::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	m_cToolTipCtrl.RelayEvent(pMsg);
	/////
	return CMyListCtrl::PreTranslateMessage(pMsg);
}

⌨️ 快捷键说明

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