📄 listctrlcess.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 + -