VC自绘滚动条

MFC Windows 程序设计[105]之彩色滚动条(附源码) MFC是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学MFC的小伙伴们都觉得MFC比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力...... 故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学MFC的小伙伴,避免走弯路,费时费力。 阅读详情

转载注明出处

http://blog.youkuaiyun.com/xugangjava/article/details/8147386

绘制系统内建的滚动条有两种方法

1.隐藏内建滚动条 然后在父窗口绘制 挡住原有的滚动条,详细可以参考这里

http://blog.sina.com.cn/s/blog_4c3538470100gews.html


2.使用HOOK 拦截 SetScrollInfo。

一直觉得wxpython没有好的皮肤库,本着学习的态度,准备在业余时间写一个支持wxpython的皮肤库。一切处于开始阶段。

为了不影响原有的代码设计,采用dll加载,使用HOOK拦截Windows消息,执行自绘制。

所以这里主要介绍第二种方法来绘制滚动条。

http://msdn.microsoft.com/zh-cn/library/windows/desktop/bb787537(v=vs.85).aspx

在这里"社区附加资源" 可以看到 SetScrollInfo中使用的  SCROLLINFO 结构体必须要满足的关系。

SetScrollInfo中Windows调用滚动条重新绘制的函数。

所以只要在我们的SetScrollInfo 中维持 nMin nMax nPage  nPos 而不执行原函数,

那么系统就不会对滚动条进行绘制了。

下面我们来处理SetScrollInfo

LPSKININFO结构体来将存储滚动条信息,由我们来处理滚动条的信息

typedef struct tagSkinInfo
{
	LONG oldWndProc;
	LONG newWndProc;
	char className[64];

	RECT prevRECT;

	BOOL bTackMouseEvent;
	BOOL bNCTackMouseEvent;
	
	BOOL bMouseStillClick;


	BOOL bMouseLDown;
	BOOL bMouseIn;

	BOOL bDragingThumb;
	DRAGTHUMB dragThumb;
	int curSB;	

	
	BOOL bNCMouseLDown;
	BOOL bNCMouseIn;	

	BOOL blastMouseClick;

	HWND hWnd;
	HWND pWnd;

	SCROLLINFO vScrollInfo;
	SCROLLINFO hScrollInfo;
	BOOL bShowVScroll;
	BOOL bShowHScroll;
	SBRECTINFO sbRect;
	WINRECTINFO winRect;

} 	SKININFO ,FAR *LPSKININFO;

SetScrollInfo实现

BOOL WINAPI ZwNewGetScrollInfo(
	_In_     HWND hwnd,
	_In_     int fnBar,
	_Inout_  LPSCROLLINFO lpsi)
{

	LPSKININFO ps=GetSkinInfo(hwnd);
	if(!ps)
	{
		return g_pOldGetScrollInfo(hwnd,fnBar,lpsi);
	}
	if(SB_HORZ==fnBar)
	{
		HackGetScrollinfo(&ps->hScrollInfo,lpsi);
	}
	else if(SB_VERT==fnBar)
	{
		HackGetScrollinfo(&ps->vScrollInfo,lpsi);
	}
	else if(SB_CTL==fnBar)
	{
		
	}
	else
	{
		return g_pOldGetScrollInfo(hwnd,fnBar,lpsi);
	}
	
	return TRUE;
}

HackSetcrollInfo

int HackSetScrollinfo(LPCSCROLLINFO src,LPSCROLLINFO dest)
{
	dest->fMask=src->fMask;
	dest->cbSize=src->cbSize;

	if(src->fMask&SIF_RANGE)
	{
		dest->nMax=src->nMax;
		dest->nMin=src->nMin;
	}

	if(src->fMask&SIF_PAGE)
	{
		dest->nPage =  src->nPage;
		//check page
		int maxPage= dest->nMax - dest->nMin+1 ;
		int minPage=0;
		if ( dest->nPage >(UINT)maxPage )
		{
			dest->nPage = maxPage-1;
			dest->nPos=src->nMin;
		}
		else if(dest->nPage<(UINT)minPage)
		{
			dest->nPage = minPage;
		}
		else
		{
			dest->nPage=src->nPage;
		}
	}
	if(src->fMask&SIF_POS)
	{	
		dest->nPos=src->nPos;
		//check pos
		int minPos=dest->nMin;
		int maxPos;
		if(dest->nPage-1>0)
		{
			maxPos=dest->nMax -dest->nPage+1;
		}
		else
		{
			maxPos=dest->nMax;
		}

		if(dest->nPos<minPos)
		{
			dest->nPos=minPos;
		}
		else if(dest->nPos>maxPos)
		{
			dest->nPos=maxPos;
		}

	}
	if(src->fMask&SIF_TRACKPOS)
	{
		dest->nTrackPos=src->nTrackPos;
	}

	if(src->fMask&SIF_DISABLENOSCROLL)
	{
		dest->nPos=0;
		dest->nTrackPos=0;
	}

	if(dest->nMax-dest->nMin<=0)
	{
		dest->nPos=0;
		dest->nTrackPos=0;
	}
	return dest->nPos;
}


在GetScollInfo里面 直接取我们内存中的SCROLLINFO 信息就可以了

BOOL WINAPI ZwNewGetScrollInfo(
	_In_     HWND hwnd,
	_In_     int fnBar,
	_Inout_  LPSCROLLINFO lpsi)
{

	LPSKININFO ps=GetSkinInfo(hwnd);
	if(!ps)
	{
		return g_pOldGetScrollInfo(hwnd,fnBar,lpsi);
	}
	if(SB_HORZ==fnBar)
	{
		HackGetScrollinfo(&ps->hScrollInfo,lpsi);
	}
	else if(SB_VERT==fnBar)
	{
		HackGetScrollinfo(&ps->vScrollInfo,lpsi);
	}
	else if(SB_CTL==fnBar)
	{
		
	}
	else
	{
		return g_pOldGetScrollInfo(hwnd,fnBar,lpsi);
	}
	
	return TRUE;
}



void HackGetScrollinfo(LPCSCROLLINFO src,LPSCROLLINFO dest)
{

	if(dest->fMask&SIF_RANGE)
	{
		dest->nMax=src->nMax;
		dest->nMin=src->nMin;
	}

	if(dest->fMask&SIF_PAGE)
	{
		dest->nPage =  src->nPage;
	}

	if(dest->fMask&SIF_POS)
	{	
		dest->nPos=src->nPos;
	}

	if(dest->fMask&SIF_TRACKPOS)
	{

		dest->nTrackPos=src->nTrackPos;
	}


	dest->cbSize=src->cbSize;
}



关于绘制方面

nPage/(nMax-nMin)=滑块长度/滚动条的总长度

实现拖动,鼠标点击滑块并持续按下

SetCapture

鼠标右键UP

ReleaseCapture

如果是水平滑块 记录按下的水平X坐标 nPos 初始X 初始nPos

OnMouseMove里面

(鼠标当前X位置 - 初始X)/(滚动条滑槽长度-滚动条滑块长度)= offset /(nMax-nMin -nPage)

计算得到offset

设置nTrackPos=offset+初始nPos,

SendMessage(ps->hWnd,WM_VSCROLL,MAKEWPARAM(SB_THUMBTRACK,nTrackPos),NULL);

那么视图位置就会切换了

垂直同理

涉及内容和代码比较多,可能叙述不是很详尽 , 个人觉得提供思路比将全部代码贴出来好,有兴趣的话可以去研究一下。




MFC滚动条自绘 MFC实现滚动条自绘,VS2008实现 立即下载

相关推荐

vc自绘滚动条

在listctrl中自绘滚动条,自己动手 丰衣足食

VC MFC滚动条(CScrollBar)控件

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

liu_cheng_ran的专栏 1万+

visual c++自定义滚动条外观 制作五颜六色的滚动条(水平滚动条,垂直滚动条).zip

vc自定义滚动条外观 制作五颜六色的滚动条(水平滚动条,垂直滚动条).zip

自绘滚动条记录

  Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE

crybird的C/C++ 6986

修复ASUS in WinRE教程

暑假入手了天选三,发现是win11家庭版,本来想着家庭版将就一下无所谓,结果在使用的过程中发现相较于专业版真的是不能比,于是自己就重装了系统,发现ASUS in WinRE入口不见了,折腾半天最后成功修复。

weixin_46202629的博客 1万+

从零开始 使用OMNET++结合VEINS,INET和SUMO的联合仿真

搭建仿真的环境,导入VEINS和INET开源库,使用INET库中提供的网络协议和功能模型来模拟通信协议和网络功能,使用SUMO创建道路网络和车辆轨迹,并导出到OMNeT++中 在OMNeT++中使用VEINS通过socket和SUMO连接,借助VEINS实现的TRACI接口来设置车辆相关的行为和场景,最后在OMNET++中结合VEINS,SUMO和INET运行联合仿真实验,并分析车辆在遇到紧急情况下的通信状况和具体行为

mjmmm的博客 1万+

[MFC] 对话框自带滚动条的使用

       最近在整理一个别人的MFC程序的时候,发现对话框太大了,屏幕显示不下,最后决定加一个对话框自带的滚动条,以垂直滑动条为例,具体操作如下: 1.添加垂直滑动条:右键对话框——>属性,将Vertical Scrollbar状态改为True。             ...

Loewen丶的小窝 9255

大津法(OTSU)点云强度信息分割

大津法(OTSU)是一种灰度图像自适应的阈值分割方法,大津法根据图像的灰度分布,将图像分成背景和前景两部分,前景就是需要按照阈值分割出来的部分。由于点云的强度信息的特性,也可以利用此方法进行分类,但需要保证信息干扰较少,例如道路标线分割等场景较为适用。

qq_48694523的博客 965

vc循序渐进实现仿QQ界面(六):异型菜单与内建滚动条自绘

本篇演示实现仿QQ界面的异型菜单与滚动条自绘。 先讲解一下如何实现QQ的圆角菜单,这个要用到HOOK了,因为菜单是一种特殊的窗口,无法用FindWindow或通过HMENU来获取到窗口句柄,也就无法子类化。必须下钩子,这里下的是WH_CALLWNDPROC的钩子: C/C++ code BOOL QQMenu::InstallHook() { if(m_hMenuHook ==

Mirage520的专栏 2631

华为OD机考双机位C卷 - AI处理器组合 (Java & Python & JS & GO & C++ & C)

> 2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 华为OD机试双机位C卷真题目录点击查看: [【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)](https://blog.youkuaiyun.com/banxia_frontend/article/details/155503868)

算法大师! 231

在 SAP BTP ABAP 环境中构建多租户应用:从架构到实战

ABAP多租户应用架构解析 本文详细介绍了SAP BTP中ABAP环境的多租户应用架构,重点阐述了其核心组件及协作机制。在云原生SaaS模式下,多租户架构使多个客户能共享同一套ABAP平台,同时保持数据和配置隔离。架构包含三层:平台与子账户层、多租户应用与平台服务层(含Approuter、ABAP Solution service、XSUAA等核心组件)、ABAP系统与租户层。文章深入分析了各组件功能,包括Approuter的路由机制、ABAP Solution service的自动资源调度、XSUAA的安

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 214

孙鑫VC学习笔记(图形的保存和重绘)

孙鑫VC学习笔记 11(1)第11课  如何让CDC上输出的文字、图形具有保持功能 1.创建4个菜单,为其添加消息响应,用成员变量保存绘画类型。添加LButtonDown和Up消息。2.当窗口重绘时,如果想再显示原先画的数据,则需要保存数据。为此创建一个新类来记录绘画类型和两个点。class CGraph  {public:CPoint m_ptOrigin;//起点CPoint m_

1997

YOLOv11涨点改进 | Conv篇/小目标改进 | YOLOv11引入SPDConv卷积特征无损下采样模块,增加YOLOv11小目标P2检测层(助力小目标任务高效涨点)

本文提出了一种创新的SPDConv模块来优化YOLOv11模型,通过空间到深度(SPD)层和非步幅卷积层实现特征无损下采样。该方法有效解决了传统CNN中因跨步卷积和池化层导致的细粒度信息丢失问题,特别提升了小目标检测性能。实验表明,SPDConv在目标检测和图像分类任务中显著优于现有SOTA模型。文章详细介绍了模块原理、核心代码实现,并提供了YOLOv11集成SPDConv的具体方法,包括配置文件修改和P2层增强等优化技巧。该技术为计算机视觉任务提供了一种高效的特征保留方案。

Ai缝合怪、助力小伙伴高效发论文 586

转一个仿QQ界面(VC实现)

转一个仿QQ界面(VC实现) 摘自:http://topic.youkuaiyun.com/u/20100519/21/05d4822d-c59c-413d-abd3-6c26149b8dd9.html 循序渐进实现仿QQ界面(一):园角矩形与双缓冲贴图窗口 http://topic.youkuaiyun.com/u/20100108/10/EBE0AAE8-0148-417B-BA80-EF1119

http://www.softwareace.cn 王牌软件 2372

ComfyUI 汉化教程(中文界面)

如果你对翻译的结果不满意,还可以进行修改。首先,进入目录,可以看到该目录中有很多 JSON 文件:打开 JSON 文件,找到要修改的内容,修改对应的Value值即可:最后,重启 ComfyUI 即可。

水滴的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

循序渐进实现仿QQ界面(六):异型菜单与内建滚动条自绘

本篇演示实现仿QQ界面的异型菜单与滚动条自绘。 先讲解一下如何实现QQ的圆角菜单,这个要用到HOOK了,因为菜单是一种特殊的窗口,无法用FindWindow或通过HMENU来获取到窗口句柄,也就无法子类化。必须下钩子,这里下的是WH_CALLWNDPROC的钩子: BOOL QQMenu::InstallHook(){ if(m_hMenuHook == NULL)

临风的专栏 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

隐藏CListCtrl滚动条

今天做自绘CListCtrl的滚动条,需要先隐藏CListCtrl的自带滚动条,然后再将自己绘制的继承自CStatic的类,封装成滚动条,移动到CListCtrl原滚动条所在位置即可。但是遇到个头疼的问题,CListCtrl的滚动条隐藏不了。查询了好多资料,终于找到了答案: (以下文章摘自  http://blog.sina.com.cn/s/blog_48f93b530100eg3z.htm

学而不思则罔 2646

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VC++/MFC精讲多练#004:DIY一个漂亮的滚动条控件

http://hi.topsage.com/thread-2316243-1-1.html       滚动条处处可见,一次性展示不完整,要用它拖动查看全部,而且下载的软件,滚动条漂亮多样,本文就是一步步和大家一起制作一个比较漂亮的滚动条。 严格来说这个滚动条,不是Scrollbar,为了DIY一个漂亮的滚动条,这里我们用CStatic控件。 要实现自定义滚动条控件,主要有三种方法

phenixyf的专栏 3908

MFC自绘控件学习总结第二贴

      MFC自绘控件学习总结第二贴              分类: mfc 2011-07-11 21:21 2119人阅读 评论(6) 收藏 举报 mfcmenuapic 首先感谢大家对第一帖的支持,应一些网友烈要求下面我在关于上一贴的一些补充和说明(老鸟可以无视) 这一贴是实战+理论不知道第一帖的先看第一帖: http://topic.c

阿特图 1013

VC 双缓存技术+滚动条

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

ke_yang的专栏 2499

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

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

4123

VC修改IE滚动条宽度

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

taoliangsb的博客 1279

vc 滚动条的使用

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

zhuwanglove的专栏 1660

使用CScrollView创建滚动条

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

老鼠生存现状 2705
上一篇: Py2exe 打包后图标不显示
下一篇: SQL删除树形结构
xugangjava
博客等级 码龄16年 83粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值