📄 outcomewizarddlg1.cpp
字号:
// OutcomeWizardDlg1.cpp : 实现文件
//
#include "stdafx.h"
#include "SMS.h"
#include "OutcomeWizardDlg1.h"
// COutcomeWizardDlg1 对话框
IMPLEMENT_DYNAMIC(COutcomeWizardDlg1, CDialog)
COutcomeWizardDlg1::COutcomeWizardDlg1(CWnd* pParent /*=NULL*/)
: CDialog(COutcomeWizardDlg1::IDD, pParent)
, m_pBankSet(&theApp.m_db )
, m_pOutcomeSet(&theApp.m_db )
, m_pTangibleSet(&theApp.m_db )
, m_pCashSet(&theApp.m_db )
{
pPageLink=NULL;
m_pFlow=new tagOutcomeFlow;
m_pCount=new tagOutcomeCount;
m_pSource=new tagSource;
nPageCount=0;
nCurrentPage=0;
m_backcolor=m_RGB_BkColor;
m_brush.CreateSolidBrush(m_backcolor);
m_pOutcome_Step1 =new COutcomeWizardOutcomeDlg ;
m_pTangibleCount_Step2 =new CIncomeWizardTangibleCountDlg ;
m_pTangible_Step3 =new CIncomeWizardTangibleDlg ;
m_pTangible1_Step4 =new CIncomeWizardTangibleDlg ;
m_pTangible2_Step5 =new CIncomeWizardTangibleDlg ;
m_pTangible3_Step6 =new CIncomeWizardTangibleDlg ;
m_pTangible4_Step7 =new CIncomeWizardTangibleDlg ;
m_pBankCount_Step8 =new CIncomeWizardBankCountDlg ;
m_pBank_Step9 =new CIncomeWizardBankDlg ;
m_pBank1_Step10 =new CIncomeWizardBankDlg ;
m_pBank2_Step11 =new CIncomeWizardBankDlg ;
m_pBank3_Step12 =new CIncomeWizardBankDlg ;
m_pBank4_Step13 =new CIncomeWizardBankDlg ;
m_pFinish_Step14 =new CIncomeWizardFinishDlg ;
m_pBank_Step9->m_bOutcome =true;
m_pBank1_Step10->m_bOutcome =true;
m_pBank2_Step11->m_bOutcome =true;
m_pBank3_Step12->m_bOutcome =true;
m_pBank4_Step13->m_bOutcome =true;
m_bWzOutcome=true;
}
COutcomeWizardDlg1::~COutcomeWizardDlg1()
{
}
void COutcomeWizardDlg1::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(COutcomeWizardDlg1, CDialog)
ON_BN_CLICKED(IDC_PREV, &COutcomeWizardDlg1::OnBnClickedPrev)
ON_BN_CLICKED(IDC_NEXT, &COutcomeWizardDlg1::OnBnClickedNext)
ON_BN_CLICKED(IDC_FINISH, &COutcomeWizardDlg1::OnBnClickedFinish)
ON_BN_CLICKED(IDC_CANCEL, &COutcomeWizardDlg1::OnBnClickedCancel)
ON_WM_DESTROY()
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
// COutcomeWizardDlg1 消息处理程序
void COutcomeWizardDlg1::SetWizButton(UINT uFlag)
{
if(uFlag==0)//第一步
{
GetDlgItem(IDC_CANCEL)->EnableWindow(TRUE);
GetDlgItem(IDC_PREV)->EnableWindow(FALSE);
GetDlgItem(IDC_NEXT)->EnableWindow(TRUE);
GetDlgItem(IDC_FINISH)->EnableWindow (FALSE);
return ;
}
if(uFlag>=(nPageCount-1))//最后一步
{
GetDlgItem(IDC_CANCEL)->EnableWindow(TRUE);
GetDlgItem(IDC_PREV)->EnableWindow(TRUE);
GetDlgItem(IDC_NEXT)->EnableWindow(FALSE);
GetDlgItem(IDC_FINISH)->EnableWindow (TRUE);
return ;
}
//中间步骤
GetDlgItem(IDC_CANCEL)->EnableWindow(TRUE);
GetDlgItem(IDC_PREV)->EnableWindow(TRUE);
GetDlgItem(IDC_NEXT)->EnableWindow(TRUE);
GetDlgItem(IDC_FINISH)->EnableWindow (FALSE);
}
void COutcomeWizardDlg1::ShowPage (UINT nPos)
{
struct PAGELINK* pTemp=pPageLink;
while(pTemp)
{
if (pTemp->nNum==nPos)//中间部分
{
pTemp->pDialog->ShowWindow(SW_SHOW);
}
else
pTemp->pDialog->ShowWindow(SW_HIDE);
pTemp=pTemp->Next;
}
if (nPos>=nPageCount) //最后一页
{
nCurrentPage=nPageCount;
SetWizButton(nPageCount);
return;
}
if (nPos<=1) //第一页
{
nCurrentPage=1;
SetWizButton(0);
return;
}
//中间部分的结果就是:所有的都必须显示,故
for(int i=1; i<(int)nPageCount-1; i++)
SetWizButton(i);
}
void COutcomeWizardDlg1::AddPage(CDialog* pDialog, UINT nID)
{
struct PAGELINK* pTemp = pPageLink;
//插入新生成的节点
struct PAGELINK* pNewPage = new PAGELINK;
pNewPage->pDialog = pDialog;
pNewPage->pDialog->Create(nID,this);
// Is window created
ASSERT(::IsWindow(pNewPage->pDialog->m_hWnd));
//检查每页的样式
DWORD dwStyle = pNewPage->pDialog->GetStyle();
ASSERT((dwStyle & WS_CHILD) != 0); //子窗口
ASSERT((dwStyle & WS_BORDER) == 0);//无边框
pNewPage->pDialog->ShowWindow(SW_HIDE);//显示
pNewPage->pDialog->MoveWindow(rectPage);
pNewPage->Next=NULL;
pNewPage->nNum=++nPageCount; //计数器自增
if (pTemp)
{
while (pTemp->Next) pTemp=pTemp->Next; //移动到链未
pTemp->Next=pNewPage;
}
else
pPageLink=pNewPage; //若是第一个
}
BOOL COutcomeWizardDlg1::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
SetWindowText(L"支出登记向导");
CRect Rect1;
GetWindowRect(&Rect1); //获取窗口大小
int nCaption = ::GetSystemMetrics(SM_CYCAPTION);
int nXEdge = ::GetSystemMetrics(SM_CXEDGE);
int nYEdge = ::GetSystemMetrics(SM_CYEDGE);
CRect Rect2;
GetDlgItem(IDC_POS)->GetWindowRect(&Rect2); //获取显示位置
Rect1.top=Rect1.top+nCaption+nYEdge; //相对坐标
Rect1.left=Rect1.left+2*nXEdge;
//计算位置
rectPage.top=Rect2.top-Rect1.top;
rectPage.left=Rect2.left-Rect1.left;
rectPage.bottom=Rect2.bottom-Rect1.top;
rectPage.right=Rect2.right-Rect1.left;
//初始化要添加的页
AddPage(m_pOutcome_Step1,IDD_OUTCOME_WIZARD_OUTCOME_DLG);
AddPage(m_pTangibleCount_Step2, IDD_INCOME_WIZARD_TANGIBLE_COUNT_DIALOG);
AddPage(m_pTangible_Step3, IDD_INCOME_WIZARD_TANGIBLE_DLG);
AddPage(m_pTangible1_Step4, IDD_INCOME_WIZARD_TANGIBLE_DLG);
AddPage(m_pTangible2_Step5, IDD_INCOME_WIZARD_TANGIBLE_DLG);
AddPage(m_pTangible3_Step6, IDD_INCOME_WIZARD_TANGIBLE_DLG);
AddPage(m_pTangible4_Step7, IDD_INCOME_WIZARD_TANGIBLE_DLG);
AddPage(m_pBankCount_Step8,IDD_INCOME_WIZARD_BANK_COUNT_DLG);
AddPage(m_pBank_Step9,IDD_INCOME_WIZARD_BANK_DLG);
AddPage(m_pBank1_Step10,IDD_INCOME_WIZARD_BANK_DLG);
AddPage(m_pBank2_Step11,IDD_INCOME_WIZARD_BANK_DLG);
AddPage(m_pBank3_Step12,IDD_INCOME_WIZARD_BANK_DLG);
AddPage(m_pBank4_Step13,IDD_INCOME_WIZARD_BANK_DLG);
AddPage(m_pFinish_Step14,IDD_INCOME_WIZARD_FINISH_DLG);
//显示第一页
ShowPage(1);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void COutcomeWizardDlg1::OnDestroy()
{
CDialog::OnDestroy();
// TODO: 在此处添加消息处理程序代码
//依次消除每页
struct PAGELINK* pTemp = pPageLink;
while(pTemp)
{
struct PAGELINK* pNextTemp = pTemp->Next;
pTemp->pDialog->DestroyWindow();
delete pTemp->pDialog;
delete pTemp;
pTemp = pNextTemp;
}
}
void COutcomeWizardDlg1::OnBnClickedFinish()
{
// TODO: 在此添加控件通知处理程序代码
if(!theApp.m_db.CanTransact ())
{
//虽然不支持事务处理的数据库很少,但是我强硬地不允许这种情况出现
MessageBox(L"\n系统不支持事务处理,向导不成功!\n",L"错误", MB_ICONSTOP);
return ;
}
theApp.m_db.BeginTrans ();//开始事务处理
try
{
SaveAllTangible();
SaveAllBank();
SaveAllCash();
SaveOutcome(m_pOutcome_Step1);
theApp.m_db.CommitTrans ();//添加成功了
}
catch(CDBException)
{
theApp.m_db.Rollback ();
MessageBox(L"\n事务处理出错,向导失败!\n",L"错误", MB_ICONSTOP);
return;
}
// END_CATCH_ALL
CDialog::OnOK();
}
void COutcomeWizardDlg1::OnBnClickedPrev()
{
// TODO: 在此添加控件通知处理程序代码
LinkStack.Pop ();
int nStep;
if(LinkStack.IsEmpty ())
nStep=1;
else
nStep=LinkStack.Pop ();
UpdateStep(nStep);
UpdateWindow();
m_pFinish_Step14->m_cFinish_List .DeleteAllItems ();
}
void COutcomeWizardDlg1::OnBnClickedNext()
{
// TODO: 在此添加控件通知处理程序代码
switch(nCurrentPage)
{
case 1:
OutcomeNext();
break;
case 2:
TangibleCountNext();
break;
case 3:
TangibleNext();
break;
case 4:
Tangible1Next();
break;
case 5:
Tangible2Next();
break;
case 6:
Tangible3Next();
break;
case 7:
Tangible4Next();
break;
case 8:
BankCountNext();
break;
case 9:
BankNext();
break;
case 10:
Bank1Next();
break;
case 11:
Bank2Next();
break;
case 12:
Bank3Next();
break;
case 13:
Bank4Next();
break;
default:break;
}
if(nCurrentPage==nPageCount)
{
ListOutcome();
GetDlgItem(IDC_FINISH)->EnableWindow (TRUE);
}
UpdateWindow();
//下面是关键代码,用于处理各个子对话框之间的关系,特别是个数与非个数的关系
}
void COutcomeWizardDlg1::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
CDialog::OnCancel ();
}
void COutcomeWizardDlg1::SetCaption (UINT nPos)
{
CString StrCaption;
CString m_sCaption[14]=
{
L"支出登记向导:第一步",
L"支出登记向导:购买物品个数",
L"支出登记向导:购买物品1",
L"支出登记向导:购买物品2",
L"支出登记向导:购买物品3",
L"支出登记向导:购买物品4",
L"支出登记向导:购买物品5",
L"支出登记向导:银行取款个数",
L"支出登记向导:银行取款1",
L"支出登记向导:银行取款2",
L"支出登记向导:银行取款3",
L"支出登记向导:银行取款4",
L"支出登记向导:银行取款5",
L"支出登记向导:完成",
};
StrCaption=m_sCaption[nPos-1];
SetWindowText(StrCaption);
}
void COutcomeWizardDlg1::OutcomeNext ()
{
m_pOutcome_Step1->UpdateData ();
if(m_pOutcome_Step1->m_dAmount ==0)
{
MessageBox(L"支出金额不能为0!",L"提示",MB_ICONEXCLAMATION);
return ;
}
if(m_pOutcome_Step1->m_sName ==L"")
{
MessageBox(L"支出名称不能为空!",L"提示",MB_ICONEXCLAMATION);
return ;
}
if(m_pOutcome_Step1->m_bBank ==FALSE&&m_pOutcome_Step1->m_bCash ==FALSE)
{
MessageBox(L"请选择支出来源!",L"提示",MB_ICONEXCLAMATION);
return ;
}
if(m_pOutcome_Step1->m_bTangible ==FALSE&&m_pOutcome_Step1->m_bOther ==FALSE)
{
MessageBox(L"请选择支出类型!",L"提示",MB_ICONEXCLAMATION);
return ;
}
m_pFlow->m_bOtherConsum =m_pOutcome_Step1->m_bOther ;
m_pFlow->m_bTangible =m_pOutcome_Step1->m_bTangible ;
m_pSource->m_bBank=m_pOutcome_Step1->m_bBank ;
m_pSource->m_bCash=m_pOutcome_Step1->m_bCash ;
//下面进行判断下一步
if(m_pFlow->m_bTangible )//进入物品登记
{
UpdateStep(TANGIBLECOUNT_STEP2);
return ;
}//因为上面已经确定,没有物品登记则必然有其他支出,则直接判断是否有银行
if(m_pSource->m_bBank )//进入银行登记
{
UpdateStep(BANKCOUNT_STEP8);
return ;
}
//如果都没有,则说明情况是: 只有现金流入了其他消费,则只要判断现金够不够其他消费总额就可以了
if(GetDatabaseCash()<m_pOutcome_Step1->m_dAmount )//钱不够,又么有银行来取,当然不对了
{
MessageBox(L"现金不够支出,\n请检查所输入的数据后再继续!登记!",L"提示",MB_ICONEXCLAMATION);
return ;
}
//否则,可以结束登记了
ListOutcome();
ListCash();
UpdateStep(FINISH_STEP14);
}
void COutcomeWizardDlg1::TangibleCountNext ()
{
m_pTangibleCount_Step2->UpdateData ();
m_pCount->m_iTangibleCount =m_pTangibleCount_Step2->m_iTangibleCount ;
if(m_pCount->m_iTangibleCount ==0)//如果只选择了0个,不允许前进
{
MessageBox(L"所选择的购物种数不能为0,否则必须退回起始界面修改支出类型!",L"警告",MB_ICONEXCLAMATION);
return ;
}
else//否则,进入物品购买登记
{
m_pCount->m_iCurTangible =1;
UpdateStep(TANGIBLE_STEP3);
return ;
}
}
void COutcomeWizardDlg1::TangibleNext ()
{
//首先判断输入是否正确
m_pOutcome_Step1->UpdateData ();
m_pTangible_Step3->UpdateData ();
if(m_pTangible_Step3->m_sName ==L"")
{
MessageBox(L"\n物品名称不能为空!\n",L"提示",MB_ICONEXCLAMATION);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -