建立一个CSliderCtrl

 m_slider.Create(WS_CHILD|TBS_HORZ|TBS_AUTOTICKS|TBS_BOTTOM,CRect(0,0,0,0),this,IDC_SLIDER1);
 m_slider.SetRange(0,100);
 m_slider.SetPos(100);


 m_slider.SetTicFreq(10);//设置刻度的显示距离

A:可以通过控件的 WM_NOTIFY 消息以及自定义绘制 CSliderCtrl 的方式来实现多个颜色的绘制。具体操作步骤如下: 1. 继承自 CSliderCtrl,并在构造函数中启用自定义绘制: ``` class CMySliderCtrl : public CSliderCtrl { public: CMySliderCtrl(); virtual ~CMySliderCtrl(); DECLARE_MESSAGE_MAP() protected: afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult); }; CMySliderCtrl::CMySliderCtrl() { ModifyStyle(0, TBS_OWNERDRAWFIXED); } CMySliderCtrl::~CMySliderCtrl() { } BEGIN_MESSAGE_MAP(CMySliderCtrl, CSliderCtrl) ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CMySliderCtrl::OnCustomDraw) END_MESSAGE_MAP() ``` 2. 重载 OnCustomDraw 函数进行自定义绘制。在 OnCustomDraw 函数中,我们可以根据控件的当前位置及范围计算出当前的值,并根据这个值来确定需要绘制的颜色: ``` void CMySliderCtrl::OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult) { LPNMCUSTOMDRAW pNMCD = (LPNMCUSTOMDRAW)pNMHDR; if (pNMCD->dwDrawStage == CDDS_PREPAINT) { *pResult = CDRF_NOTIFYITEMDRAW; return; } if (pNMCD->dwDrawStage == CDDS_ITEMPREPAINT) { CDC *pDC = CDC::FromHandle(pNMCD->hdc); CRect rcItem = pNMCD->rc; int nMin, nMax, nPos; // 获取当前值 GetRange(nMin, nMax); nPos = GetPos(); // 绘制背景 pDC->FillSolidRect(rcItem, RGB(255, 255, 255)); // 绘制前半部分颜色 CRect rcLeft = rcItem; rcLeft.right = rcItem.left + (rcItem.right - rcItem.left) * nPos / (nMax - nMin); pDC->FillSolidRect(rcLeft, RGB(0, 255, 0)); // 绘制后半部分颜色 CRect rcRight = rcItem; rcRight.left = rcLeft.right; pDC->FillSolidRect(rcRight, RGB(255, 0, 0)); *pResult = CDRF_SKIPDEFAULT; return; } *pResult = CDRF_DODEFAULT; } ``` 在上面的代码中,我们先判断了消息的阶段(CDDS_PREPAINT 表示预处理阶段,CDDS_ITEMPREPAINT 表示自定义绘制阶段)。在自定义绘制阶段,我们先获取当前值,然后绘制背景和两个不同颜色的部分。最后返回 CDRF_SKIPDEFAULT 表示跳过默认的绘制过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值