WTL 自绘 进度条Progressbar

WTL 绘制的进度条,逻辑清晰明了,代码函数清晰易懂:基本思路就是 首先绘制 进度条背景图,然后根据动态进度不断重绘前景进度条,绘制操作在OnPaint函数里画。该类可以直接用于项目中。

使用示例:

MyProgress* pMyProgress = new MyProgress;
CRect rcProgress;
rcProgress.top = 500;
rcProgress.left = 240;
rcProgress.right = rcProgress.left + 500;
rcProgress.bottom = rcProgress.top + 20;
CString strFore = Util::GetCurrentDir();
strFore += L"\\img\\ui\\progress_fore.png";
CString strBgnd = Util::GetCurrentDir();
strBgnd += L"\\img\\ui\\progress_bgnd.png";
pMyProgress->SetRange(0,100);
pMyProgress->SetProgressBmp(strFore,strBgnd);
pMyProgress->Create(m_hWnd,rcProgress,NULL,WS_CHILD|WS_VISIBLE);

效果图如下:

进度条自定义类代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#pragma  once
 
#pragma comment(lib, "gdiplus.lib")
static ULONG_PTR s_gdiplusToken3=0;
 
class MyProgress:public CWindowImpl<MyProgress>
{
public:
    MyProgress()
    {
        GdiplusStartupInput gdiplusStartupInput;
        GdiplusStartup(&s_gdiplusToken3, &gdiplusStartupInput, NULL);
    }
    ~MyProgress()
    {
        GdiplusShutdown(s_gdiplusToken3);
    }
     
protected:
    BEGIN_MSG_MAP(MyProgress)
        MESSAGE_HANDLER(WM_CREATE,OnCreate)
         
        MESSAGE_HANDLER(WM_PAINT,OnPaint)
        MESSAGE_HANDLER(WM_DESTROY,OnDestroy)
        MESSAGE_HANDLER(WM_ERASEBKGND,OnEraseBkgnd)
    END_MSG_MAP()
 
 
    HBITMAP GetBitmapFromFile( LPCWSTR pFile )
    {
        std::auto_ptr<Bitmap> pBmp(new Bitmap(pFile));
        if(!pBmp.get())
            return NULL;
        HBITMAP hBmp = NULL;
        Color backColor = Color(255,0,0,0);  
        if(Ok!=pBmp->GetHBITMAP(backColor,&hBmp))
            return NULL;
        return hBmp;
    }
    void SetProgressBmp(CString strFore,CString strBgnd)
    {
        m_btm_fore.Attach(GetBitmapFromFile(strFore));
        m_btm_bgnd.Attach(GetBitmapFromFile(strBgnd));
    }
    BOOL  DrawBmp( HDC hdc, CRect rect, HBITMAP hBitmap )
    {
        BITMAP bm;
        GetObject(hBitmap,sizeof(bm),(VOID*)&bm);
        INT nWidth = bm.bmWidth;
        INT nHeight = bm.bmHeight;
        CDC memdc;
        memdc.CreateCompatibleDC(hdc);
        CBitmap bitmap;
        bitmap.CreateCompatibleBitmap(hdc,nWidth,nHeight);
        memdc.SelectBitmap(hBitmap);
 
        //BLENDFUNCTION bf = {AC_SRC_OVER,0,255,1};
        //return ::AlphaBlend(hdc,rect.left,rect.top,nWidth,nHeight,memdc,0,0,nWidth,nHeight,bf);
 
        return ::StretchBlt(hdc,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,
                memdc,0,0,nWidth,nHeight,SRCCOPY );
    }
    void SetPos(int nPos)
    {
        m_nPos = nPos;
        m_nPercent = GetPercent();
        RedrawWindow();
    }
    void SetRange(int nMin,int nMax)
    {
        if(nMin > nMin)
            return;
        m_nMin = nMin;
        m_nMax = nMax;
    }
    int  GetRange()
    {
        return m_nMax - m_nMin;
    }
    int  GetPercent()
    {
 
        return (m_nPos * 100)/GetRange();
    }
    LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
        m_nMin = 0;
        m_nMax  = 100;
        m_nPos  = 0;
        m_nPercent =0;
        m_bHasDrawBgnd = FALSE;
        GetClientRect(&m_rcWindow);
        GetClientRect(&m_rcProgress);
        SetWindowPos(HWND_TOPMOST,m_rcWindow,SWP_SHOWWINDOW);
     
        return TRUE;
    }
    LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
        return TRUE;
    }
    LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
 
        return TRUE;
    }
    LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
        CPaintDC dc(m_hWnd);
        int nWidth = m_rcWindow.right - m_rcWindow.left;
        int nHeight = m_rcWindow.bottom - m_rcWindow.top;
        if(!m_bHasDrawBgnd)
        {
            //画背景
             
            DrawBmp(dc,m_rcWindow,m_btm_bgnd);
            m_bHasDrawBgnd = TRUE;
        }
         
         
        //画动态进度条部分
        m_rcProgress.right = m_rcProgress.left + nWidth*GetPercent()/100;
        DrawBmp(dc,m_rcProgress,m_btm_fore);
        return TRUE;
    }
private:
    int m_nMin;
    int m_nMax;
    int m_nPos;
    int m_nPercent;
    BOOL m_bHasDrawBgnd;
    CBitmap m_btm_fore;
    CBitmap m_btm_bgnd;
    CRect m_rcWindow;
    CRect m_rcProgress;
};

  

posted @   Jamy Cai  阅读(1031)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示