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

引言
我最近的一个项目需要美化 UI,但当应用程序不能在 WinXP 上运行时,常用控件的内置滚动条就显得太丑陋了。所以我使用了自绘 CScrollWnd
代替。
目前仅支持 VSCROLL
。HSCROLL
会在有时间的时候添加,并且任何帮助都将不胜感激(您可以自行添加)。
技巧
实现滚动条的最大问题是正确定位滑块。为了解决这个问题,我尝试了许多方法,但最终发现了一种非常方便可靠的方法:逐步逼近法。
代码
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 日:初始发布