问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

mfc 进度条的控制问题10

发布网友 发布时间:2023-11-28 08:44

我来回答

1个回答

热心网友 时间:2024-12-02 12:00

简单说一下实现过程:

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

这里,我们设计一下三个进度条的运行动作:如果是点击按钮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);
}

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

有问题再追问吧,呵呵

追问庄主。。。。是我啊。。之前加你的小子。。南京的那个。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
减罪的读音减罪的读音是什么 减的拼音? 减的反义词 5种开红色花朵的植物有哪些 怎么查衣服是什么牌子 ...一件连衣裙就要1080元 ,你怎么看?_百度知 ... ...的衣服比较难?这些时尚的淘宝店铺你知道吗?_百度知 ... 比尔布莱森被人们称为什么 三星空气净化器怎么样 ? 三星ax7000空气净化器 请各位师傅帮忙看一下这个是什么东西? ...58同城上搞了一个营业执照认证,对我有什么威胁吗? 我的被盗了,我没有绑定,密码也被改了,怎么办? 南康115路公交多久一趟? 电饭锅两个灯同时亮,一直都不灭,可以煮饭,是什么原因啊?不去修会有危 ... 请问电子信息工程专业是什么? 我要从宜宾到重庆南岸区南山云之谷艺术大酒店怎么坐车? 对方把我微信拉黑怎样查看对方? 奔驰glc260启停灯亮着是什么意思 修改没到一年怎么改? 帮忙看看这是什么东东 下一站·吉隆坡的介绍 不满一年如何更改? 江南的冬景【节选】阅读答案作者在第3自然段中写出江南冬景的哪些景色... 微信没满一年怎么改? 有没有穿越到凡人修仙传或仙逆的小说?2 九层洋房,层高两米九,楼间距35米。住后面一栋四楼会挡光吗?39 一年内第二次修改技巧 被盗,微信支付密码泄露,没有绑定银行卡只绑定了身份证,会不会... 被盗,微信支付密码泄露,没有绑定银行卡只绑定了身份证,会不会... 某厂5月份用水280t,6月份比5月份节约用水百分之15,5、6月份共用水多少... Java Javascipt JavaWeb有什么区别?4 车强险贴丢了怎么办(车辆交强险贴丢了怎么办) 115路公交车几分钟一班 我的被别人用了怎么找回来? 我的被别人注销了,怎么找回来? 下课的成语下课的成语是什么 ...女婿按揭买房办理房产证需女方户口簿,父亲扶贫有影响? ...抽到爱疯11。和密码和支付密码要给他? 怎么申请新的 被对方拉黑后怎样查到对方的? ...李枫、落落。。。还有其他郭敬明旗下的作家作品 长隆集团有几个股东 真空胎没气了就一定要换新的吗2 乱收停车费归哪个部门管?怎么12358电话打的是空号 修改没到一年怎么改? 微信手机号在24小时内,已绑定两个,已达到限制,不能在绑定其他微信... 化妆的时候怎样盖住黑眼圈和眼袋162 我抽奖抽到了iPhone,他说要我的密码和支付密码,他要登上去绑定物... 装配体的基本建立过程是什么?