MFC 进度条自绘按钮类

废话不多说 先看效果

看看怎么调用

这当然先包含砸门的进度条绘图类
#include "MySlider.h"MySlider m_lider;//防在Dlg头文件的窗口类里面m_lider.Create(m_hWnd,GetDC(), RGB(0xf0, 0xf0, 0xf0), 0, 581);m_lider.SetSize(2);m_lider.SetLen(1000);m_lider.SetSpe(RGB(0x6c,0xe2,0x6c));m_lider.SetBack(RGB(0xff,0xee,0x62));m_lider.SetPos(50);

下面具体的代码
头文件MySlider.h

#pragma once
#include <afxcmn.h>
#include <afx.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);//返回进度条宽窄int GetSize();//返回进度条宽窄POINT GetBraxy();//设置进度条长度必须是100的倍数void SetLen(int len);//返回进度条长度int GetLen();//创建进度条对象必须指定CDC设备和窗口背景颜色BOOL Create(HWND hwnd, CDC* dc, COLORREF color,int x,int y );void WindowProc(UINT message, WPARAM wParam, LPARAM lParam);private:typedef struct _MYRECT{int x = 0;int y = 0;int x1 = 0;int y1 = 0;}MYRECT, * PMyRECT;//画进度条BOOL myPolygon(CDC* dc,const POINT* lpPoints, int nCount, COLORREF crColor);//画滑块BOOL ellipse(CDC* dc);void OnPaint(CDC* dc);void OnLButtonUp(CPoint point);void OnLButtonDown(CPoint point);void OnMouseMove(CPoint point);//重画void myRedraw(CDC* dc);//计算进度坐标void SetPosxy();
private:    int m_Slider_len; //进度条长度必须是100的倍数int m_Slider_size ; //进度条大小 宽度相数BOOL m_size = FALSE;//是否增加了int m_Slider_pos ;   //进度条位置COLORREF m_Slider_back;//进度条背景颜色COLORREF m_windows_back;//窗口背景颜色COLORREF m_Slider_spe;  //进度条颜色CDC* m_dc;    //绘制进度条的设备CRect rc;MYRECT m_pos_rect = { 0 }; //进度条posPOINT  m_Slider_xy;        //进度条起始位置HWND m_hWnd;              //主窗口句柄BOOL m_Slider = FALSE; //是否刷新背景BOOL m_back = FALSE;   //是否画出了滑块BOOL m_Slider_btnDwn = FALSE; //鼠标左键按下BOOL m_Slider_braDwn = FALSE; //按下的是否为进度条区域BOOL m_Slider_posbtn = FALSE;
};

MySlider.cpp 实现文件

#include "pch.h"
#include "MySlider.h"
#include <iostream>
#include "MicPalay.h"//#include <wingdi.cpp>
//#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    3extern int GetDcColor(int* x1, int* y1, int w, int h);BOOL MP3Btn = FALSE;       //MP3鼠标左键按下
BOOL MP3BtnUP = FALSE;     //MP3鼠标左键按下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;try{CDC dcMem;CBitmap bmp;  //内存中承载临时图象的位图dcMem.CreateCompatibleDC(m_dc);  //依附窗口DC创建兼容内存DC//创建兼容位图(必须用pDC创建,否则画出的图形变成黑色)bmp.CreateCompatibleBitmap(m_dc, rc.Width(), rc.Height());CBitmap* pOldBit = dcMem.SelectObject(&bmp);//按原来背景填充客户区,不然会是黑色dcMem.FillSolidRect(rc, m_windows_back);myRedraw(&dcMem);//重画m_dc->StretchBlt(m_Slider_xy.x, m_Slider_xy.y - 4, m_Slider_xy.x + m_Slider_len, m_Slider_xy.y + m_Slider_size + 8, &dcMem, m_Slider_xy.x, m_Slider_xy.y - 4, m_Slider_xy.x + m_Slider_len, m_Slider_xy.y + m_Slider_size + 8, SRCCOPY);//将内存DC上的图象拷贝到前台//绘图完成后的清理dcMem.DeleteDC();      //删除DCbmp.DeleteObject();  //删除位图}catch (const std::exception&){return;}return;
}
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;}
}
int MySlider::GetSize()
{return m_Slider_size;
}
POINT MySlider::GetBraxy()
{return m_Slider_xy;
}
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;}
}
int MySlider::GetLen()
{return m_Slider_len;
}
BOOL MySlider::myPolygon(CDC* dc,const POINT* lpPoints, int nCount, COLORREF crColor)
{if (nCount <= 2 || !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);//红色画刷35c1ffobbrush = dc->SelectObject(&brush);obpen = dc->SelectObject(&pen);}else{return FALSE;}for (int i = 0; i < nCount; i++){if (i == 0){pt = { lpPoints[i].x,lpPoints[i].y };dc->MoveTo(pt);}dc->LineTo(lpPoints[i].x, lpPoints[i].y);}dc->LineTo(lpPoints[0].x, lpPoints[0].y);x = lpPoints[0].x ;y = lpPoints[0].y ;if (GetDcColor(&x,&y, lpPoints[1].x- lpPoints[0].x, lpPoints[2].y- lpPoints[1].y)==-1){return FALSE; }if (crColor > 0){dc->FloodFill(x, y, crColor); //填充区域dc->SelectObject(obbrush);dc->SelectObject(obpen);::DeleteObject(obpen);::DeleteObject(obbrush);return TRUE;}dc->FloodFill(x, y, m_dc->GetBkColor()); //填充区域dc->SelectObject(obbrush);dc->SelectObject(obpen);::DeleteObject(brush);::DeleteObject(pen);return TRUE;
}BOOL MySlider::ellipse(CDC* dc)
{if ( !m_dc){return FALSE;}CPen  * pOldPen;CPen pen1(PS_SOLID, 1, m_Slider_spe);CBrush bsh, * obsh;bsh.CreateSolidBrush(m_Slider_spe);//创建画刷pOldPen = dc->SelectObject(&pen1);obsh = dc->SelectObject(&bsh);bool ret= dc->Ellipse(m_pos_rect.x, m_pos_rect.y, m_pos_rect.x1, m_pos_rect.y1);dc->SelectObject(pOldPen);::DeleteObject(&pen1);dc->SelectObject(obsh);::DeleteObject(&bsh);m_back = TRUE;return ret;
}
void MySlider::OnPaint(CDC* dc)
{if (m_Slider_size<=2){m_Slider_size = 2;}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(dc,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(dc,pt, 4, m_Slider_spe);SetPosxy();if (m_Slider){ellipse(dc);}}
BOOL MySlider::Create(HWND hwnd,CDC* dc, COLORREF color, int x, int y)
{if (!hwnd||!dc){return FALSE;}m_dc=dc;m_hWnd = hwnd;GetClientRect(m_hWnd, &rc);if (color>0){m_windows_back = color;}if (x>0||y>0){m_Slider_xy.x = x;m_Slider_xy.y = y;}return 0;
}void MySlider::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{//SendMessage(hwnd, WM_LBUTTONDOWN,0, MAKELPARAM(x,y));发送坐标switch (message){case WM_LBUTTONDOWN:{CPoint pt;POINTSTOPOINT(pt, lParam)OnLButtonDown(pt);return ;}case WM_LBUTTONUP:{CPoint pt;POINTSTOPOINT(pt, lParam)OnLButtonUp(pt);return ;}case WM_MOUSEMOVE:{CPoint pt;POINTSTOPOINT(pt, lParam)OnMouseMove(pt);return ;}default:break;}return ;
}void MySlider::OnLButtonUp(CPoint point)
{int x = point.x, y = point.y;MP3BtnUP = TRUE;//ellipse(point);if (m_Slider_braDwn == TRUE&& m_Slider_btnDwn == FALSE){int tpos = m_Slider_len / 100;int pos = 0;pos = (x - m_Slider_xy.x) / tpos;if (pos>=100){pos = 100;} else if (pos<=0){pos = 0;}SetPos(pos);m_Slider_braDwn = FALSE;return;}m_Slider_braDwn = FALSE;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;}MP3Btn = TRUE;m_Slider_braDwn = FALSE;m_Slider_btnDwn = TRUE;return;}if (x >= m_Slider_xy.x && x <= m_Slider_xy.x+m_Slider_len && y >= m_Slider_xy.y-2 && y <= m_Slider_xy.y+m_Slider_size+2){if (m_Slider_braDwn == TRUE|| m_Slider_btnDwn==TRUE){return;}MP3Btn = TRUE;m_Slider_btnDwn = FALSE;m_Slider_braDwn = TRUE;return;}return;
}void MySlider::OnMouseMove(CPoint point)
{if (point.x >= m_Slider_xy.x && point.x <= m_Slider_xy.x + m_Slider_len &&point.y >= m_Slider_xy.y - 4 && point.y <= m_Slider_xy.y + m_Slider_size + 4){m_Slider = TRUE;if (m_back){return;}if (!m_size){m_Slider_size += 3;m_size = TRUE;}SetPosxy();}else{        m_Slider = FALSE;  if (m_size){m_Slider_size -= 3;m_size = FALSE;}SetPosxy();}return;
}void MySlider::myRedraw( CDC* dc)
{if (m_Slider_size <= 2){m_Slider_size = 2;}CRect rect(m_Slider_xy.x, m_Slider_xy.y-4, m_Slider_xy.x + m_Slider_len, m_Slider_xy.y + m_Slider_size + 4);CPen NewPen, * pOldPen;NewPen.CreatePen(PS_SOLID, 1, m_windows_back);pOldPen = dc->SelectObject(&NewPen);CBrush NewBrush, * pOldBrush;NewBrush.CreateSolidBrush(m_windows_back);//创建画刷pOldBrush = dc->SelectObject(&NewBrush);//选择画刷,保存原来画刷dc->Rectangle(rect);dc->SelectObject(pOldPen);//恢复设备上下文dc->SelectObject(pOldBrush);::DeleteObject(&NewPen);::DeleteObject(&NewBrush);OnPaint(dc);m_back = FALSE;
}void MySlider::SetPosxy()
{if (m_Slider_pos == 100){m_pos_rect.x = m_Slider_xy.x+m_Slider_len - (m_Slider_size + 6);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));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 ;
}///

MFC 进度条自绘按钮类相关推荐

  1. MFC进度条重绘 (CProgressCtrl)

    MFC进度条(CProgressCtrl) 重绘 先看一张图: 新建一个 继承自 CProgressCtrl 的类,然后添加 OnPaint 消息处理函数,此函数代码如下: void CNewProg ...

  2. MFC 进度条使用方法

    目的:学习MFC 进度条控件的用法: 步骤: 新建一个对话框项目.添加控件"progress""static"è改名了"进度",添加两个BU ...

  3. VC++ MFC进度条

    引用自:博客园 昵称:ike_li VC++ MFC进度条 1.常用函数 SetRange(0,100)设置范围: SetStep(int i)设置步长: StepIt():单步递增进度: int S ...

  4. MFC进度条编程控制

    1. 进度条的主要功能 进度条控制(Progress Control)主要用来进行数据读写.文件拷贝和磁盘格式等操作时的工作进度提示情况,如安装程序等,伴随工作进度的进展,进度条的矩形区域从左到右利用 ...

  5. MFC进度条控件颜色的设置

    平台:VS2013 内容介绍:创建进度条控件Progress Control控件并给它颜色的设置.在VC6.0里头可以直接用SendMessage函数就可以设置颜色了,但是在VS里头是不行的,要对进度 ...

  6. MFC进度条学习笔记

    最近工作中有使用到进度条的知识,就来学习学习这个控件~~ 先来看看想要达到的效果: 好的,现在开始正题. 我们这里的进度条,在程序里面叫做CProgressCtrl,它是继承自CWnd类的基础控件类, ...

  7. 控制 video 标签的控制栏组件(隐藏、显示进度条、播放按钮、全屏按钮等)

    当 video 标签添加上 controls 属性时,页面上会显示出所有的控制组件.若有些组件不需要只需要在css中设置相关属性把它隐藏掉即可. <video controls></ ...

  8. CSS_控制 video 标签的控制栏组件(隐藏、显示进度条、播放按钮、全屏按钮等)

    当 video 标签添加上 controls 属性时,页面上会显示出所有的控制组件.若有些组件不需要只需要在css中设置相关属性把它隐藏掉即可. <video controls></ ...

  9. matlab gui停止键,MATLAB GUI给进度条添加取消按钮来中途结束程序

    编写程序遇到的问题,中途关闭进度条会报错,加入这个取消代码就好了 %第一种 hWaitBar = waitbar(0, '请等待...', 'Name', '进度条', 'CreateCancelBt ...

最新文章

  1. 使用git进行源代码管理
  2. Maven中jar版本冲突问题的解决
  3. 牛腩知识小结-盒子模型
  4. java开发13寸_Java 从入门到进阶之路(二十九)
  5. socket io 不使用redis_为什么Redis单线程能够达到数十万、百万级的QPS?
  6. linux test 使用方法,Linux系统test命令使用方法介绍
  7. 安全问题汇总(一) 证书定期检查和及时更新
  8. Oracle 安全性一
  9. DFS序--树的问题转化为区间问题
  10. gaussian软件linux版本,Gaussian 09的版本与平台。
  11. 永久免费的内网端口映射工具推荐【无公网IP】
  12. 插件学习笔记:搜索引擎ElasticSearch
  13. 计算机在线给手机杀毒,手机在线杀毒,教您手机怎么杀毒
  14. 百宝云数组语法新手教程
  15. 各宽带接入服务商简称整理
  16. laravel查询指定的一列数据 pluck
  17. 模仿微信更改头像,图片局部放大
  18. 盘点 2021 年十大网络安全事件
  19. Android自定义View高级动效之---安卓流星雨动效|Android流星雨专辑封面
  20. Anaconda的卸载及安装(图文详解)

热门文章

  1. 将民族对应码转化为文字
  2. xlwings跨工作簿复制粘贴工作表——小白文章
  3. CODESYS学习手册
  4. 戴尔服务器安全模式进不去系统,安全模式进不去
  5. Oracle 中的一些函数
  6. 这几款效率神器,Windows装机必备
  7. 理解Servlet和Servlet容器、Web容器等概念
  8. Python Numpy 关于 linspace()函数 使用详解(全)
  9. (Ⅲ)使用七牛云作为图床获取外链方式总结(已更换为使用PicGO+腾讯云COS)
  10. Java挡板接小球游戏