MFC 控件编程之水平滚动条跟垂直滚动条

        MFC 控件编程之水平滚动条跟垂直滚动条

一点水平滚动条的操作

  首先在操作滚动条的时候.我们要知道滚动条的一些属性. 比如我们要设置 最大值 最小值. 以及每次递增的值是多少.都要设置.

所有就有一个结构.专门存储了滚动条信息. 而我们在对话框一启动就要进行控件初始化.下方看下结构.

typedef struct tagSCROLLINFO {
  UINT cbSize;                         自身大小
  UINT fMask;                          滚动条的范围.左边->右边方式.
  int  nMin;                              滚动条最小值
  int  nMax;                             滚动条最大值
  UINT nPage;                          每次滚动的值
  int  nPos;                              位置
  int  nTrackPos;                        位置
} SCROLLINFO, *LPSCROLLINFO;

然后我们使用封装好的API 进行设置.

BOOL SetScrollInfo( LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE );

滚动条是一个类. MFC给我们封装好的.所以我们直接使用封装好的函数即可.

初始化的时候需要做的.

  SCROLLINFO si = { 0 };
    si.cbSize = sizeof(SCROLLINFO);
    si.fMask = SIF_RANGE | SIF_PAGE;   //设置范围.
    si.nMin = 0;                         //最小值1
    si.nMax = 100;                     //最大值100
    si.nPage = 1;                     //每次递增1

    //设置滚动条信息.
    m_hor.SetScrollInfo(&si);

此时我们初始化好了.但是我们要对它的消息进行处理.才可以使用这个滚动条.

二丶指定点击水平滚动条消息  WM_HSCROLL

我们第一个就是要对点击这个滚动条的消息进行处理.

对话框-> 属性 -> 事件 -> 响应消息.

我们在单击水平滚动条里面.判断是哪个消息进行不同的处理即可. 比如 点击左边箭头. 点击右边箭头. 等等. 值递增.

代码如下.当我们响应了单击滚动条信息的时候

void C滚动条Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{  参数1 代表的是消息.

    //处理滚动条的每一个消息.进行处理.
    switch (nSBCode)
    {
    case SB_THUMBTRACK:  //判断消息是否是拉动滚动条
        break;
    case SB_LINELEFT:   //箭头向左的消息
        break;

    case SB_LINERIGHT:  //箭头向右的消息
        break;
    case SB_PAGELEFT:   // 值递减.也就是向左翻页
        break;
    case SB_PAGERIGHT:  //值递增.也就是向右翻页.
        break;
        break;

    default:
        break;
    }
    CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

没有具体写代码.当我们写代码的时候.要先获取当前滚动条的状态信息.

1.点击右箭头位置递增

void C滚动条Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{

    SCROLLINFO si = { 0 };
    si.cbSize = sizeof(SCROLLINFO);
    si.fMask = SIF_ALL;  //获取所有滚动条消息
    pScrollBar->GetScrollInfo(&si); //通过这个函数.获取滚动条信息.

    //si里面就有所有的信息.
    int nNewPos = si.nPos;  //获取最新的位置.

    //处理滚动条的每一个消息.进行处理.
    switch (nSBCode)
    {
    case SB_THUMBTRACK:  //判断消息是否是拉动滚动条

        break;
    case SB_LINELEFT:   //箭头向左的消息
        break;

    case SB_LINERIGHT:  //箭头向右的消息
        nNewPos += 2; //我们的值加了.所以设置到滚动条里面
        break;
    case SB_PAGELEFT:   // 值递减.也就是向左翻页
        break;
    case SB_PAGERIGHT:  //值递增.也就是向右翻页.
        break;
        break;

    default:
        break;
    }

    pScrollBar->SetScrollPos(nNewPos);
    CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

思路:

  1.获取当前滚动条信息. 因为当前滚动条信息里面有滚动条里最新的位置.

  2.保存位置.

  3.设置到滚动条上面.

参数三就是当前滚动条类.所以我们可以使用 封装好的方法.用来获取当前信息.以及设置当前位置到这个滚动条上面.

2.一个正常使用的垂直滚动条的完整代码.

void C滚动条Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{

    SCROLLINFO si = { 0 };
    si.cbSize = sizeof(SCROLLINFO);
    si.fMask = SIF_ALL;  //获取所有滚动条消息
    pScrollBar->GetScrollInfo(&si); //通过这个函数.获取滚动条信息.

    //si里面就有所有的信息.
    int nNewPos = si.nPos;  //获取最新的位置.

    //处理滚动条的每一个消息.进行处理.
    switch (nSBCode)
    {
    case SB_THUMBTRACK:  //判断消息是否是拉动滚动条
        nNewPos = nPos;            //如果拖动滑块.那么参数2就是最新位置.
        break;
    case SB_LINELEFT:   //箭头向左的消息
        nNewPos -= 2; //我们的值加了.所以设置到滚动条里面
        break;

    case SB_LINERIGHT:  //箭头向右的消息
        nNewPos += 2; //我们的值加了.所以设置到滚动条里面
        break;
    case SB_PAGELEFT:   // 值递减.也就是向左翻页    点击滚动条左边空格的时候
        nNewPos -= si.nPage;
        break;
    case SB_PAGERIGHT:  //值递增.也就是向右翻页.
        nNewPos += si.nPage;
        break;
        break;

    default:
        break;
    }

    //需要判断位置是否超出.
    if (nNewPos > si.nMax)
    {
        nNewPos = si.nMin;
    }
    if (nNewPos < si.nMin)
    {
        nNewPos = si.nMin;
    }
    pScrollBar->SetScrollPos(nNewPos);
    CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

三丶总结

  1.首先要设置滚动条的各项属性. 有一个结构体SCROLLINFO .并且使用封装的方法进行初始化 SetScrollInfo(&结构)

  2.要在对话框属性上面.响应滚动条单击的消息.  WM_HSCROLL

  3.此时响应过后的回调函数会有三个参数.

      参数1 : 滚动条信息. 因为我们还要处理其余信息.

      参数2: 当滚动条拖动的时候.保存拖动过后的最新位置.

      参数3: 滚动条信息. 保存了滚动条的当前状态信息.

  4.需要通过第三个参数. 获取滚动条当前状态信息. GetScrollInfo(&结构) 我们的结构的标志要设置为获取全部信息的标志.

  5.创建一个变量.保存当前状态中的垂直滚动条的位置.

  6.通过SWITCH 语句.判断不同的滚动条消息. 进行位置的设置.

  7.判断是否越界.如果越界.设置为滚动条最小值.

  8.使用封装好的函数.设置到当前滚动条中. 也就是设置位置.SetScrollPos(新的位置)

四丶垂直滚动条的使用

垂直滚动条跟水平滚动条是一样的.只不过处理的消息不一样了.下方特贴一份源码.学习源码即可.跟上面一样.

int ChyperlinkDlg::GetScrollPos(int nBar, UINT nSBCode)
{
    SCROLLINFO si;
    si.cbSize = sizeof(SCROLLINFO);
    si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS;
    GetScrollInfo(nBar, &si);    

    const int minPos = si.nMin;
    const int maxPos = si.nMax - (si.nPage - 1);    

    int result = -1;    

    switch(nSBCode)
    {
    case SB_LINEUP /*SB_LINELEFT*/:       //消息不一样了.
        result = max(si.nPos - 1, minPos);
        break;
    case SB_LINEDOWN /*SB_LINERIGHT*/:
        result = min(si.nPos + 1, maxPos);
        break;
    case SB_PAGEUP /*SB_PAGELEFT*/:
        result = max(si.nPos - (int)si.nPage, minPos);
        break;
    case SB_PAGEDOWN /*SB_PAGERIGHT*/:
        result = min(si.nPos + (int)si.nPage, maxPos);
        break;
    case SB_THUMBPOSITION:
        // do nothing
        break;
    case SB_THUMBTRACK:
        result = si.nTrackPos;
        break;
    case SB_TOP /*SB_LEFT*/:
        result = minPos;
        break;
    case SB_BOTTOM /*SB_RIGHT*/:
        result = maxPos;
        break;
    case SB_ENDSCROLL:
        // do nothing
        break;
    }    

    return result;
}    

原文地址:https://www.cnblogs.com/iBinary/p/9656925.html

时间: 2024-08-28 10:51:47

MFC 控件编程之水平滚动条跟垂直滚动条的相关文章

MFC控件编程:旋转按钮、进度条和滑块控件

旋转按钮(微调按钮) : 对应的控件类是CSpinButtonCtrl 进度条:对应的控件类是CProgressCtrl 滑块:对应的控件类是CSliderCtrl 对这三个控件的操作都是同过与之相关联的控件类完成的,并且这三个控件有极大的相似性,故这里放到一起 先认识下: Spin:            Progress:             Slider: 常用函数: SetRange()/GetRange(); // 设置.获取控件表示的范围 /* 设置控件的增量(步长) */ CS

MFC控件编程:Tab Control

Tab控件的使用 1 插入Tab控件的数据项(标签) CTabCtrl::InsertItem 2 以Tab控件为父窗口创建对话框 3 调整对话框大小 4 在Tab控件的SELCHANGE消息处理函数中,根据当前选项的索引设置对话框的显示状态. 新建一个基于对话框的工程,拖放一个Tab Control控件,Ctrl+W 为之绑定一个控件变量m_wndTabCtrl 插入两个对话框资源做为标签页面,注意设置它们的样式为:child 和 无边框 双击对话框资源为他们添加相关类,父类使用默认CDial

MFC控件编程之鼠标消息

MFC控件编程之鼠标消息 在MFC中鼠标消息.键盘消息我们很常用.所以说一下. 鼠标消息分为客户区消息.跟非客户区消息. 一丶客户区消息 我们可以处理消息.来进行我们相应的函数即可. MFC添加消息的话.可以自己在消息映射表中添加 .可以自己使用工具直接添加. 消息映射表添加 学习过MFC原理的应该知道.这里可以添加消息. 自己可以手动添加.我们也可以使用向导来添加. void CCDCDlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO

MFC控件编程之复选框单选框分组框

MFC控件编程之复选框单选框分组框 一丶分组框 分组框 英文叫做 GroubBox 添加了分组框主要就是分组.好看.不重点介绍 二丶单选框 英文: Raido Button 单选框需要注意的事项 1.单选框必须设置分组. 在属性中设置. 设置为True 2.如果有两个单选框那么TAB 顺序必须紧邻 VS中设置单选框TAB顺序 1,首先设置分组状态 因为设置分组.所以需要指定TAB 按键顺序.也就是必须连着. 设置一个即可. 2.设置TAB顺序 快捷键Ctrl + d 只需要点击控件则会自动设置顺

CheckedListBoxControl 或CheckedListBox 控件中显示水平滚动条 z

public partial class Form1 : Form { public Form1() { InitializeComponent(); DisplayHScroll(); } /// <summary> /// 获取或设置一个值,该值指示是否在控件中显示水平滚动条 /// </summary> private void DisplayHScroll() { checkedListBox1.IntegralHeight = true; for (int x = 0;

[MFC] 梳理一个简单的图片处理桌面软件中用到的MFC控件技巧

 前言 前些天应好友之拖,帮忙设计一个简单的图像处理的小软件.朋友把核心算法封装好了,但是是用openCV类似于console的编程环境,要我在此基础上改成MFC桌面程序.下图是做成之后的效果: 我是两年前稍微学了点MFC的知识,这两年中基本没有涉及,因为诸多相同的需求都可以用C#来搞定.这个本来也是想用C#来弄,可是我朋友用了openCV的相关函数封装了核心的“美颜算法”,我就只好重温经典了! 本文只涉及开发该小软件中与MFC控件相关的操作技巧,不提供朋友的“美颜算法”,还请各位见谅! 工程中

[WP8.1UI控件编程]Windows Phone理解和运用ItemTemplate、ContentTemplate和DataTemplate

2.2.5 ItemTemplate.ContentTemplate和DataTemplate 在理解ItemTemplate.ContentTemplate和DataTemplate的关系的之前,我们先来看看ContentControl类和ItemsControl类.ContentControl类是内容控件的基类,如Button, CheckBox,最明显的特征就是这个控件有Content属性,有Content属性的系统控件都是ContentControl的子类.ItemsControl类是列

[WP8.1UI控件编程]Windows Phone VirtualizingStackPanel、ItemsStackPanel和ItemsWrapGrid虚拟化排列布局控件

11.2.2 VirtualizingStackPanel.ItemsStackPanel和ItemsWrapGrid虚拟化排列布局控件 VirtualizingStackPanel.ItemsStackPanel和ItemsWrapGrid都是虚拟化布局控件,一般情况下在界面的布局上很少会用到这些虚拟化排列的控件,大部分都是封装在列表的布局面板上使用,主要的目的就是为了实现列表上大数据量的虚拟化,从而极大地提高列表的效率.那么其实这3个虚拟化布局控件都是列表控件的默认布局排列的方式,其中Vir

MFC控件随对话框大小改变而改变

这也是我项目中碰到的问题,要让对话框中的控件随着对话框大小的变化进行自动调整,一般的做法是在WM_SIZE的响应函数中对所有的控件用MoveWindow()或者SetWindowPos()设置其变化比例. 但是由于需要自己计算,并且还有各种系统引起的情况,比如WIN7里有个选项"拖动时显示窗口内容",选中与不选中导致对话框内容显示完全不一样,选中时错误,不选正确,确实让人头大. 如EasySize是一个很好解决方案,用一些宏封装了内部的实现机制,使用起来方便快捷.原文地址:http:/