有没有人使用水平滚动条中的“滚动箭头”来滚动位置?

Posted

技术标签:

【中文标题】有没有人使用水平滚动条中的“滚动箭头”来滚动位置?【英文标题】:Has anyone ever used the "scroll arrows" in the horizontal scroll bar to scroll the positions? 【发布时间】:2016-02-12 04:01:25 【问题描述】:

我希望使用滚动条两端的滚动箭头来滚动条的位置。众所周知,滚动条没有其他控件的通知,所以我遇到了问题。

我的滚动条代码如下-

void CScrollBarExDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

    if(nSBCode==SB_THUMBPOSITION)
    
        if(pScrollBar==&m_Scroll)
        

            m_Edit=nPos;
            m_Scroll.SetScrollPos(nPos);
        

    
    UpdateData(FALSE);


    CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);

【问题讨论】:

so I am facing a problem您似乎忘记解释您面临的什么问题。 您在处理滚动箭头时遇到了什么问题? 您是否阅读过OnHScroll 的文档,尤其是nSBCode 参数的说明?除了SB_THUMBPOSITION,它还有哪些其他值? 是的,我说的是 MSDN 文档。 如果你在函数内部设置断点,点击箭头,一旦断点被​​触发,在调试器中检查nSBCode,变量的值是多少? 【参考方案1】:

您必须稍微修改MSDN example 才能使用滚动控件:

//add to message map
ON_WM_HSCROLL()

//initialize in OnInitDialog
SCROLLINFO info =  sizeof(SCROLLINFO) ;
info.nMin = 0;
info.nMax = 100;
info.nPage = 1; 
info.fMask = SIF_ALL;
m_Scroll.SetScrollInfo(&info, TRUE);

如果info.nPage 大于1,它可能会抛出范围。添加这一行来修复它:

info.nMax += info.nPage - 1;

添加重载:

void CMyDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

    CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
    if (pScrollBar == &m_Scroll)
    
        //get scrollbar information
        SCROLLINFO info;
        m_Scroll.GetScrollInfo(&info, SIF_ALL);
        int pos = info.nPos;

        //calculate the new position of scroll box 
        switch (nSBCode)
        
        case SB_LEFT: pos = info.nMin; break;
        case SB_RIGHT: pos = info.nMax; break;
        case SB_LINELEFT: pos--; break;
        case SB_LINERIGHT: pos++;  break;
        case SB_PAGELEFT: pos -= info.nPage; break;
        case SB_PAGERIGHT: pos += info.nPage; break;
        case SB_THUMBPOSITION: pos = nPos; break;
        case SB_THUMBTRACK: pos = nPos; break;
        

        //make sure the new position is within range
        if (pos < info.nMin) pos = info.nMin;

        //adjust the max value, incase we had changed it earlier in OnInitDialog
        int max = info.nMax - info.nPage + 1;
        if (pos > max) pos = max;

        //set the new position
        m_Scroll.SetScrollPos(pos);
    

【讨论】:

nPage 应设置为 1。如果您需要将 nPage 设置为另一个值,请参阅编辑。虽然它不应该是必要的。您可能还想查看 Slider 控件。

以上是关于有没有人使用水平滚动条中的“滚动箭头”来滚动位置?的主要内容,如果未能解决你的问题,请参考以下文章

在 jQuery 自定义滚动条中使用鼠标滚动事件移动自定义滚动条

如何在vim中通过命令向下滚动而不用方向键?

滚动条中的中心缩略图(jQuery)

隐藏滚动箭头 - 更好的方法?

Wordpress 向下滚动箭头到页面的一部分

css 弹跳向下滚动箭头