Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MFC 控件编程之水平滚动条跟垂直滚动条

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

作者头像
IBinary
发布于 2019-05-25 08:22:41
发布于 2019-05-25 08:22:41
2.9K01
代码可运行
举报
文章被收录于专栏:逆向技术逆向技术
运行总次数:1
代码可运行

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

一点水平滚动条的操作

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef struct tagSCROLLINFO {
  UINT cbSize;                         自身大小
  UINT fMask;                          滚动条的范围.左边->右边方式.
  int  nMin;                              滚动条最小值
  int  nMax;                             滚动条最大值
  UINT nPage;                          每次滚动的值
  int  nPos;                              位置
  int  nTrackPos;                        位置
} SCROLLINFO, *LPSCROLLINFO;

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BOOL SetScrollInfo( LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE );

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

初始化的时候需要做的.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.点击右箭头位置递增

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.一个正常使用的垂直滚动条的完整代码.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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(新的位置)

四丶垂直滚动条的使用

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;    
}    

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Windows程序设计——窗口键盘消息滚动事件[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/171006.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/23
5500
用vc++做滚动条控件
  首先用应用向导产生一名为scro的基于对话框的应用,再利用对话框编辑器加入两个一样的水平滚动条,两个滚动条的id分别取idc—scr1和idc—scr2,结果如下图,将其作为本文的示例。   对话
用户1154259
2018/01/17
8040
用vc++做滚动条控件
MFC进度条控件(六)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157834.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/18
7140
MFC进度条控件(六)
Windows平台RTMP/RTSP播放器如何实现实时音量调节
RTMP或RTSP直播播放音量调节,主要用于多实例(多窗口)播放场景下,比如同时播放4路RTMP或RTSP流,如果音频全部打开,几路audio同时打开,可能会影响用户体验,我们通用的做法是支持播放端实时静音,更细粒度的做法是可以实时调节每一路RTMP/RTSP流的音量。
音视频牛哥
2021/01/21
9620
richedit设置滚动条的位置和更新内容
需要txt发现读者richedit的scrollbar位置(为了便于下一次读,直接访问与上次读取下一个读取位置)不值得治疗,采用GetScrollPos、SetScrollPos你可以设置scorllbar位置值。可是!
全栈程序员站长
2022/07/06
2.1K0
(八十九)c#Winform自定义控件-自定义滚动条(treeview、panel、datagridview、listbox、listview、textbox)
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2020/07/03
2.3K0
duilib 滚动条不能拖动 问题处理
遇到过很多次群里朋友问:为什么滚动条不能拖动,点击两端的按钮可以滚动,通过鼠标滚轮也可以滚动,就是鼠标拖动时拖不动? 这是个提问次数较高的问题。 下面的内容只针对可能的原因中的一个,也是最可能的原因。 因为通过鼠标拖动滚动条,实际内部用到了定时器,具体有兴趣的可以查看duilib的源码。我们的程序在处理时常常也会用到WM_TIMER消息,通过拦截WM_TIMER消息来做一些定时器处理,不能拖动的原因很有可能就是我们拦截了定时器消息之后,不管触发这个消息的定时器ID是多少,我们统统都不再继续传递给duilib
大菊观
2018/05/24
1.5K0
windows程序设计-第四章 system2.c 新增滚动条功能
新添加的滚动条功能,首先就是要在createWindow的时候,修改参数风格模式 hwnd = CreateWindow (szAppName, TEXT ("Get System Metrics No. 2"), WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, C
用户1154259
2018/01/17
7110
windows程序设计-第四章 system2.c 新增滚动条功能
【网络编程】异步选择模型
核心:消息队列,操作系统为每个窗口创建一个消息队列,并且维护,我们想要使用消息队列,那就要创建一个窗口。
半生瓜的blog
2023/05/12
3840
(六十九)c#Winform自定义控件-垂直滚动条
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/29
1.8K0
(六十九)c#Winform自定义控件-垂直滚动条
MFC控件编程进度条编写
  进度条MFC已经帮我们封装好类了. 叫做 CProgressCtrl 进度条编程也很简单.
IBinary
2019/05/25
3K1
游戏编程之三 DirectX SDK简介
Microsoft DirectX提供了一套非常优秀的应用程序接口,包含了设计高性能、实时应用程序的源代码。DirectX技术将帮助您建构下一代的电脑游戏和多媒体应用程序。它的内容包括了DirectDraw、DirectSound、DirectPlay、Direct3D和DirectInput等部分,它们分别主要应用在图形程序、声音程序等方面。
张哥编程
2024/12/17
2780
【读书笔记】Windows程序设计5
与从BeginPaint函数返回的设备句柄不同,从GetDC返回的设备句柄中的裁剪区域是整个客户区,而不仅仅
zhang_derek
2022/12/21
2.5K0
游戏编程之二 windows编程基础
为了跟上潮流,我们抛弃了已快被淘汰的DOS操作系统,所有的讲解和例程都是基于微
张哥编程
2024/12/17
1050
《最新出炉》系列入门篇-Python+Playwright自动化测试-50-滚动条操作
有些页面的内容不是打开页面时直接加载的,需要我们滚动页面,直到页面的位置显示在屏幕上时,才会去请求服务器,加载相关的内容,这就是我们常说的懒加载。还有就是在日常工作和学习中,经常会遇到我们的页面内容较多,一个屏幕范围无法完整展示内容,我们就需要滚动滚动条去到我们想要的地方,所以有时候我们就需要操作滚动条向下滚动的操作。其实前边的文章也提到过滚动条的操作,今天主要是将各种宏哥知道的方法进行一下汇总和总结,方便大家查找和学习。
北京-宏哥
2024/06/11
4230
《最新出炉》系列入门篇-Python+Playwright自动化测试-50-滚动条操作
MFC应用程序——标签控件_IP控件_时间控件_List Control控件_Tree Control控件_命令按钮_列表框_组合框_图片_滚动控件「建议收藏」
【Tab Control 标签控件】 标签控件也比较常见。它可以把多个页面集成到一个窗口中, 每个页面对应一个标签,用户点击某个标签时,它对应的页 面就会显示。 使用标签控件我们可以同时加载多个有关联的页面,用 户只需点击标签即可实现页面切换,方便灵活的进行操作。 每个标签除了可以显示标签文本,还可以显示图标。 标签控件相当于是一个页面的容器,可以容纳多个对话 框,而且一般也只容纳对话框,所以我们不能直接在标签控 件上添加其他控件,必须先将其他控件放到对话框中,再将 对话框添加到标签控件中。最终我们点击标签切换页面时, 切换的不是控件的组合,而是对话框。
全栈程序员站长
2022/09/23
2.7K0
MFC应用程序——标签控件_IP控件_时间控件_List Control控件_Tree Control控件_命令按钮_列表框_组合框_图片_滚动控件「建议收藏」
​Python | GUI编程之tkinter (一)
本文内容为使用Python3的tkinter模块,开发GUI。在阅读本文前,请确保你已经或可能满足以下条件:
LogicPanda
2019/07/30
6.1K0
【二】Windows API 零门槛编程指南——CreateWindow 窗口创建 “万字长篇专业术语全解”
本系列博文几乎没有难啃的“专业术语”,尽量让读者能够看明白文章所述内容,是本系列博文的核心宗旨之一。(由于本人也是由于项目需要,所以才来查阅相关资料,文中出现的错误欢迎指出,共同进步!谢谢!)
1_bit
2020/10/23
1.3K0
【二】Windows API 零门槛编程指南——CreateWindow 窗口创建 “万字长篇专业术语全解”
Vue 滚动条定位问题
作者:matrix 被围观: 9,147 次 发布时间:2018-06-28 分类:零零星星 | 3 条评论 »
HHTjim 部落格
2022/09/26
9370
Vue 滚动条定位问题
漏洞分析丨cve20144113
Microsoft Windows下的 win32k.sys是Windows子系统的内核部分,是一个内核模式设备驱动程序,它包含有窗口管理器、后者控制窗口显示和管理屏幕输出等。如果Windows内核模式驱动程序不正确地处理内存中的对象,则存在一个特权提升漏洞。成功利用此漏洞的攻击者可以运行内核模式中的任意代码。攻击者随后可安装程序;查看、更改或删除数据;或者创建拥有完全管理权限的新帐户。其中CVE-2014-4113就是Win32k.sys中的一个漏洞,该漏洞的根本问题是函数xxxMNFindWindowFromPoint的返回值验证不正确。xxxMNFindWindowFromPoint函数执行后返回win32k!tagWND的地址结构或错误代码-1,-5。在该函数后面将调用函数xxxSendMessage,xxxSendMessage把xxxMNFindWindowFromPoint的返回值作为参数传递。当xxxMNFindWindowFromPoint返回win32k!tagWND地址的时候程序正常执行,但当返回-1,-5的时候传递给xxxSendMessage将造成蓝屏。
极安御信安全研究院
2023/04/20
6070
漏洞分析丨cve20144113
相关推荐
Windows程序设计——窗口键盘消息滚动事件[通俗易懂]
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验