如何用MFC做一个进度条
***种,用printf模拟输出百分比,在控制台输出,实现进度监控。
#includestdio.h
#define N 20
void mBar(float fBar){
int i,j,k,m;
for ( i=0;iN+6;i++ ) printf("b");
k=N*fBar; m=fBar*100; printf("[");
for ( i=0;ik;i++ ) printf("=");
for ( j=0;jN-k;j++ ) printf(" ");
printf("]%3d%%",m);
}
void del***(int n) { int i,j,k; for ( i=0;in;i++ ) for ( j=0;j0x07fff;j++ ) k++; }
void main()
{
float x;
int i;
for ( i=0,x=0;i100;i++,x+=0.01 ) { mBar(x); del***(1024); }
mBar(1);
}
第二种,使用窗口组件。这个要看程序工作环境,纯粹的c语言是无法实现的。可以使VC++。Visual C++中的MFC类提供了标准的进度指示器控件(CProgressCtrl)。
m_progress-GetPos(); //获取进度条的当前位置
m_progress-GetRange(int min,int max); //获取进度条控件的范围的下限和上限
m_progress-OffsetPos(int nPos); //用指定的增量推进进度条控件的当前位置,重绘进度条反映新位置
m_progress-SetBkColor(COLORREF clrNew); //设定进度条的背景颜色
m_progress-SerPos(int nPos); //设定进度条控件的当前位置,重绘进度条反映新位置
m_progress-SetRange(int min,int max); //设定进度条控件的范围的下限和上限
m_progress-SetRange32(int min,int max); //设定进度条控件的范围的下限和上限
m_progress-SetStep(int nStep); //指定进度条控件的步进增量
m_progress-StepIt(); //通过步进增量,推进进度条控件的当前位置,重绘进度条反映新位置
应用:
CProgressCtrl *m_progress; //头文件中声明
在OnInitDialog初始化
{
m_progress = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
m_progress-SetRange(0,1000);
m_progress-SetPos(0);
UINT m_timer =(UINT) SetTimer(1,200,NULL);
}
采用在定时器的消息处理函数WM_TIMER内添加不断更新进度条界面的方法
onTimer (nIDEvent)
{
pos = pos + 50;
if(pos500)
pos = 0;
m_Progress-SetPos(pos);
}
或者采用在某种循环体内添加不断更新进展条界面的方法
vc6.0里MFC进度条如何使用
演练CProgress
7.1
进度条的主要功能
进度条控制(Progress
Control)主要用来进行数据读写、文件拷贝和磁盘格式等操作时的工作进度提示情况,如安装程序等,伴随工作进度的进展,进度条的矩形区域从左到右利用当前活动窗口标题条的颜色来不断填充。
进度条控制在MFC类库中的封装类为CProgressCtrl,通常仅作为输出类控制,所以其操作主要是设置进度条的范围和当前位置,并不断地更新当前位置。进度条的范围用来表示整个操作过程的时间长度,当前位置表示完成情况的当前时刻。SetRange()函数用来设置范围,初始范围为0-100,
SetPos()函数用来设置当前位置,初始值为0,SetStep()函数用来设置步长,初始步长为10,StepIt()函数用来按照当前步长更新位置,OffsetPos()函数用来直接将当前位置移动一段距离。如果范围或位置发生变化,那么进度条将自动重绘进度区域来及时反映当前工作的进展情况。
进度条的对象结构
进度条控制的建立方法
CProgressCtrl
ProgressCtrl
建立进度条控制对象结构
Create
建立进度条控制对象并绑定对象
进度条控制类CprogressCtrl::Create的调用格式如下:
BOOL
Create(
DWORD
dwStyle,
const
RECT
rect,
CWnd*
pParentWnd,
UINT
nID
);
其中参数dwStyle用来确定进度条控制的控制风格;参数rect用来确定进度条控制的大小和位置;参数pParentWnd用来确定进度条父窗口指针;参数nID用来确定进度条控制的控制符ID值。
7.2
进度条控制的类属性
进度条控制的类属性包括设置进度条***最小控制范围SetRange、设置进度条当前位置
SetPos、设置进度条当前位置偏移值OffsetPos和设置进度条控制增量值SetStep。
7.3
进度条控制的操作方法
进度条控制的操作方法主要是使进度条控制并重绘进度条的StepIt函数。
进度条控制的应用技巧示例
1、利用应用程序向导AppWizard生成基于对象框的应用程序CProgDlg;
2、在对话框中设置进度条和静态文本控制,其ID分别为IDC_PROG和IDCPERCENT;
在对话框初始代码中增加控制的范围和位置:
在ProgDlg.h中设置两个数据成员,用来表示进度条的***值和步长:
//ProgDlg.h
class
CProgDlg:public
Cdialog
{
......//其它代码
public:
int
m_nMax,m_nStep;
......
//其它代码
}
(2)在ProgDlg.cpp中设置初始状态
BOOL
CProgDlg::onInitDialog()
{
Cdialog::onInitDialog();
......//其它代码
//TODO:Add
extra
initialization
here
CProgressCtrl
*pProgCtrl=(CProgressCtrl*)GetDlgItem(IDC_PROG);
pProgCtrl-SetRange(0,200);//设置进度条范围
......//其它代码
m_nMax=200;
m_nStep=10;
SetTimer(1,1000,NULL);//设置进度条更新时钟
return
TRUE;
}
(3)完善WM_TIMER消息处理,使进度条按照当前步长进行更新,同时完成进度条的百分比显示:
void
CProgDlg::onTimer(UINT
nIDEvent)
{
//TODO:Add
your
message
handler
CProgressCtrl
*pProgCtrl=(CProgressCtrl*)GetDlgItem(IDC_PROG);
int
nPrePos=pProgCtrl-StepIt();//取得更新前位置
char
test[10];
int
nPercent=(int)(((nPrePos+m_nStep)/m_nMax*100+0.5);
wsprintf(test,%d%%,nPercent);
GetDlgItem(IDC_PERCENT)-SetWindowText(text);
Cdialog::onTimer(nIDEvent);
}
mfc 进度条的控制问题
简单说一下实现过程:
我们用定时器来控制进度条的进度,这样有两个好处,***是界面不会卡死,第二是方便控制进度条的启动和停止。因为如果在一个简单的循环里去控制进度条的进度,很可能会卡死。
这里,我们设计一下三个进度条的运行动作:如果是点击按钮A,则运行到进度条尾就停止,而如果是按钮B或者按钮C,则如果进度条到了尾则继续从头开始运行。
因此,我们定义如下的成员:
//给三个进度条关联控件变量
CProgressCtrl m_prcThree;
CProgressCtrl m_prcTwo;
CProgressCtrl m_prcOne;
int m_Counter;//计数器,用来控制进度条的位置
bool m_bIsButtonA;//按下的是否是A按钮
bool m_bButtonBFlag;//B按钮是否被按下
//添加一个成员函数,其实现如下,假设对话框类叫CMFCTestDlg:
//函数的作用是改变进度条的位置,如果是A按钮按下,则到进度到尾就停止
void CMFCTestDlg::ChangeProcVal()
{
++m_Counter;
if (m_Counter 50)
{
m_Counter = 0;
if (m_bIsButtonA)
{
KillTimer(TIMER_1);
return ;
}
}
m_prcOne.SetPos(m_Counter);
m_prcTwo.SetPos(m_Counter);
m_prcThree.SetPos(m_Counter);
}
//添加对话框类的WM_INITDIALOG事件的处理函数,进行一些初始化
//设置进度条的范围
m_prcOne.SetRange(0, 50);
m_prcTwo.SetRange(0, 50);
m_prcThree.SetRange(0, 50);
//初始化成员变量
m_Counter = 0;
m_bButtonBFlag = false;
//定义一个宏来标明定时器事件
#define TIMER_1 1
//添加对话框类的WM_TIMER事件处理函数,处理定时器事件
void CMFCTestDlg::onTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call def***lt
switch(nIDEvent)
{
case TIMER_1:
ChangeProcVal();
break;
def***lt:
break;
}
CDialog::onTimer(nIDEvent);
}
//OK准备工作完成,下面编写按钮的功能
//按钮A代码如下:
m_bIsButtonA = true;
SetTimer(TIMER_1, 10, NULL);
//按钮B代码如下:
m_bIsButtonA = false;
m_bButtonBFlag = !m_bButtonBFlag;
if (m_bButtonBFlag)
{
SetTimer(TIMER_1, 10, NULL);
}
else
{
KillTimer(TIMER_1);
}
//按钮C因为要捕获鼠标按下和松开事件,因此,重写对话框类的PreTranslateMessage虚函数,其中,IDC_BUTTON3为按钮C的控件ID,按钮事件不需要编写
BOOL CMFCTestDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg-message == WM_LBUTTONDOWN pMsg-hwnd == ((CButton*)GetDlgItem(IDC_BUTTON3))-GetSafeHwnd())
{
m_bIsButtonA = false;
SetTimer(TIMER_1, 10, NULL);
}
else if(pMsg-message == WM_LBUTTONUP pMsg-hwnd == ((CButton*)GetDlgItem(IDC_BUTTON3))-GetSafeHwnd())
{
KillTimer(TIMER_1);
}
return CDialog::PreTranslateMessage(pMsg);
}
全部代码完成,可以进行测试了,测试截图,可能看得不是很清楚:
有问题再追问吧,呵呵
MFC中进度条怎么实现
以Dialog为例简单说明一下:
在Dialog上添加Progress Control控件, 关联控件变量为m_progress_demo;
在Dialog所属的类的onInitDialog()函数里面(新类的话需要手工添加onInitDialog()函数), 增加初始化处理: m_progress_demo.SetRange(0, 100);m_progress_demo.SetPos(0); 表示显示的进度为0~100之间,而且进度从0开始。
在需要进度条更新的场合下,比如进度20,增加:m_progress_demo.SetPos(20);
关于mfc进度条和mfc进度条控件使用vs2012的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。