CBitmapSlider






4.87/5 (78投票s)
2003 年 8 月 27 日
4分钟阅读

297609

17744
一个具有滑块功能的 CStatic 派生类。它使用位图进行皮肤设置。

引言
您需要一个滑块,但默认控件看起来太简单了吗?我希望这个名为 CBitmapSlider 的类能帮到您。您所要做的就是阅读这篇文章并制作一些位图。
特点
- 通道和滑块都有透明效果。
- 自定义滑块的大小。
- 无闪烁。
它使用了 Keith Rule 文章中的 CMemDC 来实现双缓冲,并使用了 Raja Segar 文章中的函数来显示透明位图。
使用代码
- 将 "BitmapSlider.h", "BitmapSlider.cpp" 和 "memdc.h" 添加到您的项目中。
- 
将位图插入或导入到您的项目的资源中。一个滑块最多可以使用四张位图(通道、活动通道、滑块、活动滑块)。通过位图的各种组合,控件可以呈现不同的外观。但是,有一些限制。 - 通道位图和活动通道位图的大小必须相等。滑块位图和活动滑块位图的大小也必须相等。
- 滑块的大小必须小于通道的大小。
- 要使用活动状态的位图,必须存在普通状态的位图。
 
- 将控件添加到您的对话框资源中。可以使用 "Picture" 控件和 "Static Text" 控件。但如果您有通道的位图,我推荐使用 "Picture" 控件。如果您不使用通道的位图,请添加 "Static Text" 控件并确保将其大小调整为您想要的大小。     
- 更改属性。将控件的 ID 从默认值 ( IDC_STATIC) 更改为新的 ID。如果您添加了 "Picture" 控件,请将 "Type" 设置为 "Bitmap" 并选择您想要用作通道的位图的 ID 作为 "Image"。  确保选中了 "Notify"。 "Tabstop" 是可选的。   
- 为控件添加变量。使用 MFC ClassWizard (Ctrl+W) 添加成员变量,然后手动将 " CStatic" 更改为 "CBitmapSlider"。
- 插入代码以初始化控件。我推荐在 CDialog中使用OnInitDialog,在CFormView中使用OnInitUpdate。在 "成员函数" 部分有关于方法的详细文档。示例代码BOOL CMyDialog::OnInitDialog()() { ... m_Slider.SetBitmapChannel( IDB_CHANNEL, NULL, TRUE ); m_Slider.SetBitmapThumb( IDB_THUMB, IDB_THUMB_ACTIVE, TRUE ); m_Slider.SetRange( -30, 200 ); m_Slider.SetPos( -30 ); m_Slider.SetMarginLeft( 8 ); m_Slider.SetMarginRight( 8 ); ... }
- 实现消息处理程序。插入以下几行来实现消息处理程序。 - 在头文件中。afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); 
- 在消息映射中。ON_MESSAGE(WM_BITMAPSLIDER_MOVING, OnMyMessage) 
- 在源文件中。LRESULT CMyDlg::OnMyMessage(WPARAM wParam, LPARAM lParam) { ... }
 "通知消息" 部分解释了消息。 
- 在头文件中。
成员函数
- SetBitmapChannel- 加载通道的位图- BOOL SetBitmapChannel( UINT nChannelID, UINT nActiveID = NULL, BOOL bTransparent = FALSE, COLORREF clrpTransColor = 0xFF000000, int iTransPixelX = 0, int iTransPixelY = 0 );参数- nChannelID- 通道的位图资源的 ID 号。
- nActiveID- 活动通道位图资源的 ID 号。
- bTransparent-- TRUE以应用透明效果。
- clrpTransColor- 要视为透明的 RGB 颜色。
- iTransPixelX- 点的逻辑 x 坐标。其颜色将被视为透明。
- iTransPixelY- 点的逻辑 y 坐标。
 - 返回值 如果函数成功,则返回 - TRUE;否则返回- FALSE。
- SetBitmapThumb- 加载滑块的位图- BOOL SetBitmapThumb( UINT nThumbID, UINT nActiveID = NULL, BOOL bTransparent = FALSE, COLORREF clrpTransColor = 0xFF000000, int iTransPixelX = 0, int iTransPixelY = 0 );参数- nThumbID- 位图资源的 ID。
- nActiveID- 位图资源的 ID。
- bTransparent- TRUE 以应用透明效果。
- clrpTransColor- 要视为透明的 RGB 颜色。
- iTransPixelX- 点的逻辑 x 坐标。其颜色将被视为透明。
- iTransPixelY- 点的逻辑 y 坐标。
 - 返回值: 如果函数成功,则返回 - TRUE;否则返回- FALSE。
- SetRange- 设置滑块的范围(最小值和最大值)。- BOOL SetRange( int nMin, int nMax, BOOL bRedraw = FALSE );参数:- nMin- 滑块的最小位置。
- nMax- 滑块的最大位置。
- bRedraw- 设置范围后- TRUE以重绘。- FALSE仅更改范围。
 
- SetVertical- 将滑块设置为垂直或水平。- void SetVertical( BOOL bVertical = TRUE );参数:- bVertical-- TRUE设置为垂直。- FALSE设置为水平。
 
- SetMargin- 设置控件的边距。- void SetPos( int nLeft, int nTop, int nRight, int nBottom ); 参数:- nLeft- 指定新左边距的宽度(以像素为单位)。
- nTop- 指定新上边距的高度(以像素为单位)。
- nRight- 指定新右边距的宽度(以像素为单位)。
- nBottom- 指定新下边距的高度(以像素为单位)。
 
- SetPos- 设置滑块的当前位置。- void SetPos( int nPos ); 参数:- nPos- 指定新的滑块位置。
 
- SetPageSize- 设置控件的页面大小。- void SetPageSize( int nSize ); 参数:- nSize- 控件的新页面大小。
 - 返回值: 前一个页面大小。 
- GetRange- 获取滑块的最大和最小位置。- void GetRange( int& nMin, int& nMax ); 参数:- nMin- 接收最小位置的整数的引用。
- nMax- 接收最大位置的整数的引用。
 
- GetPos- 获取滑块的当前位置。- int GetPos();返回值: 当前位置。
- Enable- 启用或禁用控件。- void Enable( BOOL bEnable );参数:- bEnable-- TRUE以启用控件。- FALSE以禁用控件。
 
- DrawFocusRect- 指定是否绘制焦点矩形。- DrawFocusRect(BOOL bDraw, BOOL bRedraw); 参数:- bDraw-- TRUE绘制焦点矩形。- FALSE隐藏焦点矩形。
- bRedraw-- TRUE重绘状态已更改。- FALSE仅更改状态。
 
通知消息
- WM_BITMAPSLIDER_MOVING- 在拖动滑块时。- WM_BITMAPSLIDER_MOVING WPARAM wParam LPARAM lParam;参数:- wParam- 控件的 ID。
- lParam- 当前位置。
 
- WM_BITMAPSLIDER_MOVED- 拖动完成时。- WM_BITMAPSLIDER_MOVING WPARAM wParam LPARAM lParam;参数:- wParam- 控件的 ID。
- lParam- 当前位置。
 
待办事项
- 支持更改控件大小。
历史
- v1.5 (2003 年 9 月 16 日)- 键盘支持。
- 修复了一些错误。
 
- v1.0 (2003 年 8 月 28 日)- 双缓冲。
- 添加了透明效果。
- 支持垂直选项。
 
- v0.7 (2003 年 5 月 15 日)- 首次发布。
 
鸣谢
- Holger Persch - 提出了建议并教授了如何实现键盘支持。
- Nicolas Bonamy - 建议实现 OnDestroy 以分离位图。
