MFC 滑动条的重绘

MFC自带的滑动条的样子是这样的。

比较难看,所以需要重绘下,重绘后的样子是这样的。

代码如下:

CustomSliderCtr.h

#pragma once


// CCustomSliderCtr

class CCustomSliderCtr : public CSliderCtrl
{
    DECLARE_DYNAMIC(CCustomSliderCtr)

public:
    CCustomSliderCtr();
    virtual ~CCustomSliderCtr();

protected:
    afx_msg void OnPaint();
  afx_msg void OnLButtonDown(UINT nFlags, CPoint point) ;
void CustDraw(CDC *pDc); DECLARE_MESSAGE_MAP() };

CustomSliderCtr.cpp

// CustomSliderCtr.cpp : 实现文件
//

#include "stdafx.h"
#include "CustomSliderCtr.h"


// CCustomSliderCtr

IMPLEMENT_DYNAMIC(CCustomSliderCtr, CSliderCtrl)

CCustomSliderCtr::CCustomSliderCtr()
{

}

CCustomSliderCtr::~CCustomSliderCtr()
{
}


BEGIN_MESSAGE_MAP(CCustomSliderCtr, CSliderCtrl)
    ON_WM_PAINT()
	ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()



// CCustomSliderCtr 消息处理程序

void CCustomSliderCtr::OnPaint()
{
    CSliderCtrl::OnPaint();
    CDC *pDc = GetDoc();
    CustDraw(pDc);
}

void CCustomSliderCtr::CustDraw(CDC *pDc)
{

    COLORREF colorLeft(SLIDER_LEFT_COLOR);

    COLORREF colorChannel(SlIDER_BK_COLOR);
    CPen penChannel(PS_DASHDOTDOT, 2, colorChannel);
    CBrush brushChannel;
    brushChannel.CreateSolidBrush(colorChannel);

    COLORREF colorThumb(SLIDER_THUMB_COLOR);
    CPen penThumb(PS_DASHDOTDOT, 2, colorThumb);
    CBrush brushThumb;
    brushThumb.CreateSolidBrush(colorThumb);


    CRect clientRect;
    GetClientRect(clientRect);
    
    CRect channelRect;
    GetChannelRect(&channelRect);
     
    //clientRect.bottom /= 2; 

    pDc->SetBkMode(TRANSPARENT);

    pDc->FillSolidRect(clientRect, DIALOG_BKCOLOR);
    
    clientRect.left = channelRect.left;
    clientRect.right = channelRect.right;
    
    pDc->FillSolidRect(clientRect, colorChannel);

    pDc->Draw3dRect(clientRect, colorChannel, colorChannel);

    CRect thumbRect;
    GetThumbRect(thumbRect);
    
    thumbRect.bottom *= 2;

    CRect leftRect;
    leftRect.left = clientRect.left;
    leftRect.top = clientRect.top;
    leftRect.bottom = clientRect.bottom;
    leftRect.right = thumbRect.left;

    
    pDc->SelectObject(&brushThumb);
    pDc->SelectObject(&penThumb);

    pDc->FillSolidRect(leftRect, colorLeft);

    pDc->Draw3dRect(leftRect, colorLeft, colorLeft);

    pDc->Ellipse(thumbRect);
}

void CCustomSliderCtr::OnLButtonDown(UINT nFlags, CPoint point)   
{  
    CSliderCtrl::OnLButtonDown(nFlags, point);  
    CRect   rectClient,rectChannel;   
    GetClientRect(rectClient);   
    GetChannelRect(rectChannel);   
    int nMax = 0;  
    int nMin = 0;  
    GetRange(nMin,nMax);  
    int nPos = (nMax - nMin)*(point.x - rectClient.left - rectChannel.left)/(rectChannel.right - rectChannel.left);   
    SetPos(nPos);  
}  

 

 其中颜色定义

#define SlIDER_BK_COLOR RGB(192, 192, 192)
#define SLIDER_LEFT_COLOR RGB(148, 40, 255)
#define SLIDER_THUMB_COLOR RGB(240, 240, 240)
#define DIALOG_BKCOLOR RGB(201,227,253)

 

转载于:https://www.cnblogs.com/ahcc08/p/6253819.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC的ListCtrl控件重绘是指在ListCtrl控件的显示区域需要进行重新绘制时,通过调用相关的函数来实现界面的更新和刷新。ListCtrl重绘可以分为两种情况:自动重绘和手动重绘。 自动重绘是指当ListCtrl控件的状态或内容发生改变时,系统会自动触发重绘操作。例如,当用户对ListCtrl进行增删改操作,或者ListCtrl接收到数据更新的消息时,系统会在适当的时候自动进行重绘,更新界面显示的内容。这种情况下,程序员只需确保控件的状态或内容正确,不需要手动干预重绘操作。 手动重绘是指在某些特殊情况下,程序员需要手动调用相关的函数来进行重绘操作。例如,当ListCtrl控件的背景颜色需要更改,或者需要添加特定的绘制效果时,就需要手动重绘。手动重绘的方法通常是通过重载ListCtrl的绘制函数,如OnPaint或OnCustomDraw,然后在函数内部手动调用相关的绘制函数和绘制参数来实现重绘的效果。 无论是自动重绘还是手动重绘,都需要注意一些细节。首先,要确保在进行重绘操作时,不要对ListCtrl的数据进行修改,否则可能会导致不可预料的错误。其次,要注意控件的重绘区域,即只对需要重新绘制的区域进行操作,以提高绘制的效率。最后,要正确处理重绘操作的时机,避免过多的重复绘制,以提高程序的运行效率。 总的来说,ListCtrl重绘可以通过自动重绘和手动重绘两种方式来实现,具体的方法和操作根据具体需求和情况进行选择和调整。重绘操作的目的是为了实现界面的更新和刷新,提高用户体验和界面的美观性。 ### 回答2: MFC ListCtrl控件的重绘可以通过一些方法来实现。 首先,我们可以通过重新绘制列表的背景色来改变其外观。可以通过在ListCtrl的 WM_ERASEBKGND 消息中处理。在该消息的处理函数中,可以使用 CDC::FillSolidRect() 函数来绘制背景色。 其次,我们可以重写 CListCtrl 类的 DrawItem() 函数来自定义列表项的绘制。在这个函数中,可以根据需要绘制每一项的不同外观,例如不同的背景色、前景色等。我们可以使用 CDC::FillSolidRect() 函数来进行绘制。 另外,我们还可以通过重写 CListCtrl 类的 OnPaint() 函数来实现列表控件的重绘。在这个函数中,可以进行自定义绘制,例如绘制不同背景色、边框等。我们可以使用 CDC::FillSolidRect() 函数来进行绘制。 最后,我们也可以通过调用 CListCtrl 类的 Invalidate() 函数来强制重绘列表控件。可以在需要重绘的地方调用这个函数,然后通过处理 WM_PAINT 消息来进行重绘。 总之,MFC ListCtrl控件的重绘可以通过重写 DrawItem() 函数、OnPaint() 函数,处理 WM_ERASEBKGND 消息,以及调用 Invalidate() 函数来实现。我们可以根据需求选择适合的方法来实现列表控件的重绘

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值