我在VC6.0中通过资源添加了一个标准水平滚动条,然后在::OnInitDialog()中添加下面的代码
          CRect rect;
 GetClientRect(rect);
 int xpos=GetScrollPos(SB_HORZ);
 if(xpos!=0)
         ScrollWindow(xpos,0);
         SCROLLINFO vinfo;
         vinfo.cbSize=sizeof(vinfo);
 vinfo.fMask=SIF_ALL;
 vinfo.nPage=30;
 vinfo.nMax=100;
 vinfo.nMin=0;
 vinfo.nTrackPos=0;
 vinfo.nPos=0;
 //设置水平滚动条信息
 SetScrollInfo(SB_HORZ,&vinfo);
    在::OnHScroll 中添加了下面的代码 // TODO: Add your message handler code here and/or call default
int pos,min,max,thumbwidth;
SCROLLINFO vinfo;  
pos=vinfo.nPos;
min=vinfo.nMin;
max=vinfo.nMax;
thumbwidth=vinfo.nPage;

switch (nSBCode)  
{  
case SB_THUMBTRACK://拖动滚动条  
ScrollWindow(-(nPos-pos),0);    
SetScrollPos(SB_HORZ,nPos);  
break;  
case SB_LINELEFT://单击左箭头
if(pos!=0)
{
ScrollWindow(1,0);
SetScrollPos(SB_HORZ,pos-1);
}
break;  
case SB_LINERIGHT: //单击右箭头 
if(pos+thumbwidth<=max)
{
SetScrollPos(SB_HORZ,pos+1);  
    ScrollWindow(-1,0);  
}
break;  
case SB_PAGELEFT:  //在滚动条左方空白滚动区域单击 
if (pos>=thumbwidth)
{  
ScrollWindow(thumbwidth,0);
SetScrollPos(SB_HORZ,pos-thumbwidth);
}  
else
{
          ScrollWindow(pos,0); 
  SetScrollPos(SB_HORZ,pos-thumbwidth);  
}
break;  
case SB_PAGERIGHT: //在滚动条右方空白滚动区域单击 
if (pos+thumbwidth<=max-thumbwidth)  
{  
ScrollWindow(-thumbwidth,0);
SetScrollPos(SB_HORZ,pos+thumbwidth); 
}  
else
{
          ScrollWindow(-(max-(pos+thumbwidth)),0); 
  SetScrollPos(SB_HORZ,max-thumbwidth);  
}  
break;  

运行后有下面两个警告
: warning C4146: unary minus operator applied to unsigned type, result still unsigne
: warning C4700: local variable 'vinfo' used without having been initialized
请高手指点,也可以给出其它的源代码,只有运行成功就可以获得高分.(补充:我是在对话框客户区绘制了一个直角坐标系)

解决方案 »

  1.   

    对话框类的GetScrollPos好像取得是自己的GetScrollPos,而不是你增加的
      

  2.   

    BOOL CEx081118Dlg::OnInitDialog()
    {
    CDialog::OnInitDialog();

    m_scroll.SetScrollRange(0,100);
    m_scroll.SetScrollPos(0);

    return TRUE;  // return TRUE  unless you set the focus to a control
    }void CEx081118Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
    if(SB_LINERIGHT == nSBCode)
    {
    int iCurPos = pScrollBar->GetScrollPos();
    pScrollBar->SetScrollPos(iCurPos+1);
    }
    }
      

  3.   

    m_scroll是关联的成员变量,先设置范围为0,100,再设置当前位置为0
    如果点击右边的箭头,位置加1,这是在OnHScroll中处理的。
      

  4.   

    你是更改窗口属性添加的滚动条还是另外添加的滚动条控件?前者可以用你目前的做法,后者需要给控件关联变量,通过该变量来控制滚动条。
    这两个警告是编译产生的,不是运行时产生的。OnHScroll中,要先调用GetScrollInfo,用vinfo来接收信息,然后才可以取vinfo中的成员,否则是没有意义的。
      

  5.   

    1楼说的对,应该给你的滚动条绑定一个控件变量来操作,控件滚动条在OnHScroll消息函数的最后一个变量CScrollBar* pScrollBar指示消息来源控件(窗口自身的滚动条消息这个变量为NULL)。
    另外,你这两个编译错误看看是第几行,直接双击错误信息就可以跳到该行。
    第二个错误是你没有初始化vinfo变量,第一个错误:
    编译器警告(等级 2)C4146一元负运算符应用于无符号类型,结果仍为无符号类型
    无符号类型只能保存非负值,所以一元负(非)应用于无符号类型时通常无意义。操作数和结果都是非负的。
    实际上,当程序员试图表达最小整数值 -2147483648 时,发生此问题。该值不能写为 -2147483648,因为表达式处理分两个步骤: 
    计算数字 2147483648。因 2147483648 大于最大整数值 2147483647,所以其类型不是 int,而是 unsigned int。 
    将一元负应用于该值,得到无符号结果,该结果碰巧是 2147483648。 
    无符号类型的结果可能导致意外行为。如果在比较中使用该结果,则可使用无符号比较,例如另一个操作数是 int 时。这解释了下面的示例程序只输出一行的原因。
    预期的第二行为 1 is greater than the most negative int,但未输出,因为 ((unsigned int)1) > 2147483648 为假。
    可以通过从 Limits.h 使用 MIN_INT 来避免 C4146 警告,该 MIN_INT 有 signed int 类型。
    下面的示例生成 C4146:
    // C4146.cpp
    // compile with: /W2
    #include <stdio.h>
    void check(int i)
    {
        if (i > -2147483648)   // C4146
          printf("%d is greater than the most negative int\n", i);
    }int main()
    {
        check(-100);
        check(1);
    }
      

  6.   

    一,新建一个基于对话框的工程Ex081122。
    二,在上面增加一个滚动条控件,并为其关联一个控制型的变量m_scroll。
    三,在CEx081122Dlg::OnInitDialog的初始化函数中加上如下代码:
    m_scroll.SetScrollRange(0,100);
    m_scroll.SetScrollPos(0);
    四,利用类向导为主对话框增加WM_HSCROLL消息的响应函数。
    void CEx081122Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    if(SB_LINERIGHT == nSBCode)
    {//点击右键头
    int iCurPos = pScrollBar->GetScrollPos();
    pScrollBar->SetScrollPos(iCurPos+1);
    CString strTitle ;
    strTitle.Format("滚动条的值是:%d",iCurPos+1);
    SetWindowText(strTitle);
    }
    else if( SB_THUMBPOSITION == nSBCode )
    {//拖动
    pScrollBar->SetScrollPos(nPos);
    CString strTitle ;
    strTitle.Format("滚动条的值是:%d",nPos);
    SetWindowText(strTitle);
    } CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
    }
    五,ctrl+F5是看运行效果。
      

  7.   

    -(nPos-pos)      类型不匹配SCROLLINFO vinfo;  
      pos=vinfo.nPos; 
    这个vinfo还没有初始化,应该调用GetScrollInfo初始化vinfo可以用下这个类,辅助scroll功能实现http://www.codeproject.com/KB/dialog/scrolling_support.aspx
      

  8.   

    http://www.tudou.com/programs/view/B21ww1UYX6w/
    这是专门做的视频