当前位置:网站首页>VS2019 MFC Slider Control 控件继承CSliderCtrl类重绘 自绘
VS2019 MFC Slider Control 控件继承CSliderCtrl类重绘 自绘
2022-07-18 01:52:00 【lzc881012】
Slider Control 控件自绘采用OnPaint方法进行自绘,自绘方式包括控件进度条自绘和控件把手自绘。
继承类redraw_slider.h头文件
#pragma once
#include "afxcmn.h"
class redraw_slider : public CSliderCtrl
{
public:
redraw_slider();
virtual ~redraw_slider() { delete_gdi_objs(); }
afx_msg void OnPaint();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()
public:
void set_bk_color(COLORREF bk) { m_dlg_bk_color = bk; }
void set_thumb_rate(float rate) { m_thumb_rate = rate; }
void set_thumb_colors(COLORREF out, COLORREF in, COLORREF highlight) { m_thumb_color = out; m_thumb_on_color = in; m_thumb_color = highlight; init_gdi_objs(); }
void set_channel_colors(COLORREF bk, COLORREF left) { m_channel_bk_color = bk; m_channel_left_color = left; init_gdi_objs(); }
private:
void init_gdi_objs();
void delete_gdi_objs();
void owner_draw(CDC* pDc);
void get_ellipse_rect(CRect& rect);
private:
COLORREF m_dlg_bk_color;
COLORREF m_channel_bk_color;
COLORREF m_channel_left_color;
COLORREF m_thumb_color;
COLORREF m_thumb_on_color;
COLORREF m_thumb_selected_color;
float m_thumb_rate;
BOOL thumb_down;
BOOL thumb_selected;
CPen pen_thumb_selected;
CPen pen_thumb;
CPen pen_thumb_on;
CBrush brush_thumb_selected;
CBrush brush_thumb;
CBrush brush_thumb_on;
};
继承类redraw_slider.cpp文件
#include"pch.h"
#include "redraw_slider.h"
#define SLIDER_BK_COLOR RGB(0,0,255)
#define SLIDER_LEFT_COLOR RGB(246, 179, 127)
#define SLIDER_THUMB_COLOR RGB(255,105,105)
#define SLIDER_THUMB_ON_COLOR RGB(0,255,0)
#define SLIDER_THUMB_SELECTED_COLOR RGB(210,105,30)
#define DLG_BK_COLOR RGB(240, 255, 255)
redraw_slider::redraw_slider()
{
m_dlg_bk_color = COLORREF(DLG_BK_COLOR);
m_channel_bk_color = COLORREF(SLIDER_BK_COLOR);
m_channel_left_color = COLORREF(SLIDER_LEFT_COLOR);
m_thumb_color = COLORREF(SLIDER_THUMB_COLOR);
m_thumb_on_color = COLORREF(SLIDER_THUMB_ON_COLOR);
m_thumb_selected_color = COLORREF(SLIDER_THUMB_SELECTED_COLOR);
m_thumb_rate = (float)0.6;
thumb_down = TRUE;
thumb_selected = TRUE;
init_gdi_objs();
}
void redraw_slider::init_gdi_objs()
{
pen_thumb_selected.CreatePen(PS_DASHDOTDOT, 2, m_thumb_selected_color);
pen_thumb.CreatePen(PS_DASHDOTDOT, 2, m_thumb_color);
pen_thumb_on.CreatePen(PS_DASHDOTDOT, 2, m_thumb_on_color);
brush_thumb_selected.CreateSolidBrush(m_thumb_selected_color);
brush_thumb.CreateSolidBrush(m_thumb_color);
brush_thumb_on.CreateSolidBrush(m_thumb_on_color);
}
void redraw_slider::delete_gdi_objs()
{
DeleteObject(pen_thumb_selected);
DeleteObject(pen_thumb);
DeleteObject(pen_thumb_on);
DeleteObject(brush_thumb_selected);
DeleteObject(brush_thumb);
DeleteObject(brush_thumb_on);
}
BEGIN_MESSAGE_MAP(redraw_slider, CSliderCtrl)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
void redraw_slider::OnPaint()
{
CSliderCtrl::OnPaint();
CDC* pDc = GetDC();
owner_draw(pDc);
ReleaseDC(pDc);
}
void redraw_slider::owner_draw(CDC* pDc)
{
CRect clientRect;
GetClientRect(clientRect);
CRect channelRect;
GetChannelRect(&channelRect);
CRect thumbRect;
GetThumbRect(thumbRect);
pDc->SetBkMode(TRANSPARENT);
pDc->FillSolidRect(clientRect, m_dlg_bk_color);
pDc->FillSolidRect(channelRect, m_channel_bk_color);
pDc->Draw3dRect(channelRect, m_channel_bk_color, m_channel_bk_color);
CRect leftRect;
leftRect.left = channelRect.left;
leftRect.top = channelRect.top;
leftRect.bottom = channelRect.bottom;
leftRect.right = thumbRect.left;
pDc->FillSolidRect(leftRect, m_channel_left_color);
pDc->Draw3dRect(leftRect, m_channel_left_color, m_channel_left_color);
CPen* oldpen;
CBrush* oldbrush;
if (thumb_down)
{
oldpen = pDc->SelectObject(&pen_thumb_selected);
oldbrush = pDc->SelectObject(&brush_thumb_selected);
}
else if (!thumb_down && thumb_selected)
{
oldpen = pDc->SelectObject(&pen_thumb_on);
oldbrush = pDc->SelectObject(&brush_thumb_on);
}
else
{
oldpen = pDc->SelectObject(&pen_thumb);
oldbrush = pDc->SelectObject(&brush_thumb);
}
get_ellipse_rect(thumbRect);
pDc->Rectangle(thumbRect);
pDc->SelectObject(oldpen);
pDc->SelectObject(oldbrush);
}
void redraw_slider::get_ellipse_rect(CRect& rect)
{
CPoint center = rect.CenterPoint();
int length = 0;
rect.Width() < rect.Height() ? length = (int)(rect.Height() * m_thumb_rate) : length = (int)(rect.Width() * m_thumb_rate);
rect.left = center.x - length / 2;
rect.right = center.x + length / 2;
rect.top = center.y - length / 2;
rect.bottom = center.y + length / 2;
}
void redraw_slider::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect thumbRect;
GetThumbRect(thumbRect);
get_ellipse_rect(thumbRect);
if (thumbRect.PtInRect(point) && !thumb_down)
{
thumb_down = TRUE;
InvalidateRect(thumbRect);
}
CSliderCtrl::OnLButtonDown(nFlags, point);
}
void redraw_slider::OnLButtonUp(UINT nFlags, CPoint point)
{
thumb_down = FALSE;
CSliderCtrl::OnLButtonUp(nFlags, point);
}
void redraw_slider::OnMouseMove(UINT nFlags, CPoint point)
{
CRect thumbRect;
GetThumbRect(thumbRect);
get_ellipse_rect(thumbRect);
BOOL inrect = thumbRect.PtInRect(point);
if (inrect != thumb_selected)
{
thumb_selected = inrect;
InvalidateRect(thumbRect);
}
CSliderCtrl::OnMouseMove(nFlags, point);
}

边栏推荐
- CH549/CH548学习笔记8 - USB Device中断处理
- CSGO突然返回桌面,并且其他应用无反应,如何不重启关闭
- 基于深度学习的人脸识别闸机开发(基于飞桨PaddlePaddle)
- All types of code after await are directly thrown into the micro task queue and executed later
- 啥是图神经网络?
- Software designer: 11 basic knowledge examples
- Read the paper: temporary graph networks for deep learning on dynamic graphs
- 1805. 字符串中不同整数的数目 ●
- Expressions régulières MySQL
- 干货!综合的公平冷启动推荐系统
猜你喜欢

Ugui source code analysis - rectmask2d

STM32中断梅开二度(一)

对象内存布局和synchronized锁升级

Thesis reading_ Medical NLP_ SMedBERT

Object memory layout and synchronized lock upgrade

Stm32+a4988 control stepper motor

劲旅环境深交所上市:市值50亿 于晓霞家族色彩浓厚
![[foundation of deep learning] how to understand the channel in convolutional neural network](/img/07/283c148fd470cdac0c7538f6d1ce50.png)
[foundation of deep learning] how to understand the channel in convolutional neural network

个人 IP 实验室周复盘 · 第 19 期

CH549/CH548学习笔记5 - SPI主模式
随机推荐
Explore Alibaba cloud IOT development board 1-haas 100
MySQL - unique key constraint for table fields
JVM performance tuning method
CH549/CH548学习笔记8 - USB Device中断处理
[foundation of deep learning] how to understand the channel in convolutional neural network
MySQL - 表索引概述
Nacos临时实例和永久实例的区别以及健康检查机制
论文阅读_医疗NLP_ SMedBERT
JMeter 21 天打卡 day10
Ch549/ch548 learning notes 7 - USB device initialization
Does flush mobile phone software need money to open an account online for stock speculation? Is it safe to open an account?
Ch549/ch548 learning notes 1 - hardware design
Leetcode 300: longest increasing subsequence
软件设计师:11-基础知识例题
模板的初识
Fiddler: add IP column
个人 IP 实验室周复盘 · 第 19 期
How do new shareholders open accounts online? Is it safe to open accounts online?
05.位图和比较器的简单应用
LeetCode 565 数组嵌套[dfs 记忆化] HERODING的LeetCode之路