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; }; |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步