CScrollBar的困惑的解决

本文介绍如何使用GetScrollInfo函数获取滚动条的32位位置数据,尤其是在处理WM_HSCROLL和WM_VSCROLL消息时如何获取滚动条滑块(thumb)的精确位置。

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

泡在论坛上看了好多有关CScrollBar的帖子,虽然问题没有直接给出解决方案,但是给了我很多启发,于是我去msdn中大海捞针,知道有这个针,就一定可以找到的。:)
终于被我发现了:
msdn上有讲产生这个问题的原因以及解决方案,感谢csdn和msdn

以下引用自msdn2002:
Remarks

The GetScrollInfo function enables applications to use 32-bit scroll positions. Although the messages that indicate scroll-bar position, WM_HSCROLL and WM_VSCROLL, provide only 16 bits of position data, the functions SetScrollInfo and GetScrollInfo provide 32 bits of scroll-bar position data. Thus, an application can call GetScrollInfo while processing either the WM_HSCROLL or WM_VSCROLL messages to obtain 32-bit scroll-bar position data.

To get the 32-bit position of the scroll box (thumb) during a SB_THUMBTRACK request code in a WM_HSCROLL or WM_VSCROLL message, call GetScrollInfo with the SIF_TRACKPOS value in the fMask member of the SCROLLINFO structure. The function returns the tracking position of the scroll box in the nTrackPos member of the SCROLLINFO structure. This allows you to get the position of the scroll box as the user moves it. The following sample code illustrates the technique.

SCROLLINFO si;
case WM_HSCROLL:
switch(LOWORD(wparam)) {
case SB_THUMBTRACK:
// Initialize SCROLLINFO structure

ZeroMemory(&si, sizeof(SCROLLINFO));
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_TRACKPOS;

// Call GetScrollInfo to get current tracking
// position in si.nTrackPos

if (!GetScrollInfo(hwnd, SB_HORZ, &si) )
return 1; // GetScrollInfo failed
break;
.
.
.
}
### CScrollBar 类使用方法 #### 创建和初始化 `CScrollBar` 控件 为了创建一个滚动条控件,可以使用 MFC 中的 `CScrollBar` 类。该类提供了用于管理 Windows 滚动条控件的方法。 ```cpp // 定义并实例化 CScrollBar 对象 CScrollBar myScrollbar; // 调用 Create 方法来创建窗口对象,并将其附加到父窗口上 myScrollbar.Create(WS_CHILD | WS_VISIBLE | SBS_VERT, rect, pParentWnd, IDC_MY_SCROLLBAR); ``` 上述代码片段展示了如何通过调用 `Create()` 函数创建垂直方向上的滚动条[^2]。 #### 设置滚动范围与位置 可以通过成员函数设定滚动条的最大最小值以及当前位置: ```cpp int nMinPos = 0; int nMaxPos = 100; int nPageSize = 10; // 设定滚动条的位置区间 myScrollbar.SetScrollRange(nMinPos, nMaxPos); // 可选参数:指定页面大小,默认为零表示无分页效果 myScrollbar.SetScrollInfo(&si); // 移动滑块至特定位置 myScrollbar.SetScrollPos(currentPosition); ``` 这里设置了滚动条的有效数值范围是从 `nMinPos` 到 `nMaxPos` ,并且指定了当前显示区域的高度(即一页的内容量),最后调整了滑块的具体位置。 #### 处理滚动事件 当用户操作滚动条时会触发消息通知给父窗体处理程序,在其中可以根据实际需求更新界面或其他逻辑动作: ```cpp void CMyDialog::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { SCROLLINFO si; int currentPosition; // 获取现有状态信息 si.cbSize = sizeof(si); si.fMask = SIF_ALL; GetScrollInfo(IDC_MY_SCROLLBAR, &si); switch (nSBCode){ case SB_THUMBPOSITION: currentPosition = nPos; break; default : // ...其他情况下的计算方式... } SetScrollPos(IDC_MY_SCROLLBAR, currentPosition); Invalidate(); // 请求重绘客户区以反映新的内容布局变化 CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar); } ``` 此部分实现了对不同类型的滚动行为作出响应的功能,比如拖拽滑块(`SB_THUMBPOSITION`) 或者点击箭头按钮等情形下刷新视图的操作. #### 添加滚动条样式 对于已经存在的容器控件(如对话框、面板等),也可以动态修改其属性从而增加或移除某些特性,例如添加垂直滚动条功能: ```cpp m_containerCtrl.ModifyStyle(0, WS_VSCROLL); ``` 这条语句的作用是在运行期间改变控件外观,使之具备可上下卷动的能力.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值