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);
}
全部代码完成,可以进行测试了,测试截图,可能看得不是很清楚:
有问题再追问吧,呵呵
追问庄主。。。。是我啊。。之前加你的小子。。南京的那个。