添加类继承 CProgressCtrl
#pragma once
class CMyProgressCtr:public CProgressCtrl
{
public:
CMyProgressCtr();
~CMyProgressCtr();
private:
COLORREF m_ColText;//文本颜色
COLORREF m_ColProgress;//进度条颜色
COLORREF m_ColBlank;//空白区域颜色
public:
DECLARE_MESSAGE_MAP()
afx_msg void OnPaint();
};
cpp文件
#include "stdafx.h"
#include "MyProgressCtr.h"
CMyProgressCtr::CMyProgressCtr()
{
m_ColText = RGB(255, 0, 0);//文本颜色
m_ColProgress = RGB(255,128,0);//进度条颜色
m_ColBlank = RGB(192, 192, 192);
}
CMyProgressCtr::~CMyProgressCtr()
{
}
BEGIN_MESSAGE_MAP(CMyProgressCtr, CProgressCtrl)
ON_WM_PAINT()
END_MESSAGE_MAP()
void CMyProgressCtr::OnPaint()
{
/* 简易版
CPaintDC dc(this);
CBrush BackgroundBrush;
BackgroundBrush.CreateSolidBrush(RGB(255, 0, 0));
CBrush ForeBrush;
ForeBrush.CreateSolidBrush(RGB(100, 255, 0));
CRect r;
this->GetClientRect(r);
double With = r.Width();
int min, max;
this->GetRange(min, max);
int pos = this->GetPos();
double unit = (double)r.Width() / (max - min);
dc.FillRect(r, &BackgroundBrush);
r.right = pos*unit;
dc.FillRect(r, &ForeBrush);*/
PAINTSTRUCT ps;//声明一个绘画区域
CDC *pDC = BeginPaint(&ps);//把绘画区域选入设备上下文并开始
int AdrPos = GetPos();//获取进度条的进度位置
CString StrPos;//声明字符串,用于显示进度条的进度
StrPos.Format(_T("%d%%"), AdrPos);//把进度位置复制到StrPos
CRect ClientRC;
GetClientRect(&ClientRC);//获取客户区矩形
CSize CsText = pDC->GetTextExtent(StrPos);//获取显示StrPos的规模大小
int nX = (ClientRC.Width() - CsText.cx) / 2;//获取显示字符串的X
int nY = (ClientRC.Height() - CsText.cy) / 2;//获取显示字符串的Y
pDC->SetBkMode(TRANSPARENT);//设置背景模式为透明
int nMin, nMax;//声明进度条的最大最小限制
GetRange(nMin, nMax);//获取限制
double Every = (double)ClientRC.Width() / (nMax - nMin);//获取单位刻度
int Now = Every*AdrPos;//当前长度
CRect LeftRC, RightRC;//声明进度条区域和空白区域
LeftRC = RightRC = ClientRC;
LeftRC.right = Now;//进度条区域
RightRC.left = Now;//空白区域
pDC->FillRect(LeftRC, &(CBrush)m_ColProgress);//画进度条区域
pDC->FillRect(RightRC, &(CBrush)m_ColBlank);//画空白区域
pDC->SetTextColor(m_ColText);//设置文本颜色
pDC->TextOut(nX, nY, StrPos);//写文本
ReleaseDC(pDC);//销毁设备上下文
EndPaint(&ps);
/* ================================================================================================================
绘制图片进度条
HBITMAP hbit = (HBITMAP)LoadImage(NULL, _T("D:/Shot.bmp"), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE | LR_DEFAULTSIZE);
CBitmap bit;
BITMAP bitInfo;
bit.DeleteObject();
if (!bit.Attach(hbit))
AfxMessageBox(_T("导入位图失败!"));
bit.GetBitmap(&bitInfo);
PAINTSTRUCT ps;//声明一个绘画区域
CDC *pDC = BeginPaint(&ps);//把绘画区域选入设备上下文并开始
int AdrPos = GetPos();//获取进度条的进度位置
CRect ClientRC;
GetClientRect(&ClientRC);//获取客户区矩形
pDC->SetBkMode(TRANSPARENT);//设置背景模式为透明
int nMin, nMax;//声明进度条的最大最小限制
GetRange(nMin, nMax);//获取限制
double Every = (double)ClientRC.Width() / (nMax - nMin);//获取单位刻度
int Now = Every*AdrPos;//当前长度
double BitEvery= (double)bitInfo.bmWidth/ (nMax - nMin);//获取图片的单位刻度
int BitNow= BitEvery*AdrPos;//bitmap当前位置
CDC memDC;
CDC *dc = GetDC();
memDC.CreateCompatibleDC(dc);
memDC.SelectObject(bit);
dc->SetStretchBltMode(COLORONCOLOR);
dc->StretchBlt(0, 1, Now, ClientRC.Height()-2, &memDC, 0, 0, BitNow, bitInfo.bmHeight, SRCCOPY);
ReleaseDC(pDC);//销毁设备上下文
ReleaseDC(dc);
memDC.DeleteDC();
bit.DeleteObject();
DeleteObject(hbit);
EndPaint(&ps);
*/
/*================================================================================================================
圆角矩形
PAINTSTRUCT ps;//声明一个绘画区域
CDC *pDC = BeginPaint(&ps);//把绘画区域选入设备上下文并开始
int AdrPos = GetPos();//获取进度条的进度位置
CString StrPos;//声明字符串,用于显示进度条的进度
StrPos.Format(_T("%d%%"), AdrPos);//把进度位置复制到StrPos
CRect ClientRC;
GetClientRect(&ClientRC);//获取客户区矩形
CSize CsText = pDC->GetTextExtent(StrPos);//获取显示StrPos的规模大小
int nX = (ClientRC.Width() - CsText.cx) / 2;//获取显示字符串的X
int nY = (ClientRC.Height() - CsText.cy) / 2;//获取显示字符串的Y
pDC->SetBkMode(TRANSPARENT);//设置背景模式为透明
int nMin, nMax;//声明进度条的最大最小限制
GetRange(nMin, nMax);//获取限制
double Every = (double)ClientRC.Width() / (nMax - nMin);//获取单位刻度
int Now = Every*AdrPos;//当前长度
CRect LeftRC, RightRC;//声明进度条区域和空白区域
LeftRC = RightRC = ClientRC;
LeftRC.right = Now;//进度条区域
RightRC.left = Now;//空白区域
pDC->SelectObject(GetStockObject(NULL_PEN));
POINT pt = { 15,15 };
CBrush b1,b2;
b1.CreateSolidBrush(m_ColProgress);
b2.CreateSolidBrush(m_ColBlank);
pDC->SelectObject(b1);
pDC->RoundRect(LeftRC,pt);
pDC->SelectObject(b2);
pDC->RoundRect(RightRC, pt);
pDC->SetTextColor(m_ColText);//设置文本颜色
pDC->TextOut(nX, nY, StrPos);//写文本
ReleaseDC(pDC);//销毁设备上下文
EndPaint(&ps);
*/
}
//响应鼠标消息
void CMyProgressCtr::OnLButtonDown(UINT nFlags, CPoint point)
{
// 鼠标调整进度位置
CRect r;
this->GetClientRect(r);
double With = r.Width();
int min, max;
this->GetRange(min, max);
double unit = (double)(max - min) / r.Width(); //
int pos = point.x*unit;
this->SetPos(pos);
CProgressCtrl::OnLButtonDown(nFlags, point);
}