C++ 有没有人用过;滚动箭头“;在水平滚动条中滚动位置?

C++ 有没有人用过;滚动箭头“;在水平滚动条中滚动位置?,c++,visual-c++,mfc,user-controls,C++,Visual C++,Mfc,User Controls,我希望使用滚动条两端的滚动箭头来滚动条的位置。众所周知,滚动条不像其他控件那样具有通知功能,因此我面临一个问题 我的滚动条代码如下- void CScrollBarExDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { if(nSBCode==SB_THUMBPOSITION) { if(pScrollBar==&m_Scroll) {

我希望使用滚动条两端的滚动箭头来滚动条的位置。众所周知,滚动条不像其他控件那样具有通知功能,因此我面临一个问题

我的滚动条代码如下-

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);
}
要使用滚动条控件,您必须稍微修改:

//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);
    }
}
void CMyDialog::OnHScroll(UINT nSBCode、UINT npo、CScrollBar*pScrollBar)
{
CDialog::OnVScroll(nSBCode、npo、pScrollBar);
如果(pScrollBar==&m_滚动)
{
//获取滚动条信息
滚动信息;
m_Scroll.GetScrollInfo(&info,SIF_ALL);
int pos=info.nPos;
//计算滚动框的新位置
交换机(nSBCode)
{
案例SB_左:pos=info.nMin;中断;
案例SB_RIGHT:pos=info.nMax;break;
案例SB_LINELEFT:位置--;中断;
case SB_LINERIGHT:pos++;break;
case SB_PAGELEFT:pos-=info.nPage;break;
case SB_PAGERIGHT:pos+=info.nPage;break;
案例SB_拇指位置:位置=NPO;断裂;
案例SB_指迹:pos=NPO;中断;
}
//确保新位置在范围内
如果(pos最大值)位置=最大值;
//设置新位置
m_滚动设置滚动位置(位置);
}
}

因此我面临一个问题
您似乎忘记了解释您面临的问题。您在处理滚动箭头时遇到了什么问题?您是否阅读了
OnHScroll
的文档,特别是
nSBCode
参数的说明?除了
SB_THUMBPOSITION
,它还有什么其他值?是的,我说的是MSDN文档。如果在函数中放置断点,单击箭头,然后在调试器中检查
nSBCode
,一旦遇到断点,变量有什么值?
nPage
应设置为1。如果需要将
nPage
设置为其他值,请参见编辑。虽然这不是必须的。您可能还想看看滑块控制。