MyException - 我的异常网
当前位置:我的异常网» VC/MFC » Visual C++中轻松实现透明滑动控件,该如何处理

Visual C++中轻松实现透明滑动控件,该如何处理

www.MyException.Cn  网友分享于:2013-01-07  浏览:27次
Visual C++中轻松实现透明滑动控件
滑动控件是Windows中最常用的控件之一。一般而言它是由一个滑动条,一个滑块和可选的刻度组成,用户可以通过移动滑块在相应的控件中显示对应的值。通常,在滑动控件附近一定有标签控件或编辑框控件,用于显示相应的值。滑动控件在应用程序中用途级为广泛,如在桌面的属性中就可以看到。本实例借鉴透明位图的显示方法,实现了滑动控件的透明效果,程序编译运行后的界面效果如图一所示:
图一、透明滑动条效果图     图示链接如下:http://develop.csai.cn/c/images/200610108382.jpg

一、实现方法

  在介绍如何实现透明的滑动条之前,先介绍一下滑动条的基本操作。滑动条控制(Slider   Control)也叫轨道条控制,其主要是用一个带有轨道和滑标的小窗口以及窗口上的刻度,来让用户选择一个离散数据或一个连续的数值区间。滑动条既可以是水平方式的也可以是垂直方式的。滑动条控制的风格如下:

  ·TBS_HORZ   滑动条是水平方向的
  ·TBS_VERT   滑动条是垂直方向的
  ·TBS_LEFT   滑动条位于窗口左侧
  ·TBS_RIGHT   滑动条位于窗口右侧
  ·TBS_TOP   滑动条位于窗口顶部
  ·TBS_BOTTOM   滑动条位于窗口底部
  ·TBS_BOTH   滑动条位于窗口两侧
  ·TBS_AUTOTICKS滑动条具有刻度,默认
  ·TBS_NOTICKS   滑动条不具有刻度

  滑动条的刻度条在每一个数值位置显示一个刻度标记,如果在滑动条上显示某一数值选择区间,则应使用风格TBS_ENABLESELRANGE,此时选择区间两个不再是刻度标记,而是一个小的三角形符号。另外,使用风格TBS_NOTHUMB会使滑标消隐起来。

  滑动条控制在MFC类库中被封装为CSliderCtrl控制,其主要操作是设置刻度范围、绘制刻度标记、设置选择范围和当前滑标位置等。当用户进行交互操作时,滑动条控制将向其父窗口发送消息WM_HSCROLL,所以在应用程序中应重载父窗口的OnHScroll()成员函数,以便对消息进行正确处理。由于考虑到和水平卷动杆公用同一个成员函数,OnHScroll()函数参数表中的指针变量被定义为CScrollBar*类型,而实际上消息是由滑动条产生的,所以在程序中必须把这个指针变量强制转换为CSliderCtrl*类型。滑动条和卷动杆的消息代码和含义都非常类似如TB_BOTTOM等,所以这种处理方法比较合理。SetRange()函数用来设置范围,SetPos()函数用来设置当前位置。

  滑动条控制的创建方法是首先建立滑动条控制对象,然后使用Create()函数建立滑动条控制并绑定到该对象。滑动条控制类CSliderCtrl::Create()函数的调用格式如下:

BOOL   Create(   DWORD   dwStyle,   const   RECT&   rect,   CWnd*   pParentWnd,   UINT   nID   );  

  其中参数dwStyle用来确定滑动条控制风格;参数rect用来确定滑动条控制的大小和位置;参数pParentWnd用来确定滑动条控制的父窗口指针;参数nID用来确定滑动条控制的控制符ID怠?BR>
  滑动条控制对象类的属性方法包括取得滑动条大小GetLineSize()、设置滑动条大小SetLineSize()、取得滑动条页大小GetPageSize()、设置滑动条页大小SetPageSize()、取得滑动条最大位置GetRangeMax()、取得滑动条最小位置GetRangeMin()、取得滑动条范围GetRange()、设置滑块最小位置SetRangeMin()、设置滑块最大位置SetRangeMax()、设置滑动条范围SetRange()、取得滑块当前位置GetSelection()、设置滑块当前位置SetSelection()、取得滑动条当前位置GetPos()和设置滑动条当前位置SetPos()等。

  滑动条控制的操作方法包括清除滑动条当前选择ClearSel()、验证滑动条当前位置是否在最大最小位置之间VerifyPos()、设置滑动条刻度的频度SetTicFreq()、在指定的位置设置刻度SetTic()和清除当前刻度标志ClearTics()等。

  讲述了滑动条控件的基本操作后,我们来介绍如何实现透明的滑动条。对于透明的滑动条控件来说,操作上并没有发生任何变化,发生变化的仅仅是它的外关而已。为了达到控件的透明效果,本实例定义了一个CSliderCtrl类的子类CmySliderControl,并在该类中重载了CSliderCtrl控件的NM_CUSTOMDRAW消息响应函数来实现透明效果的绘制工作。滑动条控件以WM_NOTIFY的形式发送该消息给其父窗口,通知其要进行外观的绘制操作。其消息映射和响应函数分别如下:

  ON_NOTIFY_REFLECT(NM_CUSTOMDRAW,   OnCustomDraw)
  void   CMySliderControl::OnCustomDraw(NMHDR*   pNMHDR,   LRESULT*   pResult)  

  在消息响应函数中,参数pResult将传递给控件的父窗口,而参数pNMHDR指针指向了一个NMCUSTOMDRAW结构,该结构定义如下:

  typedef   struct   tagNMCUSTOMDRAWINFO  
  {
   NMHDR   hdr;//含有通知信息的NMHDR结构;
   DWORD   dwDrawStage;   //目前绘制的步骤;
   HDC   hdc;   //设备上下文句柄;
   RECT   rc;   //绘制的区域;
   DWORD   dwItemSpec;   //绘制项目条的说明;
   UINT   uItemState;//当前项目条的状态
   LPARAM   lItemlParam;//应用程序规定的数据;
  }  
  NMCUSTOMDRAW,   FAR   *   LPNMCUSTOMDRAW;  

  从上述结构我们可以得到这么一个绘制透明控件的思路,首先判断当前绘制步骤是否处于准备绘制阶段,也既是NMCUSTOMDRAW   结构对象的成员变量dwDrawStage是否等于CDDS_PREPAINT,如是,pResult的返回值将是CDRF_NOTIFYITEMDRAW,这个返回值的意思是该控件将向父窗口发送所有与绘制相关的操作;如果成员变量dwDrawStage等于CDDS_ITEMPREPAINT,也就是说当前滑动控件处于具体项目的绘制准备阶段,那么就判断当前滑动控件要绘制的是滑动控件的轨道还是滑动控件的滑标(滑动控件由三个部分组成,轨道、滑标和刻度,在实现透明的滑动控件时我们可以不用考虑其刻度问题),如果NMCUSTOMDRAW对象的成员变量dwItemSpec   等于TBCD_THUMB,那末表示将要绘制的滑动控件的项目是滑标,此时可以让pResult返回CDRF_DODEFAULT,通知其父窗口自己将绘制自己本身,此次绘制循环不再发送任何消息。如果dwItemSpec等于TBCD_CHANNEL,表示即将绘制滑动控件的轨道,此时,也就是我们大显身手实现透明的时候了,具体如何实现透明的效果,请参考《实例:透明位图的实现》,处理完透明显示效果后,不要忘记让pResult返回 "0 "



------解决方案--------------------
up!
------解决方案--------------------
收藏 备用

文章评论

Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序员应该关注的一些事儿
程序员应该关注的一些事儿
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
编程语言是女人
编程语言是女人
中美印日四国程序员比较
中美印日四国程序员比较
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
鲜为人知的编程真相
鲜为人知的编程真相
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
10个调试和排错的小建议
10个调试和排错的小建议
旅行,写作,编程
旅行,写作,编程
一个程序员的时间管理
一个程序员的时间管理
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员必看的十大电影
程序员必看的十大电影
程序员都该阅读的书
程序员都该阅读的书
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序员的鄙视链
程序员的鄙视链
程序员和编码员之间的区别
程序员和编码员之间的区别
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
 程序员的样子
程序员的样子
那些争议最大的编程观点
那些争议最大的编程观点
我是如何打败拖延症的
我是如何打败拖延症的
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
我的丈夫是个程序员
我的丈夫是个程序员
代码女神横空出世
代码女神横空出世
为什么程序员都是夜猫子
为什么程序员都是夜猫子
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
老程序员的下场
老程序员的下场
Java程序员必看电影
Java程序员必看电影
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
总结2014中国互联网十大段子
总结2014中国互联网十大段子
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
每天工作4小时的程序员
每天工作4小时的程序员
漫画:程序员的工作
漫画:程序员的工作
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有