如何自绘滚动条?

前几天,突然心血来潮,想做个自己的滚动条来玩玩,今天算完成个小样(注意是小样,所以代码写得不是很好,高手见谅,我只是看看要用到什么技术)。

效果图

刚开始我猜想可能要用到CScrollBar里面的函数,所以我就继承了它,生成派生类CScrollBarEx。等整个东西做下来发现,根本没有用到CScrollBar里面的函数,所以可以直接重CWnd派生。

技术细节:

在类的构造函数里,加载绘制状态栏要用到的图片,并且将它选入设备上下文。

 

响应WM_PAINT消息,自制滚动条的函数就在这里了

上面这个函数里,为防止画面闪烁用了双缓冲的绘图技术(名字挺高深的,其实就是在内存设备上下文里画图,然后用StretchBlt往屏幕设备上下文上贴图),里面还有个函数DrawScoreFrame(&dc);是画除去Thumb滚动条的其他部件的函数,该函数实现如下

好的,现在绘图就完毕了,现在是确定鼠标点击的是CScrollBarEx的什么位置了

下面这个函数是处理鼠标按下事件的,如果按下的是向上或者向下按钮,并且按住不放,那么Thumb必须连续移动,但是MFC是不处理按下不放的事件的,所以这里得设置一个定制器。还有个问题就是如果鼠标拖动Thumb,在拖动过程中鼠标移出了CScrollBarEx区域,MFC也不会处理鼠标移动事件的,这个问题困扰了好久,网上一查一个函数搞定了,就是用SetCapture();来捕捉消息。注意要在鼠标谈起的时候释放捕捉ReleaseCapture();否则你就等着抓狂吧,呵呵

下面这个函数就是定时器的处理函数了

下面这些就是余下的函数,较为简单这里就不解释了

OK,Enjoy your CScrollBarEx.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值