65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.67/5 (2投票s)

2002年3月16日

2分钟阅读

viewsIcon

62798

downloadIcon

1313

一个简单的 CScrollBar 插件替代方案,它提供对双精度值的滚动直接访问。

A Demo progam using CDoubleScrollBar

引言

最近在我的毕业设计中添加滚动条后,我意识到我需要使用一个可以识别 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);。 这设置页面大小,并在 bRedrawtrue 时导致滚动条被重绘。 这将替换代码段...

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

享受。

© . All rights reserved.