windows的组件中,可以说,滚动条是最难的。难就难在如何设置滚动信息上。

首先,在初始化的时候,需要设置SCROLLINFO结构,其中有nMin,nMax,和Page,Pos几个信息。

nMin,nPos一般都设置为0.对于nMax和Page设置就有些技巧。关键是在对page的理解上。page其实就是可见部分的大小。比如,对于一个有滚动条的窗口,page的大小就是客户区(对于垂直滚动条,就是窗口的高度,对于水平滚动条,就是窗口的宽度)。而nMax呢,则是全部要显示的区域。比如对于一个显示文章的程序,如果显示一篇文章,需要1000像素的高度,而窗口只有300像素,那么就可以设置nMax=1000,nPage=300。实际上,我们在滚动条上看到的滑块,就代表者一个页,也就是当前我们看到的窗口。滑块的位置对应的是nPos,大小对应的nPage。

滚动条必须自己处理滚动过程,而窗口的滚动位置、大小都可能变化,所以处理起来也比较麻烦,但是还是有很好的技巧的。

windows发送WM_HSCROLL或者WM_VSCROLL消息来让程序处理滚动。我们可以利用GetScrollInfo获取当前的Pos:即没有发生滚动前的位置。根据滚动的动作:滚动一行、一页或者拖动,我们就可以确定新的位置,用这个位置减去老的位置,就获得偏移量,这个偏移量,就是给ScrollWindow函数调用的。

对于滚动行,用户必须另外指定行的大小

还以上面的为例,简单介绍一下垂直滚动的例子(伪代码,不能编译):

int line=10; //自己定义的行的大小,可以是任何合理的值或者公式
case WM_HSCROLL: 
   SCROLLINFO si;
   si.fMask = SIF_ALL:
   si.cbSize = sizeof(si); 
   GetSCrollInfo(hwnd,SB_VRET,&si); //获得滚动条的信息
   int nPos=si.nPos;   
   switch(LOWORD(wParam))  //wParam的低字是滚动条的动作
    {
         case SB_LINEUP:
               nPos -= line;
               break;
         case SB_LINEDOWN:
              nPos += line;
              break;
         case SB_PAGEUP:
             nPos -= si.nPage;
             break;
        case SB_PAGEDOWN:
             nPos += si.nPage;
            break;
        case SB_THUMBPOSITION:
            nPos = HIWORD(wParam); //wParam的高位是用户拖动的地址
           break;
     }
     //防止越界
    if(nPos>si.nMax) nPos = si.nMax;
    if(nPos<si.nMin) nPos = si.nMin;
   //滚动窗口
   ScrollWindow(hWnd,0,si.nPos-nPos,NULL,NULL); //如果是向下滚动,则偏移量为负值,向上滚动,则是正值
   si.nPos = nPos; //设置新的值
   SetScrollInfo(hwnd,SB_VRET,&si,FALSE);

如果窗口的大小发生了变化,SCROLLINFO可能需要调整。但是这时nPos的位置可能不是0。其实,Pos的值根本不用变化。因为我们使用的都是像素,无论窗口的大小如何变化,即:nPage如何变化,nMax是不变的:除非文章发生变化,所以nPos根本不需要变化。对于一些可变编辑的文章,文章的长度时时变化,也就是nMax在变化,那么我们只要保证nPos不会超出nMin~nMax就可以了。

window下的SCROLLbar的使用技巧相关推荐

  1. Unreal3 window下内存管理实现详解

    Unreal3 window下内存管理实现详解 最近组里面同事加入了一个很牛叉的内存管理代码,勾起我对内存管理的强烈欲望,以前也做过内存管理,在没有遇到U3以前看了3,4种算法(C++游戏编程 这本书 ...

  2. macOS必备APP macOS 下那些鲜为人知的使用技巧

    为了方便各位同学掌握Mac! 我把买来Mac后的一系列操作都给你准备好了! 目录 macOS必备APP Mac常用快捷键 macOS 下那些鲜为人知的使用技巧 macOS必备APP 1.Clean m ...

  3. android 4.4 禁止下拉,Android开发中禁止下拉式的实现技巧

    我们开发项目的时候,经常会看到禁止的情况,而Android开发中并没有直接调用的接口,下面是爱站技术频道小编就给大家介绍的Android开发中禁止下拉式的实现技巧,希望网友们喜欢! 分享给大家供大家参 ...

  4. window下实现在线预览功能

    window下实现在线预览功能 最近用到文档在线预览功能,之前没接触过,一切从零开始,整了一段时间终于实现,现在把方法分享给大家! 一.主要思路 先将其他格式的文档(office文档.txt.图片等等 ...

  5. 在window下使用gemsim.models.word2vec.LineSentence加载语料库文件的格式要求

    在window下使用gemsim.models.word2vec.LineSentence加载语料库文件的格式要求 class LineSentence(object):""&qu ...

  6. window下使用nw.js开发桌面应用程序环境的搭建

    安装node window下去node官网下载长期支持版本或者最新稳定版都可以. 按装nw用来管理和按装nw.js npm install -g nrm # 用来设置npm镜像地址 npm insta ...

  7. window下启动nexus出错Unsupported major.minor version 51

    为什么80%的码农都做不了架构师?>>>    window下启动nexus报错: jvm 1 | java.lang.UnsupportedClassVersionError: o ...

  8. window下安装Memcache

    说来惭愧,从事PHP已经1年多了,但是很多PHP相关的知识都不知道. 前一阵子看到网上流传了很久的面试题,才了解到原来还有memcache这么个东西-_-. memcache 具体是什么Google一 ...

  9. 防遗忘笔记,Fedora交叉编译window下的virt-iewer的汉化

    1. 汉化代码里的资源 virtviewer使用的是gettex的方案是标准的linux里国际化的方案.按道理仅仅须要改动virtualviewer/po/zh_CN.po的文件. 编译. 然后确认在 ...

最新文章

  1. 我使用过的Linux命令之sftp - 安全文件传输命令行工具
  2. Makefile笔记之二------make的递归执行
  3. Linux源码安装步骤
  4. Android ListView 圆角
  5. python 代码分块_[代码全屏查看]-python多进程分块读取文件
  6. 剑网服务器维护,12月31日服务器例行维护公告
  7. 非等值连接,外连接,自连接,子查询
  8. Loading 遮蔽层 简单实现。
  9. linux jar和zip,Linux命令———zip和jar文件压缩解压
  10. 037_自动添加防火墙规则,开启某些服务或端口(适用于 RHEL7)
  11. 第一百七十三节,jQuery,Ajax
  12. keil如何下载STM32芯片F1/F4固件库
  13. 《暮色4:破晓(上)》暮光之城 高清蓝光BD 1080P 720P下载,附中英双字字幕!...
  14. 即时通讯(WebSocket、Socket IO)
  15. 80年代的Mac好用吗?
  16. 笔记本电脑突然无法链接wifi、无法连接宽带
  17. mac下后端开发常用软件
  18. 海通证券否认获批试点 融资融券再度忽悠券商股
  19. Python的wheel文件安装
  20. 安卓中PullToRefresh添加头布局的方法

热门文章

  1. echarts mysql_ECharts实现mysql 数据图表化
  2. python如何输出两列数据_Python-如何将一列分为两列?
  3. 全排列问题(洛谷P1706题题解,Java语言描述)
  4. 【数据结构与算法】带权图最短路径Dijkstra算法
  5. 陈一舟:我们花了大力气找合适团队接力人人网 任务完成
  6. 发布你的程序包到Nuget
  7. 使用 StatsD + InfluxDB + Grafana 搭建 Node.js 监控系统 (二)
  8. struts过滤器和拦截器的区别
  9. HTTP 协议中 Vary 的一些研究
  10. Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:执行手动查询...