C++程序设计(下)
——对话框控件的高级应用
姓 名: 吴明仕
班 级: 1020551
学 号: 33
指导老师: 孔 令 德
时间:20##年12月6日
一、设计描述
该设计充分利用控件的不同属性实现“变幻莫测”的功能。在左边的“测试文本框属性栏”单击相应的单选按钮可以是文本编辑框处于“可以输入”、“不能输入”或者“隐藏”的状态。在图片变换栏上的图标上单击鼠标,可以实现图标的切换。启动进度条,在进度条推进过程中图片变换栏的图标会自动变换。通过点击确定可以退出该控件应用。
程序完成后如图1所示。(图1)
二、设计分析
1.执行VC程序,选择FileNew命令,弹出New对话框,单击工程标签,转到工程选项卡,选择MFC AppWizard(exe),然后在工程名称文本框中输入“对话框控件的高级应用”,单击确定后在弹出的MFC应用程序向导中选择基本对话框 (图2)
2.点击完成进行编程。
3.进行编程是还需将“启动键”、“进度条”、“图片”以及“文本编辑框”等的属性。
3.1、启动键的属性修改如下图。
3.2、进度条的属性修改如下图。
3.3、图片的属性修改如下图。
3.4.文本编辑框的属性修改如下图。
4、属性修改完后按Ctrl+W进入MFC ClassWizard的Message Maps为锁所增添的文件添加映射,然后再Member Variables中设置如下图
5、程序的最终运行 效果如下图所示。
三、源代码
1,定义全局变量
m_str = _T("");
m_str="测试一下CEdit控件的功能";
m_tag=FALSE;
m_Progress=0;
2,为添加的文件添加函数代码
// TODO: Add extra initialization here
GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE);
UpdateData(FALSE);
m_ComboBox.AddString("亚龙湾");
m_ComboBox.AddString("石梅湾");
m_ComboBox.AddString("日月湾");
m_ComboBox.AddString("五指山");
m_ComboBox.SetCurSel(1);
CProgressCtrl * pProgress=(CProgressCtrl *)GetDlgItem(IDC_PROGRESS1);
pProgress->SetRange(0,50);
pProgress->SetPos(0);
return TRUE;
}
void CExDlg::OnPic()
{
// TODO: Add your control notification handler code here
if(m_tag==FALSE)
{
m_icon.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON2));
m_tag=TRUE;
}
else
{
m_icon.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));
m_tag=FALSE;
}
}
void CExDlg::OnRadio1()
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_EDIT1)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT1)->ShowWindow(SW_SHOW);
UpdateData(FALSE);
}
void CExDlg::OnRadio2()
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT1)->ShowWindow(SW_SHOW);
UpdateData(FALSE);
}
void CExDlg::OnRadio3()
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT1)->ShowWindow(SW_HIDE);
UpdateData(FALSE);
}
void CExDlg::OnCloseupCombo1()
{
// TODO: Add your control notification handler code here
m_str.Empty();
m_str="运行关闭下拉菜单函数";
OnRadio1();
UpdateData(FALSE);
}
void CExDlg::OnStart()
{
// TODO: Add your control notification handler code here
m_timer=SetTimer(1,50,NULL);
}
void CExDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your control notification handler code here
CProgressCtrl * pProgress=(CProgressCtrl *)GetDlgItem(IDC_PROGRESS1);
pProgress->SetPos(++m_Progress);
if(m_Progress%5==0)
OnPic();
if(m_Progress>=50)
KillTimer(m_timer);
}
四、设计总结
我做的是“对话框的控件高级应用”。通过这一次的课程设计,我巩固了上课时所学过的有关对话框方面的知识,同时还通过查找学到了课上没有涉及的知识!感受到了课外知识的重要性,可谓是受益匪浅。
第二篇:MFC计算器课程设计报告
MFC计算器课程设计报告 姓名:张胜男 班级:软件一班 学号:091842153
指导老师:储岳中
一.题目:利用MFC框架编写简易计算器
要求使用MFC框架在VC6.0环境下编写一个简易的计算器,支持任意位数的加减乘数,正负转换,并且实现C功能。
1.设计目的
通过本课程设计,初步培养通过面向对象的思想解决问题的能力,熟悉软件开发过程,增强对相关专业知识的感性认识,掌握基本软件开发技能,提高应用所学知识在实践中发现问题、分析问题和解决问题的能力。
2.Windows消息处理机制的理解
首先编写程序需要对Windows程序的消息处理机制(Message Handle)有个比较清晰的了解。Windows的程序都是通过消息来传送数据,有不需要用户参与的系统消息,比如异常处理等。还有用户消息,比如鼠标的单击,双击,键盘的键入等。
3.界面的设计
1)、创建基于对话框的MFC(EXE)应用程序Calculator;
2)、在对话框窗体上顺序创建0到9十个数字按钮,并设置其标识符分别为IDC_0到IDC_9,其它按钮按下表设置属性:
3)、按表2添加各运算按钮的消息处理函数
4、为使0到9十个数字按钮响应相同的消息处理函数,定义宏ON_COMMAND_RANGE
(1) // CalculatorDlg.h
//{{AFX_MSG(CCalculatorDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnAdd();
afx_msg void OnMinus();
afx_msg void OnMutiply();
afx_msg void OnDivid(); afx_msg void OnClear(); afx_msg void OnSign(); afx_msg void OnPoint(); afx_msg void OnEqual(); afx_msg void OnSqrt(); afx_msg void OnRecip();
找到ClassView右击CCalculatorDlg添加类型为Void,函数描述为OnOperandInput(UINT iID);的protected类型的函数。然后再屏蔽掉,在此位置添加此说明
//}}AFX_MSG
(2)//CalculatorDlg.cpp
BEGIN_MESSAGE_MAP(CCalculatorDlg, CDialog)
//{{AFX_MSG_MAP(CCalculatorDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_BN_CLICKED(IDC_MINUS, OnMinus)
ON_BN_CLICKED(IDC_MUTIPLY, OnMutiply)
ON_BN_CLICKED(IDC_DIVID, OnDivid)
ON_BN_CLICKED(IDC_CLEAR, OnClear)
ON_BN_CLICKED(IDC_SIGN, OnSign)
ON_BN_CLICKED(IDC_POINT, OnPoint)
ON_BN_CLICKED(IDC_EQUAL, OnEqual)
ON_BN_CLICKED(IDC_SQRT, OnSqrt)
ON_BN_CLICKED(IDC_RECIP, OnRecip)
ON_COMMAND_RANGE(IDC_0,IDC_9,OnOperandInput)//使用一个消息函数来处理对某个ID范围内所有控件的命令响应
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
5、在头文件CalculatorDlg.h中添加类型、成员变量及成员函数
(1)添加自定义类型:复制后找到CalculatorDlg.h再粘贴。
enum Operator { OpNone,OpAdd,OpSubtract,OpMultiply,OpDivide};
enum CalcError { ErrNone,ErrDivideByZero};
enum Func { FuncSin, FuncTan, FuncCos, FuncSqrt, FuncSqre, FuncLn, FuncLog,
FuncN, FuncRec, FuncExp, FuncNone};
(2)添加成员变量及函数:找到CCalculatorDlg右击依次添加以下成员变量函数均为公有类型。
float m_operand; //存储当前输入的操作数 float m_accum; //存储当前的计算结果 bool m_bCoff; //标识当前输入是否是小数 float m_coff; //小数输入时的系数 Operator m_operator; //enum型变量用以标识当前运算符 CalcError m_errorState; //enum型变量用以标识当前运算状态
Func m_func; //enum型变量用以标识当前运算函数类型 bool m_bOperandAvail; //标识当前输入是否为新输入数字
找到CCalculatorDlg右击依次添加以下成员函数。
void Calculate(); //处理普通计算 void UpdateDisplay(); //处理显示 void Run_Func(); //处理函数运算
(3)为编辑框添加Cstring 变量m_result:找到Resource子菜单的Dialog的子成员IDD_CALCULATOR_DIALOG双击编辑框选中编辑框右击并选中建立类向导,MemberVariables添加Variables,其名称为m_result.
6、部分变量的初始化
CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCalculatorDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCalculatorDlg)
m_result = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_coff=0.1;
m_bCoff=0;
m_errorState = ErrNone;
m_bOperandAvail=FALSE;
m_operator=OpNone;
}
另:在文件CalculatorDlg.cpp中添加
#include "math.h"
7、添加各功能代码
(1)数字输入消息处理函数:找到CCalculatorDlg::OnOperandInput(UINT iID)加入以下函数
void CCalculatorDlg::OnOperandInput(UINT iID) {
ASSERT(iID >= IDC_0 && iID <= IDC_9); if(m_errorState!=ErrNone)
return;
if(!m_bOperandAvail)
m_operand=0;
if(!m_bCoff)
m_operand=m_operand*10+(iID-IDC_0); else
{
m_operand=m_operand+(iID-IDC_0)*m_coff; m_coff*=0.1;
}
m_bOperandAvail=TRUE;
UpdateDisplay();
}
(2)运算符消息处理函数:与上述步骤一样。 void CCalculatorDlg::OnAdd() //加
{
// TODO: Add your control notification handler code here Calculate();
m_operator=OpAdd;
}
void CCalculatorDlg::OnMinus()//减
{
// TODO: Add your control notification handler code here Calculate();
m_operator=OpSubtract;
}
void CCalculatorDlg::OnMutiply()//乘
{
// TODO: Add your control notification handler code here
Calculate();
m_operator=OpMultiply;
}
void CCalculatorDlg::OnDivid()//除
{
// TODO: Add your control notification handler code here Calculate();
m_operator=OpDivide;
}
void CCalculatorDlg::OnSign() //处理正负号
{
// TODO: Add your control notification handler code here m_operand*=-1;
UpdateDisplay();
}
void CCalculatorDlg::OnEqual()//处理等号
{
// TODO: Add your control notification handler code here Calculate();
m_operator=OpNone;
}
void CCalculatorDlg::OnPoint()//处理小数点
{
// TODO: Add your control notification handler code here m_bCoff=1;
UpdateDisplay();
}
void CCalculatorDlg::Calculate()//处理计算
{
if(m_errorState!=ErrNone)
return;
if(m_bOperandAvail)
{
if(m_operator==OpNone)
m_accum=m_operand;
else if(m_operator==OpMultiply)
m_accum*=m_operand;
else if(m_operator==OpDivide)
{
if(m_operand==0)
m_errorState=ErrDivideByZero; else
m_accum/=m_operand;
}
else if(m_operator==OpAdd)
m_accum+=m_operand;
else if(m_operator==OpSubtract)
m_accum-=m_operand;
}
m_bOperandAvail=FALSE;
m_bCoff=0;
m_coff=0.1;
UpdateDisplay();
}
void CCalculatorDlg::Run_Func()//处理求根和求倒 {
if (m_errorState != ErrNone)
return;
if (m_bOperandAvail)
{
if(m_func==FuncSqrt)
m_operand=sqrt(m_operand);
if(m_func==FuncRec)
m_operand=1/m_operand;
}
UpdateDisplay();
}
void CCalculatorDlg::UpdateDisplay()//处理显示 {
if(GetSafeHwnd()==NULL)
return;
if(m_errorState!=ErrNone)
m_result="除数不能为零";
else
{
float lval=(m_bOperandAvail)?m_operand:m_accum; m_result.Format(_T("%f"),lval);
int i=m_result.GetLength();
while(m_result.GetAt(i-1)=='0')
{
m_result.Delete(i-1,1);
i-=1;
} } } UpdateData(FALSE);
总结:
本次MFC计算器的制作,学习到了MFC基本的编程方法,增加了小组开发的团结协作能力。对OOP编程的理解进一步加深。但是程序仍然没存在一定的问题,比如除数不能为0的Exception handle,符号键多次点击结果混乱。由于时间仓促,如果有更多的时间,必定这些问题会迎刃而解。通过这次课程设计,以后Windows 应用程序势必会轻车熟路。