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

📄 outcomewizarddlg1.cpp

📁 这是一个学生信息管理系统
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// 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 + -