这个类可以用于在函数中输出进度,因为使用了虚函数,所以可以用于各种情况,比如显示到cmd,或者输出到进度条,或者输出到文本,在子类中具体实现即可。
#pragma once
/************************************************************************/
//author:autumoon
//2018.04.18
//个人定义的用于控制进度的基类,基类全部是虚函数
/************************************************************************/
class CProgressInterface
{
public:
virtual int End() = 0;
virtual int SetProgressValue(
/* [in] */ size_t ullCompleted,
/* [in] */ size_t ullTotal){return 0;};
virtual int Start() = 0;
virtual int OutputInfo(
/* [in] */ const char* lpszFormat, ...){return 0;};
};
#ifndef __AFX_H__
/************************************************************************/
/* 以下是范例可以直接使用,也可以关闭开关掉重新编写 */
/* 范例1:命令行进度显示 */
/************************************************************************/
#include <stdarg.h>
class CcmdProgress: public CProgressInterface
{
public:
int End()
{
printf("All Over!\n");
return 0;
}
int SetProgressValue(
/* [in] */ size_t ullCompleted,
/* [in] */ size_t ullTotal)
{
printf("Current progress is %d / %d\n", ullCompleted, ullTotal);
return 0;
}
int Start()
{
printf("Start...\n");
return 0;
}
int OutputInfo(
/* [in] */ const char* lpszFormat, ...)
{
char szInfo[1024];
va_list argList;
va_start(argList, lpszFormat);
vsnprintf(szInfo, 1024, lpszFormat, argList);
va_end(argList);
printf("%s\n", szInfo);
return 0;
}
};
#else //__AFX_H__
/************************************************************************/
/* 以下是范例可以直接使用,也可以关闭开关掉重新编写 */
/* 范例2:任务栏进度条 */
/************************************************************************/
#include <afxwin.h>
#include "ShObjIdl.h"
class CTaskBarProgress : public CProgressInterface
{
HWND m_hWnd;
ITaskbarList3* m_pTaskbarList;
public:
CTaskBarProgress(HWND hWnd) : m_hWnd(hWnd)
{
m_pTaskbarList = nullptr;
CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_ALL, IID_ITaskbarList3, (void**)&m_pTaskbarList);
}
~CTaskBarProgress()
{
if (m_pTaskbarList)
{
m_pTaskbarList->Release();
m_pTaskbarList = nullptr;
}
}
int End()
{
if (m_pTaskbarList && m_hWnd)
{
m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NOPROGRESS);
}
return 0;
}
int Start()
{
if (m_pTaskbarList && m_hWnd)
{
m_pTaskbarList->SetProgressState(m_hWnd, TBPF_INDETERMINATE);
}
return 0;
}
int SetProgressValue(
/* [in] */ size_t ullCompleted,
/* [in] */ size_t ullTotal)
{
if (m_pTaskbarList && m_hWnd)
{
m_pTaskbarList->SetProgressValue(m_hWnd, ullCompleted, ullTotal);
}
return 0;
}
};
#endif // __AFX_H__
范例中展示了显示到命令行的用法:
int main(int argc, char* argv[])
{
CcmdProgress ci;
CProgressInterface* ppi = &ci;
ppi->Start();
for (int i = 0; i < 100; ++i)
{
Sleep(50);
ppi->SetProgressValue(i +1, 100);
}
ppi->End();
return 0;
}
更多的交流,欢迎加入 暗号271888395