soft_progress
- 格式:doc
- 大小:159.00 KB
- 文档页数:10
实验报告
课程名称 软件案例分析
实验名称 进度指示器制作
班 级 xxxxxxxxxxxxxxx
学 号 xxxxxxxxxxxxxxx
姓 名 xxxxxxxxxxxxxxx
成 绩
指导教师 刘天时
1.实验目的
(1)理解自定义进度指示器的设计原理。
(2)理解进度百分比反色显示实现原理。
(3)了解CWnd::OnCtlColor函数功能和使用方法。
(4)熟练掌握定时器的使用方法。
(5)掌握动态控件的创建和使用方法。
(6)掌握嵌入子对话框的实现方法。
2.实验要求
(1)进度条未完成进度为白底红(或其他颜色)字。
(2)进度条已完成进度为红(或其他颜色)底白字。
(3)进度具有加速、减速、停止功能,如图A.6所示。
图A.6 进度指示器
3.实验步骤
(1)启动VC++ 6.0,创建基于对话框的MFC AppWizard(exe)类型的工程,命名为ProgSelf,生成的主对话框类为CProgSelfDlg。
(2)修改对话框ID为“IDD_PROGSELF_DIALOG”,标题为“进度指示器”。在主对话框中添加5个按钮控件(其中“退出”按钮的ID为IDOK),两个静态文本控件,一个编辑框控件IDC_RATE和一个图片控件IDC_PIC,对话框界面设计如图A.7所示。
图 A.7 主对话框界面 (3)打开MFC ClassWizard对话框,为“开始”、“加速”、“减速”、“停止”这四个按钮控件添加相应的消息映射成员函数。
(4)向工程中添加子对话框资源,修改ID为“IDD_PROGESS”,样式设置为“下层”,边框设置为“无”,其他属性设置如图A.8所示。双击孩子对话框,生成相应的类为CProgBar。
图 A.8 子对话框界面
(5)在Resource.h文件中为4个动态编辑框控件定义ID,代码如下:
#define IDC_BOT 106
#define IDC_BOTTEXT 101
#define IDC_UP 107
#define IDC_UPTEXT 103
(6)在ProgBar.h文件中为4个动态编辑框控件定义CEdit对象指针和CRect对象,以及用于进度条更新和进度值显示控件的变量。代码如下:
public:
int speed; //进度条更新速度
private:
bool firstText; //上层文本开关标志
bool firstEdit; //上层背景开关标志
CString m_sUp; //上层进度值
CString m_sBot; //底层进度值
CRect rectUpText; //上层文本矩形
CEdit* pEditUpText; //上层文本编辑框
CRect rectUp;
CEdit* pEditUp; //上层背景编辑框
CRect rectBotText;
CEdit* pEditBotText; //下层文本编辑框
CRect rectBot;
CEdit* pEditBot; //下层背景编辑框
float step; //上层文本编辑框宽度
float percent; //进度百分比
bool timerOn; //定时器开关标志
(7)在CProgBar类构造函数中进行成员变量的初始化。代码如下:
speed=1;
step=0;
percent=0;
m_sBot=""; m_sUp="";
pEditBot=NULL;
pEditBotText=NULL;;
pEditUp=NULL;
pEditUpText=NULL;
timerOn=false;
firstEdit=true;
firstText=true;
(8)为类CProgBar添加成员函数CreateBotEdit实现底层编辑框的初始化。代码如下,其中TEXTWIDTH为文本框宽度,设置为30。
void CProgBar::CreateBotEdit(int picwid)
{
rectBot.SetRect(25,65,picwid-15,81);
//下层编辑框
pEditBot=new CEdit();
pEditBot->Create(ES_CENTER,rectBot,this,IDC_BOT);
pEditBot->ShowWindow(TRUE);
//显示下层编辑框中的文本
rectBotText.SetRect(rectBot.TopLeft().x+rectBot.Width()/2-TEXTWIDTH,rectBot.TopLeft().y,rectBot.TopLeft().x+rectBot.Width()/2+TEXTWIDTH,rectBot.BottomRight().y);
pEditBotText=new CEdit();
pEditBotText->Create(ES_LEFT,rectBotText,this,IDC_BOTTEXT);
pEditBotText->ShowWindow(TRUE);
m_sBot.Format("%.1f%%",percent);
pEditBotText->SetWindowText(m_sBot);
}
(9)为类CProgBar添加成员函数CreateUpEdit实现上层红底无字编辑框的动态递增显示,以及中间红底白字编辑框的动态显示。代码如下:
void CProgBar::CreateUpEdit()
{
step=rectBot.Width()*percent;
rectUp.SetRect(rectBot.TopLeft().x,rectBot.TopLeft().y,rectBot.TopLeft().x+(int)step,rectBot.BottomRight().y);
if(firstEdit)
{
pEditUp=new CEdit();
pEditUp->Create(ES_LEFT,rectUp,this,IDC_UP);
pEditUp->ShowWindow(TRUE);
firstEdit=false;
}
else
{
pEditUp->MoveWindow(rectUp); }
//显示上层文本
if(rectUp.BottomRight().x>=rectBotText.TopLeft().x)
{
rectUpText.SetRect(rectBotText.TopLeft().x,rectBotText.TopLeft().y,rectUp.BottomRight().x,rectUp.BottomRight().y);
if(firstText)
{
pEditUpText=new CEdit();
pEditUpText->Create(ES_LEFT,rectUpText,this,IDC_UPTEXT);
pEditUpText->ShowWindow(TRUE);
firstText=false;
}
else
{
pEditUpText->MoveWindow(rectUpText);
}
if(percent>=1)
m_sUp="100%";
else
m_sUp.Format("%.1f%%",percent*100);
pEditUpText->SetWindowText(m_sUp);
}
}
(10)使用Class Wizard工具为类CProgBar添加消息WM_DESTROY的响应函数OnDestroy用来实现动态资源的释放。代码如下:
void CProgBar::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
if(timerOn)
KillTimer(1);
delete pEditBot;
delete pEditBotText;
delete pEditUp;
delete pEditUpText;
}
(11)在CProgBar::OnTimer函数中调用进行底层红色百分比的刷新显示,并调用CreateUpEdit函数。代码如下:
void CProgBar::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(percent>=1)
{ AfxGetMainWnd()->GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
//禁用按钮
AfxGetMainWnd()->GetDlgItem(IDC_SPEEDUP)->EnableWindow(FALSE);
AfxGetMainWnd()->GetDlgItem(IDC_SLOWDOWN)->EnableWindow(FALSE);
KillTimer(1);
timerOn=false;
}
else
{
percent+=0.001;
if(percent>=1)
m_sBot="100%";
else
m_sBot.Format("%.1f%%",percent*100);
pEditBotText->SetWindowText(m_sBot);
CreateUpEdit();
}
CDialog::OnTimer(nIDEvent);
}
(12)(在CProgBar::OnCtlContrl函数中控制控件颜色的动态变化。代码如下:
HBRUSH CProgBar::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);