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

为 listctrl、listbox 等添加 XP 风格滚动条(通过自绘)

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.61/5 (13投票s)

2005年3月8日

CPOL
viewsIcon

182720

downloadIcon

1942

通过自绘实现 XP 样式滚动条

Sample Image - self-draw_XPScrollbar.jpg

引言

我最近的一个项目需要美化 UI,但当应用程序不能在 WinXP 上运行时,常用控件的内置滚动条就显得太丑陋了。所以我使用了自绘 CScrollWnd 代替。

目前仅支持 VSCROLLHSCROLL 会在有时间的时候添加,并且任何帮助都将不胜感激(您可以自行添加)。

技巧

实现滚动条的最大问题是正确定位滑块。为了解决这个问题,我尝试了许多方法,但最终发现了一种非常方便可靠的方法:逐步逼近法。

代码

void CScrollWnd::MoveThumb(CPoint ptOffset)

{ if(!IsMouseInRange(WM_VSCROLL))
  return;
 CPoint ptCursor;
 GetCursorPos(&ptCursor);
 ScreenToClient(&ptCursor); 

 CPoint ptCurPos = ptCursor;
 int nMaxTimes=200;

 int nTimes = 0;
 int nStep = 1;//accuracy

 CPoint ptNewPos = ptOffset + GetRect(HT_THUMB).CenterPoint();
 while(abs(ptNewPos.y - ptCurPos.y)>nStep && nTimes++<nMaxTimes)
 {
  BOOL bDirDown = ptCurPos.y>ptNewPos.y;
  NotifyBuddy(WM_VSCROLL,MAKEWPARAM(bDirDown?SB_LINEDOWN:SB_LINEUP,0));
  
  UpdateScrollBar();
  ptNewPos = ptOffset + GetRect(HT_THUMB).CenterPoint();
 }
}

更多细节请参见附带的源代码。

抱歉我的英语不好。我的母语是中文。:)

历史

  • 2005 年 3 月 8 日:初始发布
© . All rights reserved.