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);