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 以分离位图。