#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; //鼠标左键按下
};