📄 incomewizarddlg.cpp
字号:
// IncomeWizardDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "SMS.h"
#include "IncomeWizardDlg.h"
// CIncomeWizardDlg 对话框
IMPLEMENT_DYNAMIC(CIncomeWizardDlg, CDialog)
CIncomeWizardDlg::CIncomeWizardDlg(CWnd* pParent /*=NULL*/)
: CDialog(CIncomeWizardDlg::IDD, pParent)
, m_pIncomeSet(&theApp.m_db )
, m_pBankSet(&theApp.m_db )
, m_pOutcomeSet(&theApp.m_db )
, m_pTangibleSet(&theApp.m_db )
, m_pInvestSet(&theApp.m_db )
, m_pBorrowSet(&theApp.m_db )
, m_pCashSet(&theApp.m_db )
{
pPageLink=NULL;
m_pFlow=new tagFlow;
m_pCount=new tagCount;
nPageCount=0;
nCurrentPage=0;
m_backcolor=m_RGB_BkColor;
m_brush.CreateSolidBrush(m_backcolor);
m_pIncome_Step1 =new CIncomeWizardIncomeDlg ;
m_pBankCount_Step2 =new CIncomeWizardBankCountDlg ;
m_pBank_Step3 =new CIncomeWizardBankDlg ;
m_pBank1_Step4 =new CIncomeWizardBankDlg ;
m_pBank2_Step5 =new CIncomeWizardBankDlg ;
m_pBank3_Step6 =new CIncomeWizardBankDlg ;
m_pBank4_Step7 =new CIncomeWizardBankDlg ;
m_pOutcome_Step8 =new CIncomeWizardOutcomeDlg ;
m_pTangibleCount_Step9 =new CIncomeWizardTangibleCountDlg ;
m_pTangible_Step10 =new CIncomeWizardTangibleDlg ;
m_pTangible1_Step11 =new CIncomeWizardTangibleDlg ;
m_pTangible2_Step12 =new CIncomeWizardTangibleDlg ;
m_pTangible3_Step13 =new CIncomeWizardTangibleDlg ;
m_pTangible4_Step14 =new CIncomeWizardTangibleDlg ;
m_pInvestCount_Step15 =new CIncomeWizardInvestCountDlg ;
m_pInvest_Step16 =new CIncomeWizardInvestDlg ;
m_pInvest1_Step17 =new CIncomeWizardInvestDlg ;
m_pInvest2_Step18 =new CIncomeWizardInvestDlg ;
m_pInvest3_Step19 =new CIncomeWizardInvestDlg ;
m_pInvest4_Step20 =new CIncomeWizardInvestDlg ;
m_pBorrowCount_Step21 =new CIncomeWizardBorrowCountDlg ;
m_pBorrow_Step22 =new CIncomeWizardBorrowDlg ;
m_pBorrow1_Step23 =new CIncomeWizardBorrowDlg ;
m_pBorrow2_Step24 =new CIncomeWizardBorrowDlg ;
m_pBorrow3_Step25 =new CIncomeWizardBorrowDlg ;
m_pBorrow4_Step26 =new CIncomeWizardBorrowDlg ;
m_pFinish_Step27 =new CIncomeWizardFinishDlg ;
m_pBank_Step3->m_bOutcome =false;
m_pBank1_Step4->m_bOutcome =false;
m_pBank2_Step5->m_bOutcome =false;
m_pBank3_Step6->m_bOutcome =false;
m_pBank4_Step7->m_bOutcome =false;
m_bWzOutcome=false;
}
CIncomeWizardDlg::~CIncomeWizardDlg()
{
}
void CIncomeWizardDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CIncomeWizardDlg, CDialog)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_FINISH, &CIncomeWizardDlg::OnBnClickedFinish)
ON_BN_CLICKED(IDC_PREV, &CIncomeWizardDlg::OnBnClickedPrev)
ON_BN_CLICKED(IDC_NEXT, &CIncomeWizardDlg::OnBnClickedNext)
ON_BN_CLICKED(IDC_CANCEL, &CIncomeWizardDlg::OnBnClickedCancel)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
// CIncomeWizardDlg 消息处理程序
void CIncomeWizardDlg::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 CIncomeWizardDlg::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 CIncomeWizardDlg::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 CIncomeWizardDlg::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_pIncome_Step1,IDD_INCOME_WIZARD_INCOME_DLG);
AddPage(m_pBankCount_Step2,IDD_INCOME_WIZARD_BANK_COUNT_DLG);
AddPage(m_pBank_Step3,IDD_INCOME_WIZARD_BANK_DLG);
AddPage(m_pBank1_Step4,IDD_INCOME_WIZARD_BANK_DLG);
AddPage(m_pBank2_Step5,IDD_INCOME_WIZARD_BANK_DLG);
AddPage(m_pBank3_Step6,IDD_INCOME_WIZARD_BANK_DLG);
AddPage(m_pBank4_Step7,IDD_INCOME_WIZARD_BANK_DLG);
AddPage(m_pOutcome_Step8,IDD_INCOME_WIZARD_OUTCOME_DLG);
AddPage(m_pTangibleCount_Step9, IDD_INCOME_WIZARD_TANGIBLE_COUNT_DIALOG);
AddPage(m_pTangible_Step10, IDD_INCOME_WIZARD_TANGIBLE_DLG);
AddPage(m_pTangible1_Step11, IDD_INCOME_WIZARD_TANGIBLE_DLG);
AddPage(m_pTangible2_Step12, IDD_INCOME_WIZARD_TANGIBLE_DLG);
AddPage(m_pTangible3_Step13, IDD_INCOME_WIZARD_TANGIBLE_DLG);
AddPage(m_pTangible4_Step14, IDD_INCOME_WIZARD_TANGIBLE_DLG);
AddPage(m_pInvestCount_Step15,IDD_INCOME_WIZARD_INVEST_COUNT_DIALOG);
AddPage(m_pInvest_Step16,IDD_INCOME_WIZARD_INVEST_DLG);
AddPage(m_pInvest1_Step17,IDD_INCOME_WIZARD_INVEST_DLG);
AddPage(m_pInvest2_Step18,IDD_INCOME_WIZARD_INVEST_DLG);
AddPage(m_pInvest3_Step19,IDD_INCOME_WIZARD_INVEST_DLG);
AddPage(m_pInvest4_Step20,IDD_INCOME_WIZARD_INVEST_DLG);
AddPage(m_pBorrowCount_Step21,IDD_INCOME_WIZARD_BORROW_COUNT_DLG);
AddPage(m_pBorrow_Step22,IDD_INCOME_WIZARD_BORROW_DLG);
AddPage(m_pBorrow1_Step23,IDD_INCOME_WIZARD_BORROW_DLG);
AddPage(m_pBorrow2_Step24,IDD_INCOME_WIZARD_BORROW_DLG);
AddPage(m_pBorrow3_Step25,IDD_INCOME_WIZARD_BORROW_DLG);
AddPage(m_pBorrow4_Step26,IDD_INCOME_WIZARD_BORROW_DLG);
AddPage(m_pFinish_Step27,IDD_INCOME_WIZARD_FINISH_DLG);
//显示第一页
ShowPage(1);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CIncomeWizardDlg::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 CIncomeWizardDlg::OnBnClickedFinish()
{
// TODO: 在此添加控件通知处理程序代码
if(!theApp.m_db.CanTransact ())
{
//虽然不支持事务处理的数据库很少,但是我强硬地不允许这种情况出现
MessageBox(L"\n系统不支持事务处理,向导不成功!\n",L"错误", MB_ICONSTOP);
return ;
}
theApp.m_db.BeginTrans ();//开始事务处理
TRY
{
SaveIncome(m_pIncome_Step1);
SaveAllBank();
SaveAllOutcome();
SaveAllTangible();
SaveAllInvest();
SaveAllBorrow();
SaveAllCash();
theApp.m_db.CommitTrans ();//添加成功了
}
CATCH_ALL(e)
{
theApp.m_db.Rollback ();
MessageBox(L"\n事务处理出错,向导失败!\n",L"错误", MB_ICONSTOP);
return;
}
END_CATCH_ALL
CDialog::OnOK();
}
void CIncomeWizardDlg::OnBnClickedPrev()
{
// TODO: 在此添加控件通知处理程序代码
LinkStack.Pop ();
int nStep;
if(LinkStack.IsEmpty ())
nStep=1;
else
nStep=LinkStack.Pop ();
UpdateStep(nStep);
UpdateWindow();
m_pFinish_Step27->m_cFinish_List .DeleteAllItems ();
}
void CIncomeWizardDlg::OnBnClickedNext()
{
// TODO: 在此添加控件通知处理程序代码
switch(nCurrentPage)
{
case 1:
IncomeNext();
break;
case 2:
BankCountNext();
break;
case 3:
BankNext();
break;
case 4:
Bank1Next();
break;
case 5:
Bank2Next();
break;
case 6:
Bank3Next();
break;
case 7:
Bank4Next();
break;
case 8:
OutcomeNext();
break;
case 9:
TangibleCountNext();
break;
case 10:
TangibleNext();
break;
case 11:
Tangible1Next();
break;
case 12:
Tangible2Next();
break;
case 13:
Tangible3Next();
break;
case 14:
Tangible4Next();
break;
case 15:
InvestCountNext();
break;
case 16:
InvestNext();
break;
case 17:
Invest1Next();
break;
case 18:
Invest2Next();
break;
case 19:
Invest3Next();
break;
case 20:
Invest4Next();
break;
case 21:
BorrowCountNext();
break;
case 22:
BorrowNext();
break;
case 23:
Borrow1Next();
break;
case 24:
Borrow2Next();
break;
case 25:
Borrow3Next();
break;
case 26:
Borrow4Next();
break;
default:break;
}
if(nCurrentPage==nPageCount)
{
ListIncome();
GetDlgItem(IDC_FINISH)->EnableWindow (TRUE);
}
UpdateWindow();
//下面是关键代码,用于处理各个子对话框之间的关系,特别是个数与非个数的关系
}
void CIncomeWizardDlg::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
CDialog::OnCancel ();
}
void CIncomeWizardDlg::SetCaption (UINT nPos)
{
CString StrCaption;
CString m_sCaption[27]=
{
L"收入登记向导:第一步",
L"收入登记向导:银行存款个数",
L"收入登记向导:银行存款1",
L"收入登记向导:银行存款2",
L"收入登记向导:银行存款3",
L"收入登记向导:银行存款4",
L"收入登记向导:银行存款5",
L"收入登记向导:支出",
L"收入登记向导:购买物品个数",
L"收入登记向导:购买物品1",
L"收入登记向导:购买物品2",
L"收入登记向导:购买物品3",
L"收入登记向导:购买物品4",
L"收入登记向导:购买物品5",
L"收入登记向导:投资个数",
L"收入登记向导:投资1",
L"收入登记向导:投资2",
L"收入登记向导:投资3",
L"收入登记向导:投资4",
L"收入登记向导:投资5",
L"收入登记向导:借贷个数",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -