MFC窗口滚动条用法

4 篇文章 0 订阅

    Hello小伙伴们,好几天没更新公众号了,因为文子回家吃粽子去了。

    今天要给大家分享一个窗口滚动条的用法。你会好奇滚动条是什么?滚动条就是可以滚动的条,如图所示:

    

    上面这个就是滚动条啦,那么它的作用是什么呢?你可以想想在一个大小固定的界面上,你的空间特别多,多到界面已经没有空隙可以放置的时候,这个时候就需要滚动条来协助界面的扩展了,啥都别说,先看效果图:

    这是没有使用界面滚动条的效果,我们可以看到这个界面上有24个按钮,这24个按钮固定排列着,然后界面的宽度和高度已经是固定的长度了,接下来我们看一下加了滚动条的效果图:

    可以看到界面上出现了水平滚动条和垂直滚动条,可以上下拉动滚动条进行界面的垂直扩展,也可以左右拉动滚动条进行界面的水平扩展。但是,存在一个问题就是:当你拉动滚动条的时候,界面是没有反应的,是因为我们的代码中没有添加滚动条的事件函数,需要在这个界面的代码中添加滚动条的响应函数。

界面添加滚动条的做法是:

  1. 选中界面;

  2. 点击界面属性,将属性中的“垂直滚动条”和“水平滚动条”均设置为True;

然后在类视图中选中这个界面的类,然后右键点击属性,然后选择属性中的消息,在消息中寻找WM_HSCROLL和WM_VSCROLL,添加这两个事件函数:

然后在这两个时间函数中添加以下代码:


  •  
void CceshiDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
  // TODO: 在此添加消息处理程序代码和/或调用默认值
​
  CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
  SCROLLINFO scrollinfo;
  GetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);
  //
  switch (nSBCode)
  {
  case SB_LEFT:
    ScrollWindow((scrollinfo.nPos - scrollinfo.nMin) * 10, 0);
    scrollinfo.nPos = scrollinfo.nMin;
    SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);
    break;
  case SB_RIGHT:
    ScrollWindow((scrollinfo.nPos - scrollinfo.nMax) * 10, 0);
    scrollinfo.nPos = scrollinfo.nMax;
    SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);
    break;
  case SB_LINELEFT:
    scrollinfo.nPos -= 1;
    if (scrollinfo.nPos < scrollinfo.nMin)
    {
      scrollinfo.nPos = scrollinfo.nMin;
      break;
    }
    SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);
    ScrollWindow(10, 0);
    break;
  case SB_LINERIGHT:
    scrollinfo.nPos += 1;
    if (scrollinfo.nPos > scrollinfo.nMax)
    {
      scrollinfo.nPos = scrollinfo.nMax;
      break;
    }
    SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);
    ScrollWindow(-10, 0);
    break;
  case SB_PAGELEFT:
    scrollinfo.nPos -= 5;
    if (scrollinfo.nPos < scrollinfo.nMin)
    {
      scrollinfo.nPos = scrollinfo.nMin;
      break;
    }
    SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);
    ScrollWindow(10 * 5, 0);
    break;
  case SB_PAGERIGHT:
    scrollinfo.nPos += 5;
    if (scrollinfo.nPos > scrollinfo.nMax)
    {
      scrollinfo.nPos = scrollinfo.nMax;
      break;
    }
    SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);
    ScrollWindow(-10 * 5, 0);
    break;
  case SB_THUMBPOSITION:
    break;
  case SB_THUMBTRACK:
    ScrollWindow((scrollinfo.nPos - nPos) * 10, 0);
    scrollinfo.nPos = nPos;
    SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);
    break;
  case SB_ENDSCROLL:
    break;
  }
}
​
​
void CceshiDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
  // TODO: 在此添加消息处理程序代码和/或调用默认值
​
  CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
  SCROLLINFO scrollinfo;
  GetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
  switch (nSBCode)
  {
  case SB_LINEUP:          //Scroll one line up
    scrollinfo.nPos -= 1;
    if (scrollinfo.nPos < scrollinfo.nMin)
    {
      scrollinfo.nPos = scrollinfo.nMin;
      break;
    }
    SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
    ScrollWindow(0, 10);
    break;
  case SB_LINEDOWN:           //Scroll one line down
    scrollinfo.nPos += 1;
    if (scrollinfo.nPos + scrollinfo.nPage > scrollinfo.nMax)  //此处一定要注意加上滑块的长度,再作判断
    {
      scrollinfo.nPos = scrollinfo.nMax;
      break;
    }
    SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
    ScrollWindow(0, -10);
    break;
  case SB_PAGEUP:            //Scroll one page up.
    scrollinfo.nPos -= 5;
    if (scrollinfo.nPos <= scrollinfo.nMin)
    {
      scrollinfo.nPos = scrollinfo.nMin;
      break;
    }
    SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
    ScrollWindow(0, 10 * 5);
    break;
  case SB_PAGEDOWN:        //Scroll one page down        
    scrollinfo.nPos += 5;
    if (scrollinfo.nPos + scrollinfo.nPage >= scrollinfo.nMax)  //此处一定要注意加上滑块的长度,再作判断
    {
      scrollinfo.nPos = scrollinfo.nMax;
      break;
    }
    SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
    ScrollWindow(0, -10 * 5);
    break;
  case SB_ENDSCROLL:      //End scroll     
    break;
  case SB_THUMBPOSITION:  //Scroll to the absolute position. The current position is provided in nPos
    break;
  case SB_THUMBTRACK:                  //Drag scroll box to specified position. The current position is provided in nPos
    ScrollWindow(0, (scrollinfo.nPos - nPos) * 10);
    scrollinfo.nPos = nPos;
    SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
    break;
  }
}
​

添加后运行可以看到界面的效果如下图所示:

也就是滚动条可以被任意拉动了,界面可以被水平和垂直方向进行扩展显示。

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
MFC中,可以利用滚动条来实现对图片的浏览和滚动功能。 首先,我们需要在MFC应用程序中添加一个滚动条控件。可以在资源视图中的对话框资源上添加一个滚动条控件,然后在代码中声明和绑定该控件。 接下来,我们需要加载要显示的图片。可以使用CImage类来加载图片文件,或者使用其他类似的方法来获取需要显示的图片数据。 在将图片显示到MFC窗口的过程中,我们可以利用滚动条的滚动事件来实现图片的滚动功能。滚动条的范围可以根据图片的大小来确定,用户通过拖动滑块来改变滚动条的位置,从而实现图片的滚动。 在滚动条的滚动事件响应函数中,可以根据滚动条的当前位置来确定需要显示的图片的位置。可以使用CImage的Draw函数将需要显示的部分绘制到MFC窗口中。 需要注意的是,对于较大的图片,为了避免性能问题,可以在滚动过程中只绘制可见部分的图片,当滚动条的位置发生改变时再进行绘制,这样可以减少不必要的绘制操作,提高程序的效率。 另外,还可以根据需要添加其他功能,例如放大缩小图片、旋转图片等,以增加用户的交互体验。 总而言之,使用MFC滚动条来实现图片滚动功能可以让用户方便地浏览较大尺寸的图片,提升用户体验。以上是一个简单的实现思路,具体实现需要根据具体的需求和MFC版本进行调整。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三贝勒文子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值