等待动画是友好的用户交互不可获取的功能,本文实现了基于MFC的等待动画。首先进行分析:
- 等待动画需要独立于业务
- 等待动画需要阻塞当前窗口
- 动画背景透明(非必须)
为了达到以上效果我们选用模式对话框+线程的方式来实现。
思路是:模式对话框显示动画效果,业务线程绑定到模态对话框上,线程结束时模态对话框随之结束。首先展示效果:
为了进行线程的绑定,我们使用《一种实用的c++线程管理方式》章节提供的线程管理的方法,极大的方便了线程的绑定和业务处理。
下面是模态对话框的核心代码:
COLORREF maskColor = RGB(255,255,255); //掩码颜色
SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)| 0x80000);
SetLayeredWindowAttributes(maskColor,0,LWA_COLORKEY);//设置背景透明
m_PictureEx.MoveWindow(0,0,108,114);
m_PictureEx.Load(_T("waitimage.gif"));
m_PictureEx.Draw();//使用CPictureEx加载动画
m_ThreadManager.Start();//开启线程
定义进度条测试线程:
DWORD CJCTestWaitDlgDlg::ProgressThreadProc(JCThreadManager* pThreadManager)
{
CProgressCtrl* pCtrl = (CProgressCtrl*)pThreadManager->GetParam();
for (int i=0;i<100;i++)
{
pCtrl->SetPos(i);
Sleep(100);
}
return 0;
}
使用代码非常简单:
CJCWaitDlg wd(this);
wd.Start(ProgressThreadProc,&m_ProgressCtrl);
wd.DoModal();
JCThreadManager实现了线程的各种操作,CJCWaitDlg实现等待动画和线程的绑定。下面提供源代码:
CSDN源码:https://download.csdn.net/download/u011736517/12315130
GITHUB源码:https://github.com/ljc2266/JCWaitDlg.git