Visual C++ 2019常用控件 │ 应用实例

Visual C++ 2019常用控件应用实例
01、实例简介
编写一个简单的统计购书应付款的应用程序。该程序完成在组合框中选择要购买书籍的类别,然后再从列表框中选择要购买的书籍,并统计出应付的钱数。
02、创建过程
1●创建MFC应用程序框架
使用“MFC应用”项目模板生成一个基于对话框的应用程序SaleList,并将主窗口对话框的标题设置为“购书清单”。
2●编辑对话框
(1) 打开对话框编辑器,在对话框设计模板中添加如图6.25所示的控件,为组合框添加初始列表项:建筑类、社科类、医学类,并利用类向导工具为有关控件添加关联成员变量,如表6.23所示。旋转按钮的属性设置与例6.6中相同,编辑框“只读”属性设置为true,其他均接受系统默认。

■ 图6.25 对话框控件布局
表6.23 对话框控件及成员变量

3●添加结构体数组
打开SaleListDlg.cpp文件,在其顶端添加结构体数组,用于存储可购书籍的类别、名称、购买与否以及价格信息。
struct commodity
{
CString strType;
CString strName;
int bIsBuy;
int nPrice;
int count;
}comm[]=
{L"建筑类",L"建筑环境学",0,36,1,
L"建筑类",L"建筑制图",0,28,1,
L"建筑类",L"建筑结构",0,45,1,
L"建筑类",L"建筑设备",0,62,1,
L"社科类",L"民法",0,55,1,
L"社科类",L"哲学",0,68,1,
L"社科类",L"社会学",0,45,1,
L"社科类",L"中国近代史",0,28,1,
L"医学类",L"内科",0,76,1,
L"医学类",L"临床医学",0,56,1,
L"医学类",L"解剖学",0,39,1,
L"医学类",L"护理学",0,90,1
};
4●添加初始化代码
在对话框类CSaleListDlg的初始化成员函数OnInitDialog()中添加代码,设定书籍类别、名称的初始显示值、数量的限制范围及初始值。
BOOL CSaleListDlg::OnInitDialog()
{
CDialog::OnInitDialog();
…
// TODO: 在此添加额外的初始化代码
m_cmbType.SetCurSel(0); //设置组合框中初始显示的书籍类别
for(int i=0;i<4;i++) //设置列表框中初始显示的书籍名称
m_lstName.AddString(comm[i].strName);
m_spin.SetRange(1,100); //设置购书最高数量
m_spin.SetPos(1); //设置购书数量初始显示值
return TRUE;
}
5●添加消息处理函数
使用利用类向导工具在对话框类CSaleListDlg中为组合框、列表框、复选框以及“应付款”按钮添加如表6.24所示消息处理函数,并在处理函数中添加代码。
表6.24 控件及消息映射

void CSaleListDlg::OnSelchangeSaleType()
{
CString strtype;
int mindex=m_cmbType.GetCurSel(); //获取类别选择项位置序号
m_lstName.ResetContent(); //清除书名列表框中所有的列表项
m_cmbType.GetLBText(mindex,strtype);//获取类别选择项文本
for(int i=0;i<12;i++) //将所选类别的书籍名称添加到列表框
if(strtype==comm[i].strType)
m_lstName.AddString(comm[i].strName);
}
void CSaleListDlg::OnDropdownSaleType()
{ //用户再次选择书籍类别时,重新设置数量、价格及购买复选框的状态
// TODO: 在此添加控件通知处理程序代码
m_spin.SetPos(1); //数量置1
m_strPrice=" "; //价格置空
m_blsBuy=0; //设置不购买状态
UpdateData(false);
}
void CSaleListDlg::OnSelchangeSaleList()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData( );
for(int i=0;i<12;i++)
{
if(m_strName==comm[i].strName)
{
CString str;
str.Format("%d元",comm[i].nPrice);//获得价格
m_strPrice=str;
m_blsBuy=comm[i].bIsBuy; //是否已购所选书籍
m_spin.SetPos(comm[i].count); //设置购书数量
UpdateData(false); //更新显示
break;
}
}
}
void CSaleListDlg::OnIsBuy()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
for(int i=0;i<12;i++)
if(m_strName==comm[i].strName)
{
comm[i].bIsBuy=m_blsBuy; //获取购买信息
comm[i].count=m_spin.GetPos(); //获得购书数量
break;
}
}
void CSaleListDlg::OnCalSum()
{
// TODO: 在此添加控件通知处理程序代码
int total=0;
CString str;
for(int i=0;i<12;i++)
if(comm[i].bIsBuy==1)
total+=comm[i].nPrice*comm[i].count; //计算应付款
str.Format("您应当支付%d元",total);
MessageBox(str);
}
编译、链接并运行程序,选择购买建筑类的“建筑环境学”(2本)和社科类的“民法”(3本),单击“应付款”按钮,结果如图6.26所示。程序运行时,请按照“类别”→“书名”→“数量”→“购买”的顺序进行操作,已购买的书籍不能重新购买,也不能更改其数量。

■ 图6.26 程序运行结果
- 点赞
- 收藏
- 关注作者
评论(0)