CDoubleScrollBar:基于双精度值的滚动条






3.67/5 (2投票s)
2002年3月16日
2分钟阅读

62798

1313
一个简单的 CScrollBar 插件替代方案,它提供对双精度值的滚动直接访问。
引言
最近在我的毕业设计中添加滚动条后,我意识到我需要使用一个可以识别 double
值而不是 int
值的滚动条。 我查阅了 MSDN 档案,但找不到直接支持此功能的方法。 所以我决定编写自己的类,它派生自 CScrollBar
。
代码
阅读 MSDN 后,它告诉我 int
值的最大范围是 32767(我对此表示怀疑,因为它们的值是 32 位),因此我仅仅通过最大 int
值的数量将范围细分为 double
值。 此变量是可编辑的,在构造函数中定义了 nPrecision
。
以下方法被重写,在此处与原始的 int
形式进行了比较...
double CDoubleScrollBar::GetScrollLimit(); // Compared with ... int CScrollBar::GetScrollLimit();
double CDoubleScrollBar::GetScrollPos() const; // Compared with ... int CScrollBar::GetScrollPos() const;
void CDoubleScrollBar::GetScrollRange(double * dMinPos, double * dMaxPos); // Compared with ... void CScrollBar::GetScrollRange(LPINT lpMinPos,LPINT lpMaxPos) const;
double CDoubleScrollBar::SetScrollPos(double dPos, bool bRedraw = true); // Compared with ... int CScrollBar::SetScrollPos(int nPos,BOOL bRedraw = TRUE);
void CDoubleScrollBar::SetScrollRange(double dMinPos, double dMaxPos, bool bRedraw = true); // Compared with ... void CScrollBar::SetScrollRange(int nMinPos, int nMaxPos,BOOL bRedraw = TRUE);
注意:如果您希望获取关于滚动条的 double
值信息,请不要尝试使用 GetScrollInfo()
和 SetScrollInfo()
。 这些方法没有被重写,并返回原始的 int
值。
为了提供 Get/SetScrollInfo()
丢失的功能,我编写了三种方法,这使得更改滚动条更容易。
double CDoubleScrollBar::GetPageSize(); void CDoubleScrollBar::SetPageSize(double dPageSize,bool bRedraw); double CDoubleScrollBar::GetTrackPos();
double CDoubleScrollBar::GetPageSize();
. 这返回页面大小(您拖动的块)的 double
值。 这将替换代码段...
SCROLLINFO siTemp;
m_ScrollBar.GetScrollInfo(&siTemp,SIF_PAGE);
int nPageSize = siTemp.nPage;
void CDoubleScrollBar::SetPageSize(double dPageSize,bool bRedraw);
。 这设置页面大小,并在 bRedraw
为 true
时导致滚动条被重绘。 这将替换代码段...
SCROLLINFO siTemp; siTemp.nPage = nPageSize; siTemp.fMask = SIF_PAGE; m_ScrollBar.SetScrollInfo(&siTemp, bRedraw);
double CDoubleScrollBar::GetTrackPos();
。 当用户正在跟踪 (SB_THUMBTRACK
) 时,这返回滚动条的位置。 当用户未跟踪时使用此方法会导致不可预测的输出。 它替换了代码段(在 OnHScroll()
/OnVScroll()
中找到)...
SCOLLINFO siTemp;
m_ScrollBar.GetScrollInfo(&siTemp,SIF_TRACKPOS);
int nCurrentTrackPos = siTemp.nTrackPos;
在您的项目中实现此代码非常简单。 只需将 .cpp 和 .h 文件添加到您的项目中,在将使用 DoubleScrollBars 的 .h 文件中 #include "DoubleScrollBar.h"
,然后创建即可。
限制
主要的限制是您(目前)无法将 CDoubleScrollBar
的成员值创建为 double
,并且您必须使用额外的函数来克服缺少 DOUBLESCROLLINFO
结构的问题。
请在此处发表评论并发送错误报告/修复 &| 至 dbh@cs.stir.ac.uk。
享受。