c - Win32 滚动条 : When drag horizontal scroll bar to right most position, nPos 的值没有达到 nMaxPos

标签 c winapi

我是 win32 API 的新手。我需要使用滚动条来移动屏幕以查看某些图形绘制。假设我的 X 轴是 1500 个单位长度(像素?)。我已经初始化我的滚动条如下:

SCROLLINFO  si; 

si.cbSize = sizeof (si) ;
si.fMask  = SIF_ALL;
si.nMin   = 0 ;
si.nMax   = 1500 ;
si.nPage  = 100 ;
SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ;

我还有如下处理 WM_SIZE 和 WM_HSCROLL 的案例:

case WM_SIZE:
    SetScrollRange(hwnd, SB_HORZ, 0, 1500, TRUE);


case WM_HSCROLL:
    GetScrollInfo (hwnd, SB_HORZ, &si) ;
    iPosBeforeScroll = si.nPos ;
    iWindowShiftPerScrollClick = 1;
    switch (LOWORD (wParam))
    {
        case SB_LINELEFT:   // press left button
            si.nPos -= iWindowShiftPerScrollClick ;
            xShift = -iWindowShiftPerScrollClick;
            break ;

        case SB_LINERIGHT:  // press right button
             si.nPos += iWindowShiftPerScrollClick ;
             xShift = iWindowShiftPerScrollClick;
             break ;
        case SB_THUMBTRACK:
              si.nPos = si.nTrackPos ;
              xShift = si.nTrackPos - iPosBeforeScroll;
              break;
    }
    si.fMask = SIF_ALL ;
    SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ;
    GetScrollInfo (hwnd, SB_HORZ, &si) ;
    ScrollWindow (hwnd, -xShift, 0, NULL, NULL) ;
    UpdateWindow(hwnd);

当我运行程序时,我观察到,当滚动条移动到最右边的位置时,si.nPos 的值只达到1401。它不应该是 1500 因为我已将范围设置为 1500 吗?另外,当滚动条在最右边的位置时,我仍然可以按滚动条向右移动按钮,屏幕移动但滚动条保持在同一位置。我可以按滚动条右键直到 nPos 达到最大值(在我的例子中是 1500)。

我的问题是:

1> 发生的事情是否超出正常范围?如果是,我如何计算当我将滚动条拖动到给定范围的最大限制时 nPos 的值是多少?

2> 滚动条移动一个单位是否等于窗口绘图移动一个单位(像素)?

更新:

只需观察滚动条最多只能拖动到“nMaxPos - 99”。这部分回答了我的第一个问题。

最佳答案

第一个问题: 这在 SetScrollInfo 中有完整记录:

这里的相关因素是页面大小。

来自文档:

The SetScrollInfo function performs range checking on the values specified by the nPage and nPos members of the SCROLLINFO structure. The nPage member must specify a value from 0 to nMax - nMin +1. The nPos member must specify a value between nMin and nMax - max( nPage– 1, 0). If either value is beyond its range, the function sets it to a value that is just within the range.

问题2: 这取决于你在做什么。事实上没有: 1. 滚动条中的勾号可能是滚动条中的 1 行(列表框、树控件等)。如果您使用 GDI 映射模式,则为 1 个逻辑点。 滚动条做任何你想做的事。只要滚动条没有绑定(bind)到现有控件(ListCtrl、TreeCtrl、Edit Ctrl)

关于c - Win32 滚动条 : When drag horizontal scroll bar to right most position, nPos 的值没有达到 nMaxPos,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23100443/

相关文章:

c++ - 将 C++ 插件插入到 C 软件中进行内存管理

c - 如何选择服务器启动的端口(linux)?

c - 声明 union 类型变量

delphi - CN 和 WM 前缀消息的区别

c - 远程枚举登录 session

c++ - 使用winapi从文件中读取数据

C++打印两个标志

c++ - 显示/隐藏控件后如何更新窗口的当前状态?

c++ - 在客户端矩形中隐藏光标但不在标题栏上

c - 过于频繁地调用 Shell_NotifyIcon 后托盘图标停止出现