前言
在做前端ui进度条时,总会遇到后端数据解析过程中,前端ui不能同步更新的问题。为解决以上问题。想到最好的办法是通过消息进行通知,ui类监听此消息,进行ui刷新。
源码解析
源码
开放API接口,可用其他模块进行交互
#pragma once
//进度条类接口
class ICStatusProgress
{
public:
ICStatusProgress() { };
~ICStatusProgress() { };
public:
//初始化进度条类,最小值和最大值范围
virtual bool Init(int nMin, int nMax) = 0;
//设置进度条类进度
virtual bool SetPosi(int nPos) = 0;
//销毁进度条类
virtual bool Destroy() = 0;
};
进度条具体实现:
#pragma once
#include "PlantFrameInterface.h"
#include "IProgressBar.h"
class CStatusProgress:public ICStatusProgress
{
public:
CStatusProgress(){ m_pInterface = nullptr; };
CStatusProgress(CPlantFrameInterface* pInterFace){ m_pInterface = nullptr; setInterface(pInterFace); };
~CStatusProgress(){ Destroy();}
void setInterface(CPlantFrameInterface* pInterFace){ m_pInterface = pInterFace; };
virtual bool Init(int nMin, int nMax) override
{
if (m_pInterface)
{
char str[128];
sprintf_s(str, "InitProgress:%d-%d", nMin,nMax);
m_pInterface->notice_listener(LT_FILE_UPDATESTATUSBARPROGRESS, str, this);
return true;
}
return false;
}
virtual bool SetPosi(int nPos)override
{
if (m_pInterface)
{
char str[128];
sprintf_s(str, "SetProgress:%d", nPos);
m_pInterface->notice_listener(LT_FILE_UPDATESTATUSBARPROGRESS, str, this);
return true;
}
return false;
}
virtual bool Destroy()override
{
if (m_pInterface)
{
char str[128] = "DestroyProgress:";
m_pInterface->notice_listener(LT_FILE_UPDATESTATUSBARPROGRESS, str, this);
return true;
}
return false;
}
protected:
CPlantFrameInterface* m_pInterface;
};
监听消息 LT_FILE_UPDATESTATUSBARPROGRESS ,并设置ui进度条进度。
//设置监听消息 LT_FILE_UPDATESTATUSBARPROGRESS
m_pFrameInterface->add_listener(this, LT_FILE_UPDATESTATUSBARPROGRESS);
//监听消息 LT_FILE_UPDATESTATUSBARPROGRESS ,并设置ui进度条进度。
void CModelCompareOperation::OnNoticeCome(Listener_Type type, void* pData, void* pSender)
{
if (type == LT_FILE_UPDATESTATUSBARPROGRESS)
{
CString strData;
if (nullptr != pData)
strData = StringUtf8ToWide((char*)pData).c_str();
if (m_pModelCompareDlg && !strData.IsEmpty())
m_pModelCompareDlg->updateWndStatusProgress(strData);
return;
}
}
//关于ui类中进度条的设置
bool CMFCModelCompare::updateWndStatusProgress(CString sMsg)
{
LOG_DEBUGA("updateWndStatusProgress begin");
int nFind = sMsg.Find(':');
if (nFind <= 0)
return false;
CString sTitle = sMsg.Left(nFind);
CString sValue = sMsg.Right(sMsg.GetLength() - nFind - 1);
if (sTitle.CompareNoCase(_T("InitProgress")) == 0)
{
nFind = sValue.Find('-');
if (nFind > 0)
{
CString sMin = sValue.Left(nFind);
CString sMax = sValue.Right(sValue.GetLength() - nFind - 1);
//m_pProgress = new CMFCRibbonProgressBar(ID_STATUSBAR_PROGRESS, 150, 30);
//pProgressBar->SetInfiniteMode(m_bInfiniteProgressMode);
m_progress.SetRange(_tstoi(sMin), _tstoi(sMax));
//m_wndStatusBar.AddDynamicElement(m_pProgress);//动态添加内容
//m_wndStatusBar.RecalcLayout();
//m_wndStatusBar.RedrawWindow();
//RecalcLayout();
return true;
}
}
else if (sTitle.CompareNoCase(_T("DestroyProgress")) == 0)
{
//m_progress = nullptr;
return true;
//if (m_wndStatusBar.RemoveElement(ID_STATUSBAR_PROGRESS))
//{
// //m_wndStatusBar.RecalcLayout();
// m_wndStatusBar.RedrawWindow();
// //m_progress = nullptr;
// RecalcLayout();
// return true;
//}
}
else if (sTitle.CompareNoCase(_T("SetProgress")) == 0)
{
m_progress.SetPos(_tstoi(sValue));
return true;
}
return false;
}
测试逻辑
//测试实例:
CStatusProgress statusPro;
statusPro.setInterface(GetPlantFrameInterface());
statusPro.Init(0, 100);
//随着模型的对比进度,可以设置进度的百分比
statusPro.SetPosi(100);
//进度状态销毁
statusPro.Destroy();