利用Winform实现文字滚动(仅供参考)

本人水平有限,如有写得不对的地方,望指正。为了简单化,做了一个简陋版的滚动控件。本文的内容仅供参考

测试环境:

visual studio 2017 

.net framework 4.0

原理非常简单:

1  先自定义一个继承UserControl的控件,再放置一个Label控件,加一个定时器定时更新Label的x轴的位置即可。

2  滚动原理:Label的位置是相对自定义控件的位置的。Label的位置在最右边时,位置的坐标为(自定义控件的Width,Label的y值);Label的位置在最左边时,位置坐标为(0,Label的y值),所以Label在X方向上的值只能在0到Width之间变化。

效果图如下:

目前只支持文本从左往右滚动或者从右到左滚动

步骤如下:

1  新建名为WinformDemo1的winform项目,.net framework选择4.0

2  新建名为TextScrollControl的类,并编辑如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace WinformDemo1
{public class TextScrollControl: System.Windows.Forms.UserControl{private System.Windows.Forms.Label label1;private string _labelText;private int _speed;private Timer timer = null;private int _speedParam = 1000;private int _maxSpeedParam = 100;private int _minSpeedParam = 1;private int _normalSpeed = 13;private DirectionEnum _direction;private int _gap = 5;#region 自定义属性[Browsable(true), Category("自定义属性"), Description("滚动文本设置")]public string LabelText { set { _labelText = value; Invalidate(); } get { return _labelText; } }[Browsable(true), Category("自定义属性"), Description("滚动速度设置,最大值为100,最少值为1")]public int Speed { set { _speed = value; Invalidate(); } get { return _speed; } }[Browsable(true), Category("自定义属性"), Description("文字滚动的方向")]public DirectionEnum Direction { set { _direction = value; Invalidate(); } get { return _direction; } }public enum DirectionEnum{ RightToLeft,LeftToRight}#endregionpublic TextScrollControl(){InitializeComponent();this.BorderStyle = BorderStyle.FixedSingle;this.label1.Location = new Point(this.Width, this.label1.Location.Y);timer = new Timer();Speed = _normalSpeed;timer.Interval = _speedParam/ Speed;timer.Tick += Timer_Tick;timer.Start();LabelText = this.label1.Text;Direction =DirectionEnum.RightToLeft;}private void Timer_Tick(object sender, EventArgs e){SetControlProperty();SetTextPosition();}/// <summary>/// 设置文字的位置/// </summary>private void SetTextPosition(){if (Direction == DirectionEnum.RightToLeft){if ((this.label1.Location.X - _gap) > 0){this.label1.Location = new Point(this.label1.Location.X - _gap, this.label1.Location.Y);}else{this.label1.Location = new Point(this.Width, this.label1.Location.Y);}}else if (Direction == DirectionEnum.LeftToRight){if ((this.label1.Location.X + _gap) < this.Width){this.label1.Location = new Point(this.label1.Location.X + _gap, this.label1.Location.Y);}else{this.label1.Location = new Point(0, this.label1.Location.Y);}}}/// <summary>/// 设置控件的属性值/// </summary>private void SetControlProperty(){this.label1.Text = LabelText;if (Speed > _maxSpeedParam) Speed = _maxSpeedParam;if (Speed < _minSpeedParam) Speed = _minSpeedParam;timer.Interval = _speedParam / Speed;}private void InitializeComponent(){this.label1 = new System.Windows.Forms.Label();this.SuspendLayout();// // label1// this.label1.AutoSize = true;this.label1.Location = new System.Drawing.Point(239, 10);this.label1.Name = "label1";this.label1.Size = new System.Drawing.Size(41, 12);this.label1.TabIndex = 0;this.label1.Text = "label1";// // TextRollUserControl// this.Controls.Add(this.label1);this.Size = new System.Drawing.Size(283, 34);this.ResumeLayout(false);this.PerformLayout();}}
}

3  生成项目,在工具箱中就可以看到该自定义控件了,如下图:

把它拉进界面后,如下图:

可以设置它的属性值

Direction是滚动的方向,从右到左或者从左到右

LabelText是设置滚动的文本

Speed是滚动的速度,1到100,如果设置的值小于1,则会自动重置为1,如果设置的值大于100时,会自动重置为100

好了,本文到此结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/589001.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

啥是MCU,MCU科普

啥是MCU&#xff0c;MCU科普 附赠自动驾驶学习资料和量产经验&#xff1a;链接 MCU是Microcontroller Unit 的简称&#xff0c;中文叫微控制器&#xff0c;俗称单片机&#xff0c;是把CPU的频率与规格做适当缩减&#xff0c;并将内存、计数器、USB、A/D转换、UART、PLC、DMA等…

数据恢复工具可以恢复所有丢失的文件吗

随着数字时代的快速发展&#xff0c;数据已经成为我们生活与工作中不可或缺的一部分。然而&#xff0c;数据丢失的风险也随之增大。无论是由于误删除、误格式化、病毒感染还是其他意外情况&#xff0c;数据丢失都可能带来不小的损失。在这种情况下&#xff0c;数据恢复工具应运…

java学习之路-类和对象

前言 本文内容&#xff1a; 类的定义及其使用 this的引用 对象的构造及初始化 封装 static成员 代码块讲解 内部类 文章目录 1.类定义和使用 1.1了解什么是面向对象 1.2简单认识类 1.3定义类 1.4栗子 2.类的使用-类的实例化 2.1什么是实例化 2.2类和对象的说明 3.this引…

基因组de novo组装

分以下几个部分&#xff1a; CLR组装 HIFI组装 ONT组装 二、三代数据矫正 组装结果评估 一、CLR组装 下机数据&#xff1a; 主要用那个bam文件 软件&#xff1a;wtdbg2 第一步&#xff1a;bam转fasta文件 参考&#xff1a;https://www.jianshu.com/p/03c7eb11102d # 进行基…

WEB安全测试通常要考虑的测试点

1、问题&#xff1a;没有被验证的输入 测试方法&#xff1a; 数据类型&#xff08;字符串&#xff0c;整型&#xff0c;实数&#xff0c;等&#xff09; 允许的字符集 最小和最大的长度 是否允许空输入 参数是否是必须的 重复是否允许 数值范围 特定的值&#xff08;枚举型&a…

Node.js介绍

Node.js 是一个开源和跨平台的 JavaScript 运行时环境。它是几乎任何类型的项目的流行工具&#xff01;

【二叉树】Leetcode 124. 二叉树中的最大路径和【困难】

二叉树中的最大路径和 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根…

前端学习<三>CSS进阶——04-如何让一个元素水平垂直居中?

前言 老板的手机收到一个红包&#xff0c;为什么红包没居中&#xff1f; 如何让一个子元素在父容器里水平垂直居中&#xff1f;不管是学生还是找工作这个问题点必考&#xff0c;在实战开发中&#xff0c;也应用得非常多。 你也许能顺手写出好几种实现方法。但大部分人的写法…

shell 批量创建用户

代码 rootlocalhost:~ 2024-04-03 15:45:03# cat create_user.sh ######################################################################### # File Name: create_user.sh # Author: eight # Mail: 18847097110163.com # Created Time: Wed 03 Apr 2024 03:…

golang语言系列:学习路线图

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 golang语言系列 文章&#xff0c;主要展示golang语言学习的全路线图 参考&#xff1a;https://github.com/darius-khll/golang-developer-roadmap/blob/master/i18n/zh-CN/ReadMe-zh-CN.md

【星城战记】揭秘成本控制奥秘 如何超越个人开店!

在电玩城行业的竞争中&#xff0c;成本控制和运营管理是决定企业盈利能力和生存空间的关键因素。许多投资者在选择投资项目时&#xff0c;往往忽视了这两个方面的重要性&#xff0c;导致在运营过程中遭遇重重困难。而【星城战记】作为行业内的佼佼者&#xff0c;以其卓越的成本…

科学的分析和解决ROS运行中产生的undefined symbol类报错的方法

在我们运行ROS开源功能包的时候&#xff0c;可能会遇到: undefined symbol类报错&#xff0c;如 slam_gmapping: undefined symbol: _ZN8GMapping 14 sampleGaussianEdm 一、报错原因分析 该问题一般是缺失或者没有找到该功能包所需的某个.so 动态链接库文件。首先&#xff0c;…