mfc 进度条的控制问题

我在对话框中写了3个进度条,3个按钮。点击按钮A3个进度条同时开始进度,进度条到尾就停止;点击按钮B,点击第一下3个进度条开始动,再点一下3个进度条就停止,再点就继续动;... 我在对话框中写了3个进度条,3个按钮。点击按钮A 3个进度条同时开始进度,进度条到尾就停止;点击按钮B,点击第一下3个进度条开始动,再点一下3个进度条就停止,再点就继续动;点击C按钮:按住C按钮的时候3个进度条开始动,松开C按钮,进度条就停止。请问各位大神,按钮的这些功能该怎么写。。 展开
 我来答
拥云庄主
推荐于2016-07-12 · TA获得超过2501个赞
知道小有建树答主
回答量:672
采纳率:100%
帮助的人:412万
展开全部

简单说一下实现过程:

我们用定时器来控制进度条的进度,这样有两个好处,第一是界面不会卡死,第二是方便控制进度条的启动和停止。因为如果在一个简单的循环里去控制进度条的进度,很可能会卡死。

这里,我们设计一下三个进度条的运行动作:如果是点击按钮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 default
 switch(nIDEvent)
 {
  case TIMER_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,按钮事件不需要编写 
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);
}

 全部代码完成,可以进行测试了,测试截图,可能看得不是很清楚:

有问题再追问吧,呵呵

追问
庄主。。。。是我啊。。之前加你的小子。。南京的那个。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式