mfc进度条?怎样在mfc列表控件中加入进度条
亲爱的读者们,你是否对mfc进度条和怎样在mfc列表控件中加入进度条的相关问题感到困惑?别担心,今天我将为你解答这些问题,让你对此有更清晰的认识。
如何用MFC做一个进度条
第一种,用printf模拟输出百分比,在控制台输出,实现进度监控。
#include<stdio.h>
#define N 20
void mBar(float fBar){
int i,j,k,m;
for( i=0;i<N+6;i++) printf("\b");
k=N*fBar; m=fBar*100; printf("[");
for( i=0;i<k;i++) printf("=");
for( j=0;j<N-k;j++) printf("");
printf("]%3d%%",m);
}
void delay(int n){ int i,j,k; for( i=0;i<n;i++) for( j=0;j<0x07fff;j++) k++;}
void main()
{
float x;
int i;
for( i=0,x=0;i<100;i++,x+=0.01){ mBar(x); delay(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(pos>500)
pos= 0;
m_Progress->SetPos(pos);
}
或者采用在某种循环体内添加不断更新进展条界面的方法
怎样在mfc列表控件中加入进度条
1.从简单易用角度讲,用Dialog比较好。单文档的话,楼主可能找不到吧控件拖到哪里去。而且单文档有框架类和视图类,要在视图类里改,不要在框架类里面改。
2.Dialogue的话,看你的需要了。在controls框里面拖一个列表控件。然后用classwizard添加一个control型成员m_list。对控件的操作,可以通过操作这个成员来实现。
3.楼主会发现,有3个类,一个是aboutdlg,这个是显示版本信息的对话框,不用管。
一个是C**App类,是应用程序类,程序就是从这里执行的,对于现在的问题,可以不用管。
还有一个是C**Dlg类,这个就是我们的dialogue窗口类,就修改这里。
4.这个类里面好多函数,如果楼主希望在对话框弹出来时就有列表控件出现,并分好格子,那么,要修改它的成员函数OnInitDialog。这个函数看名字就知道是初始化对话框的。
可以在这个里面操作m_list成员,来调整列表控件。
5.操作的具体过程呢,我这里不写太详细,说的多了反而影响学习,楼主可以自己看MSDN里面CListCtrl的成员函数,不难,找几个看的懂的试下就知道了,我也写几个:
GetItemText()得到一个条目的文本
SetItemTex:设置一个条目的文本
InsertItem:插入一个新条目
DeleteItem:删除一个新条目
等等,等等,说不尽啊,请自己看一下,不难的。
6.说到list控件,脑子里一下子出现好多东西,如在列表里面加个check功能,改个颜色,放个按钮,进度条等等,哎呀,太多了,不知道从何说起。
7.很多VC,mfc方面的书,都会在一开始描述控件的使用,楼主可以随便找一本,或者网上下一本,一步一步跟着做一次,这个东西就不会陌生了。楼主这个阶段,可能看MSDN比较困难,因为,毕竟还不是很了解VC里面MFC的各种结构,建议找本书看,入门的话,推荐孙鑫的《VC++深入详解》带视频的。
8.有问题可以发消息给我。我一般中午,晚上会在线2个小时解答问题
mfc 进度条的控制问题
简单说一下实现过程:
我们用定时器来控制进度条的进度,这样有两个好处,第一是界面不会卡死,第二是方便控制进度条的启动和停止。因为如果在一个简单的循环里去控制进度条的进度,很可能会卡死。
这里,我们设计一下三个进度条的运行动作:如果是点击按钮A,则运行到进度条尾就停止,而如果是按钮B或者按钮C,则如果进度条到了尾则继续从头开始运行。
因此,我们定义如下的成员:
//给三个进度条关联控件变量
CProgressCtrlm_prcThree;
CProgressCtrlm_prcTwo;
CProgressCtrlm_prcOne;
intm_Counter;//计数器,用来控制进度条的位置
boolm_bIsButtonA;//按下的是否是A按钮
boolm_bButtonBFlag;//B按钮是否被按下
//添加一个成员函数,其实现如下,假设对话框类叫CMFCTestDlg:
//函数的作用是改变进度条的位置,如果是A按钮按下,则到进度到尾就停止
voidCMFCTestDlg::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;
//定义一个宏来标明定时器事件
#defineTIMER_11
//添加对话框类的WM_TIMER事件处理函数,处理定时器事件
voidCMFCTestDlg::OnTimer(UINTnIDEvent)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
switch(nIDEvent)
{
caseTIMER_1:
ChangeProcVal();
break;
default:
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,按钮事件不需要编写
BOOLCMFCTestDlg::PreTranslateMessage(MSG*pMsg)
{
//TODO:Addyourspecializedcodehereand/orcallthebaseclass
if(pMsg->message==WM_LBUTTONDOWN&&pMsg->hwnd==((CButton*)GetDlgItem(IDC_BUTTON3))->GetSafeHwnd())
{
m_bIsButtonA=false;
SetTimer(TIMER_1,10,NULL);
}
elseif(pMsg->message==WM_LBUTTONUP&&pMsg->hwnd==((CButton*)GetDlgItem(IDC_BUTTON3))->GetSafeHwnd())
{
KillTimer(TIMER_1);
}
returnCDialog::PreTranslateMessage(pMsg);
}
全部代码完成,可以进行测试了,测试截图,可能看得不是很清楚:
有问题再追问吧,呵呵
mfc中什么控件上可以画进度条
1.从简单易用角度讲,用Dialog比较好。单文档的话,楼主可能找不到吧控件拖到哪里去。而且单文档有框架类和视图类,要在视图类里改,不要在框架类里面改。
2.Dialogue的话,看你的需要了。在controls框里面拖一个列表控件。然后用classwizard添加一个control型成员m_list。对控件的操作,可以通过操作这个成员来实现。
3.楼主会发现,有3个类,一个是aboutdlg,这个是显示版本信息的对话框,不用管。
一个是C**App类,是应用程序类,程序就是从这里执行的,对于现在的问题,可以不用管。
还有一个是C**Dlg类,这个就是我们的dialogue窗口类,就修改这里。
4.这个类里面好多函数,如果楼主希望在对话框弹出来时就有列表控件出现,并分好格子,那么,要修改它的成员函数OnInitDialog。这个函数看名字就知道是初始化对话框的。
可以在这个里面操作m_list成员,来调整列表控件。
5.操作的具体过程呢,我这里不写太详细,说的多了反而影响学习,楼主可以自己看MSDN里面CListCtrl的成员函数,不难,找几个看的懂的试下就知道了,我也写几个:
GetItemText()得到一个条目的文本
SetItemTex:设置一个条目的文本
InsertItem:插入一个新条目
DeleteItem:删除一个新条目
等等,等等,说不尽啊,请自己看一下,不难的。
6.说到list控件,脑子里一下子出现好多东西,如在列表里面加个check功能,改个颜色,放个按钮,进度条等等,哎呀,太多了,不知道从何说起。
7.很多VC,mfc方面的书,都会在一开始描述控件的使用,楼主可以随便找一本,或者网上下一本,一步一步跟着做一次,这个东西就不会陌生了。楼主这个阶段,可能看MSDN比较困难,因为,毕竟还不是很了解VC里面MFC的各种结构,建议找本书看,入门的话,推荐孙鑫的《VC++深入详解》带视频的。
关于mfc进度条的内容到此结束,希望对大家有所帮助。