<May17,2015>
周日的阳光没那么美好,一起床就漫天乌云。写完高数作业后就开始了自己的MFC专研之旅。
打开C++老师给我们的作业,是一道简单的银行管理吧,老师给的页面如下:
这界面给我的感觉还是挺先进的,毕竟之前一直看的都是命令行,如下:
任务6要求:仿照账户1,完成账户2。
= = ,要求就这么简单,来看看老师给的关键实现代码。
// bankDlg.cpp : implementation file
//
#include "stdafx.h"
#include "cmath"
#include "bank.h"
#include "bankDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum{ IDD = IDD_ABOUTBOX };
//}}AFX_DATA
//ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoid DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
……..
void CBankDlg::OnButton4()
{
//TODO: Add your control notification handler code here
UpdateData(TRUE);//从窗口编辑框中读入数据
//if(psa0) delete psa0;
//psa0=newSavingsAccount(m_lastDate1,m_id1,m_rate1);
sa0.setId(m_id1);
sa0.setlastDate(m_lastDate1);
sa0.setRate(m_rate1);
sa0.initBalance();
m_balance1=sa0.getBalance();
m_note1="恭喜您,账号1开户成功!";
UpdateData(FALSE);
}
void CBankDlg::OnButton1()
{
//TODO: Add your control notification handler code here
UpdateData(TRUE);//从窗口编辑框中读入数据
sa0.deposit(m_lastDate1,m_amount1);
m_balance1=sa0.getBalance();
m_note1="恭喜您,账号1存款成功!最新余额请看对应信息!";
UpdateData(FALSE);
}
void CBankDlg::OnButton2()
{
//TODO: Add your control notification handler code here
UpdateData(TRUE);//从窗口编辑框中读入数据
intstate;
state=sa0.withdraw(m_lastDate1,m_amount1);
m_balance1=sa0.getBalance();
if(state)
m_note1="恭喜您,账号1取款成功!最新余额请看对应信息!";
else
m_note1="很遗憾,余额不足,账号1取款失败!";
UpdateData(FALSE);
}
void CBankDlg::OnButton3()
{
//TODO: Add your control notification handler code here
UpdateData(TRUE);//从窗口编辑框中读入数据
sa0.settle(m_lastDate1);
m_balance1=sa0.getBalance();
m_note1="结息成功!最新余额请看对应信息!";
UpdateData(FALSE);//更新界面的显示
}
……..
关于上面的UpdateDate()的作用,我后来在孙鑫的《VC++深入详解》看见。它的作用是调用一个BankDlg.cpp中的一个DoDataExchange函数,这个函数的功能是完成在编辑框控件数据的与变量的交换。但在程序打代码中从来不直接调用这个函数,而是通过CWnd类的另一个成员函数:UpdateData来调用。通过调用后这来初始化对话框控件或从对话框获取数据。也就是说,为了数据交换生效,就必须调用DoDataExchange函数,但程序代码不是直接调用这个函数而是需要去调用UpdateData这个函数。后者具体如下声明形式:
BOOLUpdateData (BOOL bSaveAndValidate = TRUE);
UpdateData函数有一个BOOL类型的参数。如果其值为TRUE,则说明该函数正在获取对话框数据;如果其值为FALSE,则说明该函数正在初始化对话框的控件。
(上面对UpdateData的接受也是来源于孙鑫的《VC++深入详解》)、
看到这里,我才发现老师给我们的代码是最简单的访问控件的方式,就是将编辑框分别于对话框类的成员变量相关联,然后通过这些变量来检索和设置编辑框的文本。为了将对话框与类的成员变量相关联,需要利用ClassWizard来帮助我们完成。账户1的相关成员变量关联如下图:
仿照账户1的源代码和对UpdateData的理解,很快的完成了这次作业。
这里我最想记下来的就是UpdateDate调用DoDateExchange的这种机制,起初接触MFC的时候我妄想在代码中加入诸如 m_Edit1 = = 45..此类的语句就能完成编辑框的输入与显示,但是,现在我发现我想得太简单。首先,编辑框控件内的内容是字符串类型,而代码中的45为整数型,转换上就行不通。不过可以使用相关的函数完成转换后赋值,在日后的学习中慢慢积累吧!