Windows API学习之滚动条系列函数

本文详细介绍了Windows API中关于滚动条的两个核心函数SetScrollInfo和GetScrollInfo的使用方法及参数含义,并提供了实例代码来展示如何设置和获取滚动条的各种信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:朱金灿
来源:http://blog.youkuaiyun.com/clever101


Windows API中滚动条相关函数有两个:
int SetScrollInfo(
HWND hwnd,
int fnBar,
LPSCROLLINFO lpsi,
BOOL fRedraw
);

BOOL GetScrollInfo(
HWND hwnd,
int fnBar,
LPSCROLLINFO lpsi
);


见名知意,SetScrollInfo就是用来设置窗口的滚动信息,GetScrollInfo就是用来获取窗口的滚动信息。SetScrollInfo的参数含义如下:
参数 意义
hwnd
滚动条控件的句柄或带有标准滚动栏的窗口的句柄
fnBar
用于指定哪一种滚动条,只能是下面的值之一:
SB_CTL :滚动条控件
SB_HORZ:水平滚动条
SB_VERT:垂直滚动条
lpsi
滚动条信息结构体指针。下面作进一步详细介绍。
fRedraw 值为TRUE表示要Windows重新绘制计算了新信息后的滚动条,FALSE表示不绘制。

GetScrollInfo的参数含义如下:

参数 意义
hwnd
滚动条控件的句柄或带有标准滚动栏的窗口的句柄
fnBar
用于指定哪一种滚动条,只能是下面的值之一:
SB_CTL :滚动条控件
SB_HORZ:水平滚动条
SB_VERT:垂直滚动条
lpsi
滚动条信息结构体指针。下面作进一步详细介绍。

值得注意的是在调用GetScrollInfo函数时要获取相关滚动信息,需要指定SCROLLINFO结构体中的fMask成员的值。fMask取下面的值的组合值:
值 意义
SIF_PAGE 获取SCROLLINFO中的nPage成员的值(即一页的大小)。
SIF_POS 获取SCROLLINFO中的nPos成员的值。
SIF_RANGE
获取SCROLLINFO中的nPos成员的nMin 和 nMax的值。
SIF_TRACKPOS
获取SCROLLINFO中的nTrackPos成员的值。
nTrackPos
SIF_RANGE、SIF_POS、SIF_PAGE和SIF_TRACKPOS的组合。

使用例程(据petzod的《windows程序设计》第四章,仅列出主要代码片段,具体请下载源码):


  1. caseWM_SIZE:
  2. {
  3. //savethewidthandheightofwindowwhenchangedthesizeofwindow
  4. cxClient=LOWORD(lp);//thewidth
  5. cyClient=HIWORD(lp);//theheight
  6. //setverticalscrollbarrangeandpagesize
  7. si.cbSize=sizeof(SCROLLBARINFO);
  8. si.fMask=SIF_RANGE|SIF_PAGE;
  9. si.nMin=0;
  10. si.nMax=NUMLINES-1;
  11. si.nPage=cyClient/cyChar;
  12. SetScrollInfo(hWnd,SB_VERT,&si,TRUE);
  13. //sethorizontalscrollbarandpagesize
  14. si.cbSize=sizeof(SCROLLBARINFO);
  15. si.fMask=SIF_RANGE|SIF_PAGE;
  16. si.nMin=0;
  17. si.nMax=2+nMaxWidth/cxChar;
  18. si.nPage=cxClient/cxChar;
  19. SetScrollInfo(hWnd,SB_HORZ,&si,TRUE);
  20. return0;
  21. }
  22. caseWM_VSCROLL:
  23. {
  24. //getallverticalscrollbarinformation
  25. si.cbSize=sizeof(SCROLLINFO);
  26. si.fMask=SIF_ALL;
  27. ::GetScrollInfo(hWnd,SB_VERT,&si);
  28. //savethepositionforcomparisonlateron
  29. nVertPos=si.nPos;
  30. switch(LOWORD(wp))
  31. {
  32. caseSB_LINEUP:
  33. {
  34. si.nPos-=1;//theheightdecrease1unit
  35. break;
  36. }
  37. caseSB_LINEDOWN:
  38. {
  39. si.nPos+=1;//theheightincrease1unit
  40. break;
  41. }
  42. caseSB_PAGEUP:
  43. {
  44. //backtoprevpage,thecyClient/cyCharisthenumberofrowinonepage
  45. si.nPos-=cyClient/cyChar;
  46. break;
  47. }
  48. caseSB_PAGEDOWN:
  49. {
  50. //backtonextpage
  51. si.nPos+=cyClient/cyChar;
  52. break;
  53. }
  54. caseSB_THUMBPOSITION:
  55. {
  56. si.nPos=HIWORD(wp);
  57. break;
  58. }
  59. default:
  60. break;
  61. }
  62. //setthepositionandthenretrieveit.Duetoadjustments
  63. //byWindowsitmaynotbethesameasthevalueset.
  64. si.fMask=SIF_POS;
  65. SetScrollInfo(hWnd,SB_VERT,&si,TRUE);
  66. GetScrollInfo(hWnd,SB_VERT,&si);
  67. //ifthepositionhaschanged,scrollthewindowupdateit
  68. if(si.nPos!=nVertPos)
  69. {
  70. ::ScrollWindow(hWnd,0,cyChar*(nVertPos-si.nPos),NULL,NULL);
  71. ::UpdateWindow(hWnd);
  72. }
  73. return0;
  74. }
  75. caseWM_HSCROLL:
  76. {
  77. //getalltheverticalscrollbarinformation
  78. si.cbSize=sizeof(si);
  79. si.fMask=SIF_ALL;
  80. //savethepositionforcomparisonlateron
  81. ::GetScrollInfo(hWnd,SB_HORZ,&si);
  82. nHorzPos=si.nPos;
  83. switch(LOWORD(wp))
  84. {
  85. caseSB_LINELEFT:
  86. {
  87. si.nPos-=1;
  88. break;
  89. }
  90. caseSB_LINERIGHT:
  91. {
  92. si.nPos+=1;
  93. break;
  94. }
  95. caseSB_PAGELEFT:
  96. {
  97. si.nPos-=si.nPage;
  98. break;
  99. }
  100. caseSB_PAGERIGHT:
  101. {
  102. si.nPos+=si.nPage;
  103. break;
  104. }
  105. caseSB_THUMBPOSITION:
  106. {
  107. si.nPos=si.nTrackPos;
  108. break;
  109. }
  110. default:
  111. break;
  112. }
  113. //setthepositionandthenretrieveit.duetoadjustments
  114. //bywindowsitmaynotbethesameasthevalueset
  115. si.fMask=SIF_POS;
  116. ::SetScrollInfo(hWnd,SB_HORZ,&si,TRUE);
  117. ::GetScrollInfo(hWnd,SB_HORZ,&si);
  118. //ifthepostionhaschanged,scrollthewindow
  119. if(si.nPos!=nHorzPos)
  120. {
  121. ::ScrollWindow(hWnd,cxChar*(nHorzPos-si.nPos),0,NULL,NULL);
  122. }
  123. return0;
  124. }
  125. caseWM_PAINT:
  126. {
  127. hdc=::BeginPaint(hWnd,&ps);
  128. //getverticalscrollbarposition
  129. si.cbSize=sizeof(si);
  130. si.fMask=SIF_POS;
  131. ::GetScrollInfo(hWnd,SB_VERT,&si);
  132. nVertPos=si.nPos;
  133. //gethorizontalscrollbarposition
  134. GetScrollInfo(hWnd,SB_HORZ,&si);
  135. nHorzPos=si.nPos;
  136. //findpaintinglimits
  137. intnPaintBeg=max(0,nVertPos+ps.rcPaint.top/cyChar);//thebeginrow
  138. intnPaintEnd=min(NUMLINES-1,nVertPos+ps.rcPaint.bottom/cyChar);//theendrow
  139. for(inti=nPaintBeg;i<=nPaintEnd;i++)
  140. {
  141. //calculatetheypositionofdrawregion,whenypositionless0,skip
  142. intx=cxChar*(1-nHorzPos);
  143. inty=cyChar*(i-nVertPos);
  144. ::TextOut(hdc,x,y,sysmetrics[i].szLabel,lstrlen(sysmetrics[i].szLabel));
  145. ::TextOut(hdc,x+22*cxCaps,y,sysmetrics[i].szDesc,lstrlen(sysmetrics[i].szDesc));
  146. ::SetTextAlign(hdc,TA_RIGHT|TA_TOP);
  147. ::TextOut(hdc,x+22*cxCaps+40*cxChar,y,szBuffer,wsprintf(szBuffer,_T("%5d"),::GetSystemMetrics(sysmetrics[i].Index)));
  148. ::SetTextAlign(hdc,TA_LEFT|TA_TOP);
  149. }
  150. ::EndPaint(hWnd,&ps);
  151. return0;
  152. }


相关源码下载:


Windows API学习之滚动条系列函数演示程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值