C++自绘进度条

#include "pch.h"
#include "MySlider.h"
//#include <afxwin.h>
#define BK_COLOR RGB(255, 255, 255)
#define SEP_COLOR RGB(0x42,0x99,0xED)	//4299ed
#define WINDOWS_COLOR RGB(0xF0,0xF0,0xF0)	//4299ed
#define VT_DOWN    1
#define VT_UP      2
#define VT_MOVE    3
#define IDC_CURSOR1 129

MySlider* g_mthis = NULL;

typedef struct _MYPOINT
{
	POINT pt;
	int x;
}MYPOINT,*PMYPOINT;
MySlider::MySlider()
{
	m_hWnd=0;
	 m_Slider_len = 100; //进度条长度必须是100的倍数
	m_Slider_size = 10; //进度条大小 宽度相数
	 m_Slider_pos = 0;   //进度条位置
	 m_Slider_back = COLORREF(BK_COLOR);//进度条背景颜色 COLORREF(DLG_BK_COLOR);
	 m_windows_back = COLORREF(WINDOWS_COLOR);
	 m_Slider_spe = COLORREF(SEP_COLOR);  //进度条颜色
	 m_dc=NULL;    //绘制进度条的设备
	 m_Slider_xy = {0,0};
	 g_mthis = this;
	
	// m_cur1 = GetCursor();
}
MySlider::~MySlider()
{

}
int MySlider::GetPos() const
{
	
	return m_Slider_pos;
}
void MySlider::SetPos(int nPos)
{
	if (nPos>100)
	{
		nPos = 100;
	}
	if (nPos<0)
	{
		nPos = 0;
	}
	m_Slider_pos = nPos;
	myRedraw();//重画
}
void MySlider::SetBack(COLORREF color)
{
	if (color<=0)
	{
		return;
	}
	m_Slider_back = color;
}
void MySlider::SetSpe(COLORREF color)
{
	if (color <= 0)
	{
		return;
	}
	m_Slider_spe = color;
}
void MySlider::SetSize(int size)
{
	if (size>0)
	{
		m_Slider_size = size;
	}
}
void MySlider::SetLen(int len)
{
	if (m_hWnd==0)
	{
		return;
	}
	if (len>=100)
	{
		CRect rect;
		GetClientRect(m_hWnd, &rect);
		int w = rect.Width();
		if (m_Slider_xy.x + len > w)
		{
			
			len = w - m_Slider_xy.x;
		}

		m_Slider_len = len;
	}
}
BOOL MySlider::myPolygon(const POINT* lpPoints, int nCount, COLORREF crColor)
{
	if (nCount <= 0 || !m_dc)
	{
		return FALSE;
	}
	int x = 0, y = 0;
	POINT pt = { 0 };
	CBrush brush;
	CPen   pen;
	CBrush* obbrush = 0;
	CPen* obpen = 0;
	if (crColor > 0)
	{
		pen.CreatePen(PS_SOLID, 1, crColor);
		brush.CreateSolidBrush(crColor);//红色画刷35c1ff
		obbrush = m_dc->SelectObject(&brush);
		obpen = m_dc->SelectObject(&pen);
	}
	else
	{
		return FALSE;
	}
	for (int i = 0; i < nCount; i++)
	{
		if (i == 0)
		{
			pt = { lpPoints[i].x,lpPoints[i].y };
			m_dc->MoveTo(pt);
		}
		m_dc->LineTo(lpPoints[i].x, lpPoints[i].y);
	}
	m_dc->LineTo(lpPoints[0].x, lpPoints[0].y);

	x = lpPoints[0].x + (int)((lpPoints[1].x - lpPoints[0].x) / 2);
	y = lpPoints[0].y + 1;
	if (crColor > 0)
	{

		m_dc->FloodFill(x, y, crColor); //填充区域
		m_dc->SelectObject(obbrush);
		m_dc->SelectObject(obpen);
		::DeleteObject(obpen);
		::DeleteObject(obbrush);
		return TRUE;
	}
	m_dc->FloodFill(x, y, m_dc->GetBkColor()); //填充区域
	m_dc->SelectObject(obbrush);
	m_dc->SelectObject(obpen);
	::DeleteObject(brush);
	::DeleteObject(pen);
	return TRUE;
}
BOOL MySlider::ellipse()
{
	if ( !m_dc)
	{
		return FALSE;
	}
	SetPosxy();
	myRedraw();
	CPen  * pOldPen;
	CPen pen1(PS_SOLID, 2, m_Slider_spe);
	CBrush bsh, * obsh;
	bsh.CreateSolidBrush(m_Slider_spe);//创建画刷
	pOldPen = m_dc->SelectObject(&pen1);
	obsh =m_dc->SelectObject(&bsh);
	 bool ret= m_dc->Ellipse(m_pos_rect.x, m_pos_rect.y, m_pos_rect.x1, m_pos_rect.y1);
	 m_dc->SelectObject(pOldPen);
	 ::DeleteObject(&pen1);
	 m_dc->SelectObject(obsh);
	 ::DeleteObject(&bsh);
	 m_back = TRUE;
	 return ret;
}
void MySlider::OnPaint()
{
	m_Slider_len = m_Slider_len - (m_Slider_len%100);
	POINT pt[4] = { 0 };
	pt[0] = { m_Slider_xy.x, m_Slider_xy.y };
	pt[1] = { m_Slider_xy.x+ m_Slider_len, m_Slider_xy.y};
	pt[2] = { m_Slider_xy.x + m_Slider_len, m_Slider_xy.y+ m_Slider_size };
	pt[3] = { m_Slider_xy.x , m_Slider_xy.y + m_Slider_size };
	myPolygon(pt,4, m_Slider_back);
	if (m_Slider_pos==0)
	{
		return;
	}
	int tpos = m_Slider_len / 100 * m_Slider_pos;
	pt[0] = { m_Slider_xy.x, m_Slider_xy.y };
	pt[1] = { m_Slider_xy.x + tpos, m_Slider_xy.y };
	pt[2] = { m_Slider_xy.x + tpos, m_Slider_xy.y + m_Slider_size };
	pt[3] = { m_Slider_xy.x , m_Slider_xy.y + m_Slider_size };
	myPolygon(pt, 4, m_Slider_spe);
}
BOOL MySlider::Create(HWND hwnd,CDC* dc, COLORREF color, int x, int y)
{
	if (!hwnd||!dc)
	{
		return FALSE;
	}
	m_dc=dc;
	m_hWnd = hwnd;
	if (color>0)
	{
		m_windows_back = color;
	}
	if (x>0||y>0)
	{
		m_Slider_xy.x = x;
		m_Slider_xy.y = y;
	}
	return 0;
}
MYPOINT g_ptn = {0};

void WindowProc_1(PVOID* pt)
{
	MYPOINT ptn=*(MYPOINT*)pt;
	if (ptn.x==0)
	{
		return;
	}
		g_mthis->dwex(ptn.pt, ptn.x);
		return;
}
void MySlider::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	//SendMessage(hwnd, WM_LBUTTONDOWN,0, MAKELPARAM(x,y));发送坐标
	CPoint pt;
	POINTSTOPOINT(pt, lParam)
	int x = pt.x, y = pt.y;
	if (m_Slider_btnDwn==FALSE)
	{
		if (!(x >= m_Slider_xy.x && x <= m_Slider_xy.x + m_Slider_len &&
			y >= m_Slider_xy.y - 4 && y <= m_Slider_xy.y + m_Slider_size + 4))
		{
			if (m_Slider)
			{
				myRedraw();
			}
			m_Slider = FALSE;
			m_Slider_btnDwn = FALSE;
			return;
		}
	}
	switch (message)
	{
	case WM_LBUTTONDOWN:
	{
	
			MYPOINT ptn;
		ptn.pt.x = pt.x;
		ptn.pt.y = pt.y;
		ptn.x = VT_DOWN;
		memcpy(&g_ptn, &ptn, sizeof(MYPOINT));
		CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WindowProc_1, &g_ptn, 0, 0);
		m_Slider = TRUE;
		break;
	}
	case WM_LBUTTONUP:
	{
			MYPOINT ptn;
		ptn.pt.x = pt.x;
		ptn.pt.y = pt.y;
		ptn.x = VT_UP;
		memcpy(&g_ptn, &ptn,sizeof(MYPOINT));
		CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WindowProc_1, &g_ptn, 0, 0);
		m_Slider = TRUE;
		break;
	}
	case WM_MOUSEMOVE:
	{
			MYPOINT ptn;
		ptn.pt.x = pt.x;
		ptn.pt.y = pt.y;
		ptn.x = VT_MOVE;
		memcpy(&g_ptn, &ptn, sizeof(MYPOINT));
		CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WindowProc_1, &g_ptn, 0, 0);
		m_Slider = TRUE;
		break;
	}
	default:
		break;
	}
	return ;
}

void MySlider::dwex(POINT pt ,int x)
{
	switch (x)
	{
	case VT_DOWN:
	{
		OnLButtonDown(pt);
		break;
	}
	case VT_UP:
	{
		OnLButtonUp(pt);
		break;
	}
	case VT_MOVE:
	{
		OnMouseMove(pt);
		break;
	}
	default:
		break;
	}
}

void MySlider::OnLButtonUp(CPoint point)
{
	int x = point.x, y = point.y;

		//ellipse(point);
	if (m_Slider==TRUE&& m_Slider_btnDwn == FALSE)
	{
		int tpos = m_Slider_len / 100;
		int pos = 0;
		pos = (x - m_Slider_xy.x) / tpos;
		SetPos(pos);
		ellipse();
		return;
	}
	m_Slider_btnDwn = FALSE;
	return;
}

void MySlider::OnLButtonDown(CPoint point)
{
	SetPosxy();
	int x = point.x, y = point.y;
	if (x>=m_pos_rect.x&&x<= m_pos_rect.x1 &&y>= m_pos_rect.y&&y<= m_pos_rect.y1)
	{
		if (m_Slider_btnDwn == TRUE)
		{
			return;
		}
		
		m_Slider_btnDwn = TRUE;
	}
	
	return;
}

void MySlider::OnMouseMove(CPoint point)
{
	int x = point.x, y = point.y;
	if (!m_Slider)
	{
		myRedraw();
		//return;
	}
	SetPosxy();
	if (x>=m_Slider_xy.x&&x<= m_Slider_xy.x+m_Slider_len&&
		y>= m_Slider_xy.y-8&&y<= m_Slider_xy.y+m_Slider_size+8&& m_back == FALSE)
	{
		
		ellipse();
		
	}
	else
	{
		if (!m_Slider)
		{
			myRedraw();
			
			//return;
		}
	}
	if (m_Slider_btnDwn == TRUE)
	{
		int tpos = m_Slider_len / 100;
		int pos = 0;
		pos = (x - m_Slider_xy.x) / tpos;
		SetPos(pos);
		ellipse();
	}

	

	return;
}

void MySlider::myRedraw()
{
	CRect rect(m_Slider_xy.x, m_Slider_xy.y-5, m_Slider_xy.x + m_Slider_len + 5, m_Slider_xy.y + m_Slider_size + 8);

	CPen NewPen, * pOldPen;
	NewPen.CreatePen(PS_SOLID, m_Slider_size + 2, m_windows_back);
	pOldPen = m_dc->SelectObject(&NewPen);

	CBrush NewBrush, * pOldBrush;
	NewBrush.CreateSolidBrush(m_windows_back);//创建画刷
	pOldBrush = m_dc->SelectObject(&NewBrush);//选择画刷,保存原来画刷

	m_dc->Rectangle(rect);
	m_dc->SelectObject(pOldPen);//恢复设备上下文
	m_dc->SelectObject(pOldBrush);
	::DeleteObject(&NewPen);
	::DeleteObject(&NewBrush);
	OnPaint();
	m_back = FALSE;
}

void MySlider::SetPosxy()
{
	if (m_Slider_pos == 100)
	{
		m_pos_rect.x = m_Slider_len - (m_Slider_size + 8);
		if (m_Slider_xy.y == 0)
		{
			m_pos_rect.y = 0;
		}
		else
		{
			m_pos_rect.y = m_Slider_xy.y - 4;
			m_pos_rect.y1 = m_pos_rect.y + m_Slider_size + 8;
			m_pos_rect.x1 = m_pos_rect.x + m_Slider_size + 8;
		}

	}
	else
	{
		m_pos_rect.x = m_Slider_xy.x + (m_Slider_pos * (m_Slider_len / 100)) - 4;
		if (m_Slider_xy.y == 0)
		{
			m_pos_rect.y = 0;
		}
		else
		{
			m_pos_rect.y = m_Slider_xy.y - 4;
			m_pos_rect.y1 = m_pos_rect.y + m_Slider_size + 8;;
			m_pos_rect.x1 = m_pos_rect.x + m_Slider_size + 8;
		}
	}
	return ;
}
#pragma once
#include <afxcmn.h>
class MySlider
{
public:
	MySlider();
	~MySlider();
public:
	//获取滑块位置返回百分比
	int GetPos() const;
	//设置滑块位置百分比
	void SetPos( int nPos);
	//设置滑块背景颜色
	void SetBack(COLORREF color);
	//设置进度条颜色
	void SetSpe(COLORREF color);
	//设置进度条宽窄
	void SetSize(int size);
	//设置进度条长度必须是100的倍数
	void SetLen(int len);
	//创建进度条对象必须指定CDC设备和窗口背景颜色
	BOOL Create(HWND hwnd, CDC* dc, COLORREF color,int x,int y );
	void WindowProc(UINT message, WPARAM wParam, LPARAM lParam);

	//消息函数
	void dwex(POINT pt, int x);
private:
	typedef struct _MYRECT
	{
		int x = 0;
		int y = 0;
		int x1 = 0;
		int y1 = 0;
	}MYRECT, * PMyRECT;
	BOOL myPolygon( const POINT* lpPoints, int nCount, COLORREF crColor);
     //画滑块
	BOOL ellipse();
	void OnPaint();
	void OnLButtonUp(CPoint point);
	void OnLButtonDown(CPoint point);
	void OnMouseMove(CPoint point);
	//重画
	void myRedraw();
	//计算进度坐标
	void SetPosxy();

private:
	
	int m_Slider_len; //进度条长度必须是100的倍数
	int m_Slider_size ; //进度条大小 宽度相数
	int m_Slider_pos ;   //进度条位置
	COLORREF m_Slider_back;//进度条背景颜色
	COLORREF m_windows_back;//窗口背景颜色
	COLORREF m_Slider_spe;  //进度条颜色
	CDC* m_dc;    //绘制进度条的设备
	MYRECT m_pos_rect = { 0 }; //进度条pos
	POINT  m_Slider_xy;        //进度条起始位置
	HWND m_hWnd;              //主窗口句柄
	BOOL m_Slider = FALSE; //是否刷新背景
	BOOL m_back = FALSE;   //是否画出了滑块
	BOOL m_Slider_btnDwn = FALSE; //鼠标左键按下
	
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值