CSliderCtrl自绘开发
来源:互联网 发布:java给qq邮箱发邮件 编辑:程序博客网 时间:2024/06/05 19:21
效果:
鼠标热点(黄色):
代码下载:点击打开链接
1、首先说一下,当我们拖动滑块控件时,滑块控件的响应函数:1)当滑块是横向滑块时,为滑块父窗口的WM_HSCROLL消息添加响应函数;2)当滑块是竖向滑块时,为滑块父窗口的WM_VSCROLL消息添加响应函数。
2、自绘原理:创建一个CSliderCtrl的派生类:CMySliderCtrl;建立一个派生类类型的控件变量:CMySliderCtrl m_Slider;。
3、自绘操作是在派生类中进行,涉及到的主要函数有:
public:BOOL m_bTrack;afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg void OnMouseMove(UINT nFlags, CPoint point);afx_msg void OnPaint();afx_msg BOOL OnEraseBkgnd(CDC* pDC);
实现如下:
// MySliderCtrl.cpp : 实现文件//#include "stdafx.h"#include "CSliderCtrl自绘.h"#include "MySliderCtrl.h"// CMySliderCtrlIMPLEMENT_DYNAMIC(CMySliderCtrl, CSliderCtrl)CMySliderCtrl::CMySliderCtrl(){m_bTrack = FALSE;}CMySliderCtrl::~CMySliderCtrl(){}BEGIN_MESSAGE_MAP(CMySliderCtrl, CSliderCtrl)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_WM_PAINT()ON_WM_ERASEBKGND()ON_WM_HSCROLL()END_MESSAGE_MAP()// CMySliderCtrl 消息处理程序void CMySliderCtrl::OnLButtonDown(UINT nFlags, CPoint point){CRect rcTotal,rcThumb,rcEdge;GetClientRect(&rcTotal);GetThumbRect(&rcThumb);rcEdge = rcThumb;rcEdge.InflateRect(8,2);//绘制滑块外边矩形//以滑块为研究对象int nLength = rcTotal.Width()-rcEdge.Width();//滑块可以移动的最大范围//将单击的位置转换为滑块上的刻度:int nPos,nMin,nMax;GetRange(nMin,nMax);nPos = point.x* (nMax - nMin)/nLength - 8 *(nMax - nMin)/nLength;TRACE("nMax=%d,nMin=%d,nLength=%d,point.x=%d,nPos=%d\r\n",nMax,nMin,nLength,point.x,nPos);SetPos(nPos);m_bTrack = TRUE;Invalidate(FALSE);CSliderCtrl::OnLButtonDown(nFlags, point);}void CMySliderCtrl::OnLButtonUp(UINT nFlags, CPoint point){CRect rcThumb;GetThumbRect(&rcThumb);//获得滑块的矩形大小m_bTrack = rcThumb.PtInRect(point);Invalidate(FALSE);CSliderCtrl::OnLButtonUp(nFlags, point);}void CMySliderCtrl::OnMouseMove(UINT nFlags, CPoint point){CRect rcThumb;GetThumbRect(&rcThumb);//获得滑块的矩形大小BOOL bTrack;if (nFlags & MK_LBUTTON){bTrack = TRUE;}else{if (rcThumb.PtInRect(point)){bTrack = TRUE;}else{bTrack = FALSE;}}if (m_bTrack != bTrack){m_bTrack = bTrack;}//TRACE("trach=%d\r\n",m_bTrack);Invalidate(FALSE);CSliderCtrl::OnMouseMove(nFlags, point);}void CMySliderCtrl::OnPaint(){CPaintDC dc(this); CRect rcTotal;GetClientRect(&rcTotal);int nCurPos = 0,nMin = 0,nMax = 0;nCurPos = GetPos();GetRange(nMin,nMax);//绘制滑过的区域CRect rcDraw = rcTotal;rcDraw.right = nCurPos * rcTotal.Width()/(nMax - nMin);dc.FillSolidRect(&rcDraw,RGB(148,250,148));//绘制剩下没滑过的区域rcDraw.left = rcDraw.right;rcDraw.right = rcTotal.right;dc.FillSolidRect(&rcDraw,RGB(132,174,148));CRect rcThumb,rcEdge;GetThumbRect(&rcThumb);//得到滑块的位置CBrush br;if(m_bTrack) br.CreateSolidBrush(RGB(247,166,8));//热点颜色else br.CreateSolidBrush(RGB(82,215,33));//非热点颜色dc.SelectObject(&br);CPen pen(PS_SOLID,1,RGB(0,128,0));dc.SelectObject(&pen);rcEdge = rcThumb;rcEdge.InflateRect(8,2);//绘制滑块外边矩形dc.RoundRect(&rcEdge,CPoint(10,10));dc.FillSolidRect(&rcThumb,RGB(200,100,100));//绘制滑块}BOOL CMySliderCtrl::OnEraseBkgnd(CDC* pDC){return TRUE;//停止刷新背景,防止闪烁//return CSliderCtrl::OnEraseBkgnd(pDC);}
阅读全文
0 0
- CSliderCtrl自绘开发
- CSliderCtrl自绘
- 【MFC】控件自绘之CSliderCtrl
- 滑动控件(CSliderCtrl)的自绘方法引导
- MFC常用控件CListCtrl 、CSliderCtrl、CToolTipCtrl、CTreeCtrl的自绘
- MFC常用控件CListCtrl 、CSliderCtrl、CToolTipCtrl、CTreeCtrl的自绘
- MFC常用控件CListCtrl、CSliderCtrl、CToolTipCtrl、CTreeCtrl的自绘
- 在自绘CListCtrl控件中添加CSliderCtrl控件
- CSliderCtrl
- CSliderCtrl
- CSliderCtrl
- 【VS开发】MFC滑动条 CSliderCtrl
- CSliderCtrl的自绘制和鼠标定位滑块
- CSliderCtrl 总论
- CSliderCtrl::ClearSel
- CSliderCtrl::ClearTics
- csliderctrl详解
- CSliderCtrl::SetPageSize
- sql server charindex函数和patindex函数详解(转)
- 【云栖大会】阿里云联合中科院量子创新研究院发布量子计算云平台
- Oracle的关于建表,约束,查询等的练习
- 机器学习技法课程学习笔记16 -- Finale
- Android studio导入项目后无法运行并且所有文件都处于禁止状态
- CSliderCtrl自绘开发
- 设计模式_12:状态模式
- jquery插件封装指南
- python_pandas_dataframe_行列选择_切片操作
- Oracle 树操作、递归查询(select…start with…connect by…prior)
- VMware-workstation官方直接下载地址
- 了解Linux的目录结构
- 【云栖大会】阿里成立达摩院,学习别人的经验走自己的路解决未来问题
- 【Spring】使用Spring的AbstractRoutingDataSource实现多数据源切换