标准的进度条控件是不带指示器的,也没用函数供我们去实现。我们看到的有些进度条指示器是在进度条控件中放置一个静态文本控件而制成的。
具体实现方法如下:
1,处理当前窗口的反射消息WM_CTLCOLOR,即添加HBRUSH OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor)这个消息映射函数。注意,不是HBRUSH CtlColor(CDC *pDC, UINT nCtlColor)!
具体实现代码如下:
HBRUSH Ctest2Dlg(当前对话框类名)::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何属性
//CTLCOLOR_STATIC 指定是静态文本控件的颜色,pWnd用于判断你想改变背景的控件指针
if (nCtlColor == CTLCOLOR_STATIC && pWnd== GetDlgItem(IDC_STATIC1))
{
pDC->SetBkMode(TRANSPARENT); //设置背景为透明的
pDC->SetTextColor(RGB(255,0,0)); //设置文本显示的颜色,此句可省略
return (HBRUSH)::GetStockObject(NULL_BRUSH); //返回空画刷
}
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}
至此,静态文件控件的背景已设为透明,但是当你调试时会发现,静态文本显示的控件还存在一个问题,当该Static控件的文本内容或者属性,在运行过程中发生变化的时候,由于背景一直没有擦除(为了实现透明),会出现重影,导致文本模糊成一团。
解决方法是,让控件所属父窗口进行重绘更新或让控件重绘。由于GDI并不内嵌双缓冲,让整个窗口重绘会导致窗口的频繁的严重的闪烁,不可取,于是采用控件重绘。只让父窗口重绘控件所占的部分,其他部分不进行重绘,代码如下:
以下代码可写在你显示进度值的函数里
{
CRect rect;
GetDlgItem(IDC_STATIC1)->GetWindowRect(rect);
this->ScreenToClient(rect);
GetDlgItem(IDC_STATIC1)->SetWindowText(str);
this->InvalidateRect(rect);
}
这里解决了重影问题,至此问题全部解决。在处理重影的时候还有很多方法,目的都是使控件所在区域重绘,这个依具体设计而定。
综上就可得到一个自制的进度条指示器了
分享到:
相关推荐
MFC进度条的使用实例,MFC进度条的使用实例,MFC进度条的使用实例
MFC进度条控件的使用演示,整个工程源代码,加上演示的可执行文件
一个基于进度条类派生的自定义进度条类,效果还不错。
非常漂亮的MFC进度条程序,封装成了类,可直接调用,用VS2013编译,编译器版本低的,可参考demo,调用封装的进度条类自己实现
漂亮的进度条,可以选择颜色调节。使用了重绘技术。从别人那里下载的,感觉不错
MFC 进度条 重绘 改变颜色 显示百分比 1.修改了上版本的内存泄露 2.代码量大大优化,只有原来的1/2 3.修改了一些刷新bug 4.采用双缓冲
MFC进度条的编写 感觉还不错 不过还 是有朋友反映代码说明的不是很清晰 现在再给出一段关于文件传输的代码
界面上有一个进度条,当进度条到达100的时候程序自动关闭,适合初学者
重绘Progress进度条,具有3D效果,可设置显示或关闭显示当前进度百分比,设置文字颜色,进度底色等
MFC中进度条的使用MFC中进度条的使用MFC中进度条的使用MFC中进度条的使用MFC中进度条的使用
MFC 进度条,显示该控件的常规用法
MFC进度条
MFC进度条使用,本实例实现了一个渐变颜色的进度条。
利用MFC线程显示独立的进度条界面
MFC自绘进度条:可以进度条修改颜色,设置进度百分比,进度条背景色。
如迅雷下载将进度条嵌入表格,比较简洁,适合初学
用模式对话框来展示操作进度。 具体操作在线程中进行。 通过在线程中进行操作并修改表示进度的变量, 然后再对话框中通过定时器来设置进度,实现多线程情况下的进度控制。
MFC带百分比的进度条,使用GDI+实现,代码比较简单。做个参考。里面gdi对象没有释放。使用时请自行deleteobject和releaseDC
vs2012平台下, MFC进度条控件的使用演示,整个工程源代码,加上演示的可执行文件