VC实现滚动条的详解

VC(MFC) edit控件滚动条自动到达底部的几种实现 首先是在对EditBox控件建立变量时(Ctrl+左键双击会出现向导),用它的Control里面的CEdit类,category里面的value是绑定的文本框内容字符串,这里我们选定control,是绑定该控件的一个变量(区别于控件ID),命名为m_EditView,CEdit类型;再选定value,命名为editView,CString类型 然后IDC的属性style里面(直接右键建立的控件打 阅读详情


显示区域大小:

我们曾经使用过 GetClientRect 函数来获取显示区域的大小,使用这个函数没有什么不好,只是效率太低,确定显示区域更好的方法是在窗口消息处理程序中处理 WM_SIZE消息。传递给窗口消息处理程序的lParam 参数的低字节包含显示区域的宽度,高字节包含高度。

static int nxClient, nyClient;

case WM_SIZE:

nxClient = LOWORD(lParam);

nyClient = HIWORD(lParam);

return 0;

滚动条的范围和位置:

每个滚动条有一个相关的“范围”和“位置”,位置是一个整数序列。

SetScrollRange(hwnd, iBar, iMin, iMax, bRedraw);

 // iBar 为 SB_VERT 或者 SB_HORZ。如果想要 Windows 根据新范围重画滚动条,则 //设置bRedraw 为 TRUE;

SetScrollPos(hwnd, iBar, iPos, bRedraw);

//iPos 是设置在iMin 和 iMax 之间的整数值

当释放鼠标按键后,程序会收到一个带有SB_ENDSCROLL通知码的消息,一般可以忽略这个消息。

当把鼠标的光标在滑块上按鼠标时,就会产生SB_THUMBTRACK 和 SB_THUMBPOSITION 通知码的滚动条消息。当 wParam 的低字节是 SB_THUMBTRACK时,wParam 的高字节是使用者在拖动滑块时的当前位置。当 wParam 的低字节是 SB_THUMBPOSITION 时,wParam 的高字节是使用者释放滑块的最终位置。

滚动条范围使用 32 位的值也是可以的,但是当使用了32位的时候,wParam(16位) 的高字节就不能准确获得滑块当前的位置了,这时候,需要使用 GetScrollInfo 函数来得到信息。

VC实现滚动条的详解 - DH冰 - //... DH冰的安全笔记

OK,来写代码:

第一步,在 CreateWindow 中添加 WS_VSCROLL 如下:

hwnd = CreateWindow(szClsName, TEXT("Scroll Test."), WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

第二步,添加 WM_VSCROLL 响应:

WM_VSCROLL:

switch(LOWORD){wParam}

{

case SB_THUMBTRACK:

nVPos = HIWORD(wParam);

break;

case SB_PAGEDOWN:

nVPos += nyClient / nyChar;

break;

case SB_PAGEUP:

nVPos -= nyClinet / nyChar;

break;

case SB_LINEDOWN:

nVPos += 1;

break;

case SB_LINEUP:

nVPos -= 1;

break;

}

nVPos = max(0, min(nVPos, NUMLINES - nyClinet / nyChar));

if(nVPos != GetScrollPos(hwnd, SB_VERT)) //滑块位置改变

{

SetScrollPos(hwnd, SB_VERT, nVPos, TRUE); //重设位置

InvalidateRect(hwnd, NULL, TRUE);   //重绘显示区

}

第三步:添加绘制响应

case WM_PAINT:

hdc = BeginPaint(hwnd, &ps);

  for(i = 0; i < NUMLINES; i++)

  {

   y = nyChar * (i - nVPos);

   TextOut(hdc, 0, y, sysmetrics[i].szLabel, lstrlen(sysmetrics[i].szLabel));

   TextOut(hdc, 22*nxCaps, y, 

    sysmetrics[i].szDesc, lstrlen(sysmetrics[i].szDesc));

   SetTextAlign(hdc, TA_RIGHT | TA_TOP);

   TextOut(hdc, 22*nxCaps + 40*nxChar, y, 

    szBuf, wsprintf(szBuf, TEXT("%d"), GetSystemMetrics(sysmetrics[i].Index)));

   SetTextAlign(hdc, TA_LEFT | TA_TOP);

  }

EndPaint(hwnd, &ps);

  第四步,当窗口大小发生改变时重绘

  case WM_SIZE:

nyClient = HIWORD(lParam);

SetScrollRange(hwnd, SB_VERT, 0, NUMLINES - nyClient / nyChar, FALSE);

SetScrollPos(hwnd, SB_VERT, nVPos, TRUE);

if((NUMLINES - nVPos)*nyChar < nyClient && NUMLINES * nyChar > nyClient)

{

nVPos = NUMLINES - nyClient / nyChar;

//PostMessage(hwnd, WM_VSCROLL, (nVPos << 16) & SB_THUMBTRACK, 0);

}

///////////////////////////////////  源码   /////////////////////////////////////////////

#define UNICODE UNICODE
      #include <Windows.h>
     #include "metrics.h"

LRESULT CALLBACK WndProc(
       HWND hwnd,      // handle to window
       UINT uMsg,      // message identifier
       WPARAM wParam,  // first message parameter
       LPARAM lParam   // second message parameter
       )
{
 HDC hdc;
 PAINTSTRUCT ps;
 static int nxChar, nyChar, nxCaps;
 static int nyClient, nVPos;
 int i, y;
 TCHAR szBuf[10];

 switch(uMsg)
 {
 case WM_CREATE:
  TEXTMETRIC tm;
  hdc = GetDC(hwnd);
  GetTextMetrics(hdc, &tm);

  nxChar = tm.tmAveCharWidth;
  nyChar = tm.tmHeight + tm.tmExternalLeading;
  nxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * nxChar / 2 ;
  ReleaseDC(hwnd, hdc);

 case WM_PAINT:
  hdc = BeginPaint(hwnd, &ps);
  for(i = 0; i < NUMLINES; i++)
  {
   y = nyChar * (i - nVPos);
   TextOut(hdc, 0, y, sysmetrics[i].szLabel, lstrlen(sysmetrics[i].szLabel));
   TextOut(hdc, 22*nxCaps, y,
    sysmetrics[i].szDesc, lstrlen(sysmetrics[i].szDesc));

   SetTextAlign(hdc, TA_RIGHT | TA_TOP);
   TextOut(hdc, 22*nxCaps + 40*nxChar, y,
    szBuf, wsprintf(szBuf, TEXT("%d"), GetSystemMetrics(sysmetrics[i].Index)));
   SetTextAlign(hdc, TA_LEFT | TA_TOP);
  }
  EndPaint(hwnd, &ps);
  return 0;
 case WM_SIZE:  
  nyClient = HIWORD(lParam);
  SetScrollRange(hwnd, SB_VERT, 0, NUMLINES - nyClient / nyChar, FALSE);
  SetScrollPos(hwnd, SB_VERT, nVPos, TRUE);
  if((NUMLINES - nVPos)*nyChar < nyClient && NUMLINES * nyChar > nyClient)
  {
   nVPos = NUMLINES - nyClient / nyChar;
   //PostMessage(hwnd, WM_VSCROLL, (nVPos<<16) & SB_THUMBTRACK,0);
  }
  return 0;
 case WM_VSCROLL:
  switch(LOWORD(wParam))
  {
  case SB_THUMBTRACK:
   nVPos = HIWORD(wParam);
   break;
  case SB_PAGEDOWN:
   nVPos += nyClient / nyChar;
   break;
  case SB_PAGEUP:
   nVPos -= nyClient / nyChar;
   break;
  case SB_LINEDOWN:
   nVPos += 1;
   break;
  case SB_LINEUP:
   nVPos -= 1;
   break;
  }
  nVPos = max(0, min(nVPos, NUMLINES - nyClient / nyChar));
  if(nVPos != GetScrollPos(hwnd, SB_VERT))
  {
   SetScrollPos(hwnd, SB_VERT, nVPos, TRUE);
   InvalidateRect(hwnd, NULL, TRUE);
  }
  return 0;
 case WM_CLOSE:
  DestroyWindow(hwnd);
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(
       HINSTANCE hInstance,      // handle to current instance
       HINSTANCE hPrevInstance,  // handle to previous instance
       LPSTR lpCmdLine,          // command line
       int nCmdShow              // show state
       )
{
 static TCHAR szClsName[] = TEXT("HelloWin");
 HWND hwnd;
 MSG msg;
 WNDCLASS cls;
 
 cls.cbClsExtra = 0;
 cls.cbWndExtra = 0;
 cls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 cls.hCursor = LoadCursor(NULL, IDC_ARROW);
 cls.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 cls.hInstance = hInstance;
 cls.lpfnWndProc = WndProc;
 cls.lpszClassName = szClsName;
 cls.lpszMenuName = NULL;
 cls.style = CS_VREDRAW | CS_HREDRAW;
 
 if(!RegisterClass(&cls))
 {
  MessageBox(NULL, TEXT("This program requires Windows NT!"),
   szClsName, MB_ICONERROR);
  return 0;
 }
 
 hwnd = CreateWindow(szClsName, TEXT("Bing's Pad"), WS_OVERLAPPEDWINDOW | WS_VSCROLL,
  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  NULL, NULL, hInstance, NULL);
 
 ShowWindow(hwnd, nCmdShow);
 UpdateWindow(hwnd);
 
 while(GetMessage(&msg,NULL,0,0))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
 
 return msg.wParam;
}

MFC CScrollView 对大视图出现滚动条回滚问题的解决 CScrollView类中,若视图尺寸很大。 如100000*100000;void CLOView::OnInitialUpdate(){ CScrollView::OnInitialUpdate(); SetScrollSizes(MM_TEXT, CSize(100000,100000));}那么当拖动滚动框距离稍大一点时,就会出现回滚,即滚动框又回到0位置。原因:CScrollView使用的滚动条时已经"过时"的函数,即SetScrollRange和SetScrollPos函数。当响应WM_VSCR 阅读详情

相关推荐

MFC实现智能水平滚动条,重写滚动条方法

第一步、首先创建添加一个新类 这里以我的项目为例: 右键点击=》类向导 添加一个新类:CDJListBox,基类为:CListBox 接下来VS就会自动帮你生成2个文件:DJListBox.h 和 DJListBox.cpp 我们在DJListBox.h头文件里面添加: 注意看图添加位置 int AddString( LPCTSTR lpszItem ); int m_nMaxWidth; ...

Alan_Program的博客 845

积累的VC编程小技巧之滚动条

1.设置滚动条的滚动大小 创建一个基于CScrollview的SDI Project(在第6步中选CScrollview) 若你已创建了,这步可以省略。 然后: 改为如 void CTestView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); CSize sizeTotal; // TODO: calculate the total ...

weixin_34241036的博客 225

MFC视图滚动条的基本使用和C语言输出三角形的MFC版本

win7, vc6;新建一个单文档工程;最后一步选择视图类的基类为CScrollView; 代码; void CTestView::OnDraw(CDC* pDC) { CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here int i, j, rows; rows=20; for(i=1; i<=rows; ++i) {

bcbobo21cn的专栏 405

VC 双缓存技术+滚动条

 VC中的绘图有个比较棘手的问题是闪烁,双缓存是解决此类问题的一种方法,但是在系统绘图中,由于可能要加载滚动条,响应鼠标拖动等事件,导致传统的双缓存方法不一定适用,本文提出了一种解决方法能够用统一的框架内实现滚动条,鼠标图型拖动,视口转换以及双缓存绘图.关键字:双缓存,滚动条,鼠标拖动,VC,视口转换  炫丽的软件效果能增强用户体验,用绘图方法展示动人效果就成为了必不可少的一个环节,VC提供了

ke_yang的专栏 2499

HDFView安装及使用教程

简介:直接用记事本打开hdf5文件的话,是一团乱码。HDFView是用来查看hdf5文件的软件,可以免费使用,好多人都有闪退的情况,这是因为没有添加环境变量。

qq_43722079的博客 7万+

极化码自适应CA-SCL译码(极化码译码)

我们知道最初极化码提出来是运用SC译码,但短码和中等长度其译码性(误码率)能不如LDPC码码,,为了提升有限长度极化码的译码性能,我们主要从译码器的性能和极化码的纠错性能来考虑。 SCL:在增加复杂度的情况下,大幅度增加极化码纠错性能,在高信噪比下,与最优ML性能相同(L=32) CA-SCL:改善最小汉明距离(最小汉明距离增大),增加其纠错性能。把CRC和极化码极联。 自适应CA-SCL:CA-SCL译码虽然提升几乎没的纠错性能,但是导致复杂度大幅度增加,为了降低其复杂度,让L自适应,从而降低其复杂度

m0_52610504的博客 3294

VC MFC滚动条(CScrollBar)控件

这里不讲滚动条的使用方法了,只说怎么自绘滚动条控件。 滚动条基本知识参考http://hi.baidu.com/3582077/blog/item/d30e5b38f8709aecb211c7c0.html (PS暂且先自绘水平滚动条,不考虑垂直滚动条,有了这个基础,后面会给出完整的例子,直接看代码就行了,不需要再说明了) 自绘是在滚动条WM_PAINT消息处理函数里完成的。第一

liu_cheng_ran的专栏 1万+

别再为GEE注册发愁了!用谷歌Cloud Project,5分钟搞定谷歌地球引擎账户(保姆级图文)

本文提供2024最新版谷歌地球引擎(GEE)账户注册的保姆级教程,通过谷歌Cloud Project快速完成注册,5分钟极速通关。详细解析注册前的准备、分步图解流程、常见误区及解决方案,帮助用户避开90%的注册陷阱,直达GEE核心功能区。

weixin_42557830的博客 199

VC对话框自带滚动条的使用

VC对话框自带滚动条的使用    http://wenku.baidu.com/view/e8822821aaea998fcc220e64.html 一,使用对话框窗口自带的滚动条,在属性页面中设置即可,如下   二,OnInitDialog()函数中,添加如下滚动条初始化语句        SCROLLINFOvinfo; vinfo.cbSize=sizeof(v

4123

钉钉宜搭低代码开发师高级认证考试题库113题

钉钉宜搭低代码开发师(高级)考试试题题库,多次考试收集整理,判断题,单选题,多选题,排版清晰,查找方便。希望能帮助到大家!!!

qq_40811920的博客 6392

ATGM332D模块串口配置保姆级教程:从9600波特率到NMEA数据过滤,一次搞定

本文提供ATGM332D模块串口配置的详细教程,涵盖从基础硬件连接到高级NMEA数据过滤的全过程。内容包括波特率优化、数据输出频率调整、NMEA语句过滤等实用技巧,帮助开发者快速掌握GNSS模块配置,提升定位系统性能。

weixin_30664051的博客 513

vc 滚动条的使用

滚动条难处理的就是它的消息及滚动窗口,该代码能够运行,有需要的朋友可以拿去用或参考。        1. 创建滚动条              SCROLLINFO info;              ZeroMemory( &info, sizeof(SCROLLI

zhuwanglove的专栏 1660

树莓派安装snowboy

1、树莓派换源 参考链接:https://blog.youkuaiyun.com/qq_43556844/article/details/113615915 2、更新pip3 参考链接:https://blog.youkuaiyun.com/qq_43556844/article/details/113616214 3、存取麦克风 我们使用PortAudio作为音频输入/输出的跨平台支持。我们还使用sox作为快速实用程序来检查麦克风设置是否正确。 sudo apt-get install python-pyaudio python

qq_43556844的博客 1923

VC对话框实现添加滚动条实现滚动效果

对话框滚动条及滚动效果实现,用的api主要有: ScrollWindow, SetScrollInfo, GetScrollInfo, SetWindowOrgEx。涉及的数据结构为SCROLLINFO。实现的原理为:设置窗口显示的滚动条;响应滚动条的消息,在其中记录窗口原点的x和y坐标,并滚动窗口;在OnPaint中设置窗口原点,并绘图。SCROLLINFOtypedef struct tagS...

shifouxinyu的博客 3120

【深度解析TI InstaSPIN】无传感器FOC控制的核心方案

TI InstaSPIN通过“自动识别+通用观测器+开源工具链”的组合,解决了无传感器FOC控制开发难度大、周期长的核心痛点。其核心优势在于快速统一软件观测器的通用性与高精度,以及Fly Start闭环零速启动策略的高可靠性,可适配空调压缩机等家电电机的复杂运行需求。在空调外机双电机控制场景中,InstaSPIN与TI C2000系列MCU(F280013x/F28E12x)完美契合,借助MCU的高性能DSP内核与丰富外设,可实现双电机的精准同步控制,同时降低硬件成本与开发周期。

昔时扬尘处 322

Android Framework WMS面试题及参考答案

什么是 WindowManagerService(WMS)?它的作用是什么? WindowManagerService(WMS)是 Android 系统中非常重要的一个系统服务。它运行在系统进程(system_server 进程)中。 从本质上来说,WMS 是 Android 窗口管理系统的核心。它负责管理系统中的所有窗口,包括应用程序窗口、系统窗口(如状态栏、导航栏)等。 它的主要作用有很多。首先是窗口的创建和销毁。当一个应用请求创建一个窗口时,WMS 会协调各个模块完成窗口的创建工

大模型大数据攻城狮的专栏 2162

VC修改IE滚动条宽度

VC下修改IE滚动条宽度,修改滚动条颜色是一个很简单的问题。但是IE的滚动条的宽度则是一件麻烦事,可能很多人遇到过这个问题。通过我一段时间的研究发现,IE浏览器的滚动条宽度是读取系统的滚动条默认宽度创建的。 所以我在VC进程内部HOOK了一个window的API,自定义API内部如图: 在VC进程启动的时候就HOOK上,HOOK晚了可能就一定读取完了滚动条宽度了。第一次开帖不容易,转载请注明链

taoliangsb的博客 1279

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

使用CScrollView创建滚动条

     滚动条的作用在于当绘制的图形超过客户区的大小的时候,通过滚动条的移动来观测整个图形,VC中提供了CScrollView类来完成滚动条的绘制,在创建工程的时候的第六步,将基类选择为CSrollView。如果之前已经选择CView为基类,请将你的程序进行如下改动:(1)将CXXXView.cpp和CXXXView.h中的CView全部替换为CSrollView(XXX为工程名称)(2)通过C

老鼠生存现状 2705

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

FAQ:如何访问WebBrowser的滚动条

问========================================我使用webbrowser控件,但是想用自己的滚动条,但不知如何得到webbrowser中滚动条的长度,怎么办?谢谢!!2004-10-24答========================================    抱歉拖了很久才回复你的问题。    WebBrowser的滚动条不是一般的Windows

eagleboost's blog 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VC2008 TreeControl显示滚动条设置

在VC2008中显示滚动条设置的属性为,右击树形控件->属性->scroll,设置为True就可以了

董盼山的专栏 1946

vc 实现垂直滚动条对话框

关于SCROLLINFO   滚动条(卷动列)信息,结构定义为:   typedef struct tagSCROLLINFO   {   UINT cbSize ; // set to sizeof (SCROLLINFO)   UINT fMask ; // values to set or get   int nMin ; // minimum ran

CButtonST的专栏 9966

VC记--给位图显示加滚动条

   今天我终于明白了滚动条是怎么一回事。  以前一直认为滚动条是将条外的部分挡掉了,今天才知道,VC中滚动条的效果是将条将的部分剪下来。也就是说条外的部分跟本就是以数据的形式保存在内存中,并未参加到显示中来。  所以要实现滚动条效果首先要做的就是实现图像的剪切效果。而对于一个对话框来说显示在它处面的部分是看不见的,所以在一对话框上实现滚动效果只要实现单方向剪切就行了。当然要实现这样的

hdhhxs0117的专栏 1155

vc学习(二)为视图窗口添加滚动条

修改继承基类 1.首先要确定Document的大小,比如400×450.可以将其大小存储在Document类中,也可以直接去设置   2.在代码中把public:C××View:CView中的CView改为CScrollView,以及消息映射中的CView都改掉。如果你怕出错可以将C××View.cpp和C××View.h中的CView都用查找替换为CScrollView。

7537

带滚动条VC 双缓存技术的

VC中的绘图有个比较棘手的问题是闪烁,双缓存是解决此类问题的一种方法,但是在系统 绘图中,由于可能要加载滚动条,响应鼠标拖动等事件,导致传统的双缓存方法不一定适用, 本文提出了一种解决方法能够用统一的框架内实现滚动条,鼠标图型拖动,视口转换以及双 缓存绘图. 关键字:双缓

wangxiaona356的专栏 1274

vc 滚动条使用

void CDIALOGNOSE::OnSize(UINT nType, int cx, int cy) {  CDialog::OnSize(nType, cx, cy);     SCROLLINFO si;   int nVScrollMax = 0;  m_nVScrollPos = m_nVPageSize = 0;  if (cy   nVScrollMax = m_

baidu_25211613的专栏 881
上一篇: 加密解密函数
下一篇: 把GridView中选中的行导出为Excel文件
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值