移动Panel的滚动条到窗口中间

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

一个组态软件项目,其中一个用来组态图形页的视图窗口需要实现这样一个功能:在该窗口第一次被显示出来时,要求滚动条移动到中间位置。

 

按照软件的设计结构,只要移动一个Panel的滚动条即可。

 

要移动滚动条,只要改变Panel的AutoScrollPosition属性即可。

 

那么,现在的问题是,怎么确定中间位置?

 

AutoScrollPosition的值是一个Point,那么,现在的问题就是想办法计算出该Point的X和Y值。这才是难点所在。

 

要说明这个问题,我这里不得不啰嗦啰嗦C#中窗口的滚动条管理机制。

 

对于一个拥有滚动条的窗口,该窗口的DisplayRectangle属性将被启用,DisplayRectangle描述了该窗口的“虚拟显示区”,也就是通过移动滚动条可以看到的窗口的最大绘图区。用户实时能够看到的那一块区域(实际显示区),使用窗口的Size属性(我们这里只在客户区绘图,所以用它的ClientSize属性)来给出(宽度CX和高度CY)。如下图所示:

image

移动滚动条,实际上就是平移实际显示区,也就是改变实际显示区的位置(X,Y坐标)。

 

由上,把滚动条移动到窗口的中间位置,就是把实际显示区平移到虚拟显示区的中间。计算方法如下:

this.AutoScrollPosition = new Point((this.DisplayRectangle.Width - this.ClientSize.Width) / 2, (this.DisplayRectangle.Height - this.ClientSize.Height) / 2);

 

问题解决得似乎很轻松,不是么?好,让我们试一下活吧。

 

从Panel派生一个新的类,叫ScrollPanel,然后重载其OnVisibleChanged方法。弄完后,你的代码应该看起来象这个样子:

image

不要忘记将ScrollPanel的AutoScroll属性设置成True.

 

 

好,现在用ScrollPanel创建一个实例m_panel,把它Dock到你的窗口中,最后在m_panel中嵌入一个比窗口客户区大得多的控件(比如StaticText). 代码看起来象这样:

image

 

运行你的程序吧,滚动条乖乖地等在了窗口的中间:

image

 

问题解决了吗?似乎是。如果你的窗口上只有一个Dock属性为Fill的Panel,那么,恭喜你,马马虎虎可以了。但如果不幸你在这个窗口上与Panel并列又放置了另一个能够获得焦点的控件,然后在这两个控件间切换一下焦点,怎么样?啊哈,Panel的滚动条复位到左、上角了?!困惑吗?我将在《如何阻止滚动条的自动复位并防止闪烁》中解决这个问题。

关于在Panel控件有滚动条图形如何重绘以及如何加入点击滚动条事件  近在做的项目里有一个Panel画图的功能,完成后,客户又要求此图能够放大。于是查看msdn,直到panel有带有滚动条的功能,在加的过程中,遇到了以下几个问题:1 即使加上 panel1.AutoScroll = True 时,也没有出现滚动条2 有了滚动条后,在移动滚动条后,图片上的点没有清除,又重新绘上新点,造成点变成了线,图形重叠的利害,变成了黑乎乎一片针对以上问题,查了相关资料 阅读详情

相关推荐

Java基础入门 Swing中间容器

在Swing中不仅有JFrame、JDialog这样的顶级窗口,还拥有一些中间容器,这些容器不能单独存在,必须依存在顶级窗口中。常见的是JPanel、JScrollPane。 JPanel:JPanel和AWT中的Panel组件使用方法基本一致,他是一个无边框不能被放大、移动、关闭的面板,它的默认布局管理器是FlowLayout,当然这是可以使用setLayout()方法重新设置的 JScr...

来自师范的学渣 2773

c# panel的拖动和缩放

可以动态创建多个panel,选中后可以拖动,可以删除选中的panel,有需要的可以参考一下,非常实用的例子

WinForm开发中Panel控件的核心应用与高级技巧详解

在桌面应用开发中,容器控件是实现复杂界面布局和功能分区的基石。其核心原理在于通过逻辑分组和统一管理,将相关UI元素组织在一起,从而提升代码的可维护性和界面结构的清晰度。这一技术价值体现在能够高效构建动态内容加载、选项卡切换、可折叠区域等高级交互场景。例如,在C# WinForm开发中,Panel控件作为基础的容器,通过其Dock、Anchor、AutoScroll等关键属性,结合SuspendLayout/ResumeLayout性能优化方法,可以解决界面闪烁、内存管理等常见工程问题。本文聚焦Panel

weixin_30781775的博客 470

C# WinForm中Panel实现用鼠标操作滚动条的实例方法

由于在WinForm中Panel不能直接响应鼠标的滚动事件,只好采用捕获窗体的滚动事件。

framework7---framework7下关于导航栏和工具栏的几种布局类型

静态布局静态布局,导航栏和工具栏流式布局,随页面滚动 .views .view .pages .page .page-content .navbar ........ .toolbar 固定布局固定布

Wbiokr的博客 4378

C# panel控件的移动与扩大

基于 VS2019 基于C#语言。C# panel控件的移动与扩大。

hgaohr1021的博客 745

维护Panel滚动条ScrollBars位置(C#

  我们常将内容放在Panel中,例如文章,GridView控件等....。当内容超出Panel的高、宽时,可能就需要滚动条来进行控制。 当点击页面中按钮产生PostBack时,滚动条总是会回到上面的位置,我们现在要解决的主要就是这个问题。ScrollBar的可选项有:  

雨季不再来的专栏 1万+

C# Panel滚动条初始化位置

在一个Panel面板上,动态加载多个Panel,加载面板时候滚动条的位置是上次关闭之前的位置,有可能造成面板分布出现样式错乱。所以要每次触发事件打开面板时,都要初始化一下滚动条位置。 // 开启滚动条 this.panel1.AutoScroll = true; // 设置滚动条的初始位置 this.panel1.VerticalScroll.Value = 0; ...

骐骥筋力成,志在万里外 3423

C# panel控件滚动条回到起始位

它很丑,但是有效果,目前只找到这个方法。

qq_36700578的博客 544

关于winform中panel中控件不随滚动条移动的解决办法。

我在winform中添加了一个panel容器控件,然后在控件中添加了自己想要的子控件,当这些控件的总的大小大于panel的尺寸时,在把panel的AutoScroll属性设为true的情况下会自动生成出相应的垂直和水平滚动条。 问题:在运行时,在当拖放滚动条鼠标处于按下状态时,panel里面的控件不会随着滚动条移动移动,只有在鼠标up时,也就是拖动结束时,panel里面的控件才会移动

52cwalk的专栏 5919

extjs中滚动条属性_Extjs滚动条处理

bodyStyle :'overflow-x:hidden;overflow-y:scroll', //隐藏水平滚动条,显示用overflow-x:visiblehidden 隐藏scroll :一定有 auto:自动通过这个方法可以显示或隐藏滚动条var form = new Ext.form.FormPanel({frame : true,labelWidth : 80,height : 4...

weixin_39757265的博客 988

GUI 01:GUI 编程概述,AWT 相关知识,Frame 窗口Panel 面板,及监听事件的应用

本文对图形用户界面(GUI)编程进行概述,并对 GUI 的其中一个技术领域 AWT(Abstract Window Toolkit)进行讲述。文章使用 AWT 编写了 Frame 窗口,并为窗口添加了 Panel 面板,同时设置了关闭窗口的监听事件。

积累,沉淀,温故而知新 1699

Panel滚动条拉动时画面就移动

[Question]panel1的滚动条,我鼠标按住滚动条,拉滚动条的时候,为什么画面没有动,要等鼠标松了之后,才动我需要在拉的过程中,画面就要动[Answer]重载Panel1的 Scroll 事件,private void panel1_Scroll(object sender, ScrollEventArgs e)在鼠标拖动的时候,e.Type将是 ScrollEventType.Thumb...

weixin_30576859的博客 291

C#panel的mousewheel事件触发

如果将窗体或容器控件(如Plael控件)的AutoScroll属性设置为True时,那么当窗体或Panel容不下其中的子控件时就会出现 滚动条,通过移动滚动条可以上下显示出窗体或Panel中的全部内容。但是默认情况下滚动条的移...

cuibinmo3519的博客 257

深入探索滚动条的重绘与自定义绘制技术

在自定义滚动条组件的开发中,左箭头和右箭头的设计是用户界面交互的基础。设计思路应当遵循以下原则:一致性:确保箭头的风格与整个应用程序的风格保持一致,以实现界面的和谐。直观性:设计的箭头应当直观地表达其功能,即指示滚动条的滚动方向。可访问性:考虑不同的用户可能对色彩有视觉障碍,应确保足够的对比度,使箭头易于识别。具体的设计方法可以包括:图标设计:使用矢量图形软件设计箭头图标,以确保无论放大或缩小都不会失真。色彩规划。

weixin_34618526的博客 416

nanoScrollerJS插件选项配置:10个必知参数让你的滚动条更强大

想要为你的网站添加美观的Mac OS X风格滚动条吗?nanoScrollerJS是一款轻量级的jQuery插件,专门用于实现优雅的自定义滚动条效果。这款滚动条插件通过简洁的配置选项,让你能够轻松定制滚动条的外观和行为,为网站增添专业感和用户体验。本文将详细介绍nanoScrollerJS的10个核心配置参数,帮助你全面掌握这个强大的滚动条插件。 ## 🔧 1. iOS原生滚动支持:iOSNa

gitblog_01166的博客 742

C# WinForm Panel控件深度解析:从布局原理到性能优化实战

在桌面应用开发中,容器控件是实现界面布局与动态交互的核心组件。其原理在于通过层级化组织子控件,并利用停靠、锚定等机制实现自适应布局,从而提升界面的结构清晰度与可维护性。从技术价值看,合理使用容器不仅能优化视觉分组,更能支撑复杂的动态界面切换与自定义绘制功能,是构建现代化、响应式用户界面的基础。在实际应用场景中,无论是实现经典的上中下三栏布局、可折叠分组框,还是模拟选项卡切换效果,容器控件都扮演着关键角色。本文聚焦于C# WinForm中的Panel控件,深入剖析其核心属性如Dock与AutoScroll,并

weixin_30718391的博客 369

将chart放入panel中出现滚动条_聊天场景在web前端开发中的体验与优化

在日常工作中,如下图的聊天场景是不是很熟悉,没错就是我们再熟悉不过的 QQ 和微信,一个正常的聊天界面大致上是长这个样子的:这种聊天窗口的消息流有两个明显的特点:新的消息和滚动条初始位置需要在列表的底部下拉加载历史消息要在当前消息列表顶部进行衔接一般来说要实现这样的功能,对于前端开发来说都不是难事,只要两步就可以了:在第一屏消息渲染完之后设置容器的 scrollTop 为一个极大值,这样就把...

weixin_39612023的博客 274

WinForm触摸屏友好型Panel手势滚动实现(鼠标模拟触控拖拽)

一套开箱即用的WinForm手势滚动解决方案,专为工业触摸屏、自助终端、电子看板等无鼠标操作环境设计。通过监听鼠标按下、移动和释放事件,在Form1.cs中实时计算拖动偏移量,动态更新Panel的AutoScrollPosition属性,实现内容区域的平滑跟随滚动,完全绕过系统默认滚动条的点击/拖拽交互限制。不依赖第三方库,无需修改控件模板或重写Panel类,所有逻辑集中于事件联动处理,适配Panel内嵌大量子控件、长列表或复杂布局的场景。项目包含完整VS解决方案结构:.sln、.csproj、设计器文件、

m3n5b7v8c9x的博客 256
上一篇: 在.Net中创建和使用自已的私有字体
下一篇: 在XP和Linux上安装配置Eclipse和SVN
gwinner
博客等级 码龄24年 10粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值