MFC CScrollView鼠标拖拽移动滚动条出现回滚问题_城域的博客-程序员资料_mfc onscrollby

技术标签: CScrollView回滚  MFC  

MFC CScrollView鼠标拖拽移动滚动条出现回滚问题

问题分析:逻辑视图较大的时候(10w),使用鼠标拖拽移动滚动条时(单击不会回滚),会在32000左右回滚到0。看到熟悉的32000,应该是在获取滚动条位置时,出现了短字节数据转换到长字节数据时出现的精度丢失问题,通过debug单步调试,发现函数调用层次如下:滚动条位置nPos数据,通过函数一层层的转换和计算后传递到SetScrollPos正式更新滚动条位置。

OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) (垂直方向移动滚动条时调用)

       OnScroll(MAKEWORD(nSBCode, 0xff), nPos);

              OnScrollBy(CSize(x - xOrig, y - yOrig), bDoScroll);

                       SetScrollPos(SB_HORZ, x);(此处更新滚动条位置)

通过打印nPos,当x为0后(回滚后),nPos是一个很大的数0xff280012,所以很有可能是OnHScroll上一层函数将nPos传递到OnHScroll出现问题。查找调用OnHScroll的函数,在wincore.cpp以下函数调用OnHScroll

case AfxSig_SCROLL_REFLECT:
	{
		// special case for WM_VSCROLL and WM_HSCROLL
		ASSERT(message == WM_VSCROLL || message == WM_HSCROLL 
                || message == WM_VSCROLL+WM_REFLECT_BASE 
                || message == WM_HSCROLL+WM_REFLECT_BASE);
		int nScrollCode = (short)LOWORD(wParam);
		int nPos = (short)HIWORD(wParam);   // nPos是short转换的,即不能大于32768
		if (lpEntry->nSig == AfxSig_SCROLL)
			(this->*mmf.pfn_v_u_u_W)(nScrollCode, nPos,
				CWnd::FromHandle(reinterpret_cast<HWND>(lParam)));
		else
			(this->*mmf.pfn_v_u_u)(nScrollCode, nPos);
	}
	break;

可以看到,其中nPos,是short到int转换成的;因为某种原因,short溢出了,变成了负数,传输到OnHScroll后,再次转换成UINT,所以出现了一个很大的数0xff280012。

解决方式:抛开在wincore.cpp调用OnHScroll函数,直接获取滚动条的位置进行更新;在OnHScroll使用GetScrollInfo();函数直接获取滚动条位置,传递下去。


void MyScrollView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    SCROLLINFO si;
    GetScrollInfo(SB_HORZ,&si);
    CScrollView::OnHScroll(nSBCode, si.nTrackPos, pScrollBar);
}

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011995435/article/details/90543834

智能推荐

SSD物体检测(附源代码,可以直接运行)_Tom Hardy的博客-程序员资料_物体检测算法的源代码

关于SSD算法,可直接参考SSD物体检测论文解析 这里只给出SSD物体检测源代码,代码基于谷歌开源的Object Detection Api,可以直接运行。import numpy as npimport osimport six.moves.urllib as urllibimport sysimport tarfileimport tensorflow as tfimpo...

在idea下ssm整合的配置文件_Intelligent_33的博客-程序员资料

1.整个项目的目录结构如下,便于理解2. 如上图,从上到下进行配置(1)首先的db.properties文件的配置db.propertiesjdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatisjdbc.user=rootjdbc.password=root...

kubernetes的云中漫步(五)--kubeadm之dashboard界面部署与使用_zy_xingdian的博客-程序员资料_kubeadm dashboard 语言

kubeadm之dashboard1.因访问dashboard界面时需要使用https,所以在本次测试环境中使用openssl进行数据加密传输:[[email protected] ~]# openssl genrsa -des3 -passout pass:x -out dashboard.pass.key 2048Generating RSA private key, 2048 bit lo...

利用FORCE_MATCHING_SIGNATURE捕获非绑定变量SQL_好记忆不如烂笔头abc的博客-程序员资料

https://www.askmaclean.com/archives/%E5%88%A9%E7%94%A8force_matching_signature%E6%8D%95%E8%8E%B7%E9%9D%9E%E7%BB%91%E5%AE%9A%E5%8F%98%E9%87%8Fsql.htmlselect sql_id, FORCE_MATCHING_SIGNATURE, sql_tex...

Qt4过渡至Qt5_密苏里看雪的博客-程序员资料_qt5 qodbc插件 能否用在qt4

技术在不断进步,新知识也理应不断学习!Qt5的发布带给我无尽的好奇心,然而,受项目影响,一直使用VS2008 + Qt4.8也未曾及时更新。这几天,果断装上VS2010 + Qt5.1,开始研究。Qt4过渡到Qt5不算显著,然而,“模块化”的Qt代码也需要改变项目配置,如使用“headers”,和配置项目构建(如:改变*.pro文件)。QtWidgets作为一个独立的模块

随便推点

Nginx+uWSGI+Django部署web服务器_铁乐与猫的博客-程序员资料_django web的框架和nginx uwsgi

Nginx+uWSGI+Django部署web服务器Nginx+uWSGI+Django部署web服务器环境说明前言搭建项目Django部署编辑luffy/luffy/settings.py编辑luffy/app01/views.py编辑luffy/luffy/urls.py运行并测试uWSGI部署测试运行uWSGI使用uWSGI运行django项目uWSGi热...

【Linux入门到精通系列讲解】Centos 7软件安装的三种方式_李响Superb的博客-程序员资料

centos 软件安装的三种方式Linux下面安装软件的常见方法:一、yum 替你下载软件 替你安装 替你解决依赖关系 点外卖 缺少的东西 外卖解决1、方便 简单2、没有办法深入修改yum install -y tree二、rpm 自己下载软件包 自己安装 自己解决依赖 半成品 缺少的东西 自己解决1、安装 解决依赖复杂rpm -ivh treexxxxxxxxxxx.rpm三、编译 自己下载软件包 自己安装 自己解决依赖 自己做 按照自己口味 按照需求1、自定义2、过程复杂...

liunx 添加永久路由最有效方法之一_linux route 永久路由_格格巫 MMQ!!的博客-程序员资料

redhat和centos添加永久路由的方法:vi /etc/sysconfig/static-routes(该文件默认可能没有,自行创建)添加以下任意一条参数即可,两种写法不同但效果一样1.any net 192.168.5.0/24 gw 192.168.2.52.any net 192.168.5.0 netmask 255.255.255.0 gw 192.168.2.5添加后无论发生设备重启还是网络服务重启都会自动添加路由,也就是永久已验证!在 /etc/sysconfig/networ

Vue学习第八章-webpack的使用_CodeKiang的博客-程序员资料

一、了解webpack作用: 进行模块化打包,他会分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其打包为合适的格式以供浏览器使用工作方式: 把你的项目当做一个整体,通过一个给定的主文件(如:index.js),Webpack将从这个文件开始,找到你的项目的所有依赖文件,使用loaders处理它们,最后打包为一个...

正则表达式的理解_小姜dot的博客-程序员资料

正则表达式的目的就是匹配字符串,匹配字符串可以是我们简单理解的字符串,例如:"zhangsan"但这不是正则表达式美丽所在,它是通过对其他字符的特殊转义来达到复杂匹配字串的支持。这里介绍一下它所支持的基本转义符1 基本正则式1.1) ^   表示文本行的开头eg: "^a"  表示匹配行的第一个字符为"a"的意思1.2) $   表示文本行的结尾eg: "$a"

推荐文章

热门文章

相关标签