用于控制进度条的接口类

这个类可以用于在函数中输出进度,因为使用了虚函数,所以可以用于各种情况,比如显示到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

猜你喜欢

转载自blog.csdn.net/autumoonchina/article/details/79987111