我在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
请高手指点,也可以给出其它的源代码,只有运行成功就可以获得高分.(补充:我是在对话框客户区绘制了一个直角坐标系)
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
请高手指点,也可以给出其它的源代码,只有运行成功就可以获得高分.(补充:我是在对话框客户区绘制了一个直角坐标系)
{
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);
}
}
如果点击右边的箭头,位置加1,这是在OnHScroll中处理的。
这两个警告是编译产生的,不是运行时产生的。OnHScroll中,要先调用GetScrollInfo,用vinfo来接收信息,然后才可以取vinfo中的成员,否则是没有意义的。
另外,你这两个编译错误看看是第几行,直接双击错误信息就可以跳到该行。
第二个错误是你没有初始化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);
}
二,在上面增加一个滚动条控件,并为其关联一个控制型的变量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是看运行效果。
pos=vinfo.nPos; 这个vinfo还没有初始化,应该调用GetScrollInfo初始化vinfo可以用下这个类,辅助scroll功能实现http://www.codeproject.com/KB/dialog/scrolling_support.aspx
这是专门做的视频