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);

效果图如下:

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

#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;
};

  

WTL 自绘 进度条Progressbar的更多相关文章

  1. Android 自学之进度条ProgressBar

    进度条(ProgressBar)也是UI界面中的一种非常使用的组件,通常用于向用户显示某个耗时完成的百分比.因此进度条可以动态的显示进度,因此避免长时间地执行某个耗时操作时,让用户感觉程序失去了响应, ...

  2. WPF的进度条progressbar,运行时间elapse time和等待spinner的实现

    今天用.NET 4.5中的TPL的特性做了个小例子,实现了WPF的进度条progressbar,运行时间elapse time和等待spinner. 先上图吧.   这个例子包含4个实现,分别是同步版 ...

  3. android圆形进度条ProgressBar颜色设置

    花样android Progressbar http://www.eoeandroid.com/thread-1081-1-1.html http://www.cnblogs.com/xirihanl ...

  4. Android-SpinKit 进度条 (ProgressBar)

    项目地址: https://github.com/ybq/Android-SpinKit 类别: 进度条 (ProgressBar) 打分: ★★★★★ 更新: 2016-03-28 11:17 大小 ...

  5. 进度条ProgressBar

    在本节中,作者只写出了进度条的各种样式,包括圆形.条形,还有自定义的条形,我想如果能让条形进度条走满后再继续从零开始,于是我加入了一个条件语句.作者的代码中需要学习的是handler在主线程和子线程中 ...

  6. WPF 进度条ProgressBar

    今天研究了一下wpf的进度条ProgressBar 1.传统ProgressBar WPF进度条ProgressBar 这个控件,如果直接写到循环里,会死掉,界面会卡死,不会有进度.需要把进度条放到单 ...

  7. Xamarin XAML语言教程构建进度条ProgressBar

    Xamarin XAML语言教程构建进度条ProgressBar Xamarin XAML语言教程构建进度条ProgressBar,ProgressBar被称为进度条,它类似于没有滑块的滑块控件.进度 ...

  8. Android零基础入门第51节:进度条ProgressBar

    原文:Android零基础入门第51节:进度条ProgressBar 不知不觉这已经是第51期了,在前面50期我们学了Android开发中使用频率非常高的一些UI组件,当然这些组件还不足够完成所有AP ...

  9. Android——进度条ProgressBar

    1.activity_progressbar.xml <?xml version="1.0" encoding="utf-8"?><Linea ...

随机推荐

  1. 分析ECMall的注册与登录机制

    ecmall的注册流程index.php?app=member&act=register. 首先app是member,act是register方法. index.php中.通过ecmall的s ...

  2. 思考 Swift 中的 MirrorType 协议

    Swift中的反射非常有限,仅允许以只读方式访问元数据的类型子集.或许 Swift 因有严格的类型检验而不需要反射.编译时已知各种类型,便不再需要进行进一步检查或区分.然后大量的 Cocoa API ...

  3. OneAlert 入门(四)——事件分派和通知必达

    OneAlert 是国内首个 SaaS 模式的云告警平台,集成国内外主流监控/支撑系统,实现一个平台上集中处理所有 IT 事件,提升 IT 可靠性.有了 OneAlert,你可以更快更合理地为事件划分 ...

  4. IntelliJ IDEA Subversion的使用方式

    接着一直点下一步基本上就可以了

  5. RocketMQ在windows上安装和开发使用

    1.概述 RocketMQ是alibaba公司开源的一个纯java的开源消息中间件. 2.开发测试环境搭建 到github上面rocketMQ,我选择的是alibaba-rocketmq-3.2.6. ...

  6. Linux下压缩某个文件夹(文件夹打包)

    tar -zcvf /home/xahot.tar.gz /xahottar -zcvf 打包后生成的文件名全路径 要打包的目录例子:把/xahot文件夹打包后生成一个/home/xahot.tar. ...

  7. 关于Azure Auto Scale的高级属性配置

    Auto Sacle是一种自动化管理云服务负载的功能,系统可以根据预先制定的规则,在满足条件的情况下对计算实例的数量进行增减从而可以用来优化使用Azure的计算资源,可以适用于Cloud Servic ...

  8. 我泡在GitHub上的177天 by Ryan Seys

    我泡在GitHub上的177天   这是一个关于我如何连续177天(将近半年)泡在GitHub上不间断地贡献代码的故事.我会谈到我为什么要这么做,以及为什么你也应该效仿,或者至少做点类似的事情.这是一 ...

  9. loadrunner 与Md5

    loadrunner 与Md5 1.新建个c vuser脚本 2.把cmd5.h导入脚本 3.在脚本中,引入cmd5.h,可以在action前面加个void,但要屏蔽return 来自为知笔记(Wiz ...

  10. bzoj 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集)

    Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的 时候有一个独一无二的位置坐标Xi,Yi( ...