C#使用迭代器实现文字的动态效果

目录

一、涉及到的知识点

1.GDI+

2.Thread类

3.使用IEnumerable()迭代器

二、实例

1.源码

2.生成效果:


一、涉及到的知识点

1.GDI+

        GDI+主要用于在窗体上绘制各种图形图像。

        GDI+的核心是Graphics类,该类表示GDI+绘图表面,它提供将对象绘制到显示设备的方法。Graphics类封装了绘制直线、曲线、图形、图像和文本的方法,它是进行一切GDI+操作的基础类。

        本实例使用Graphics类的DrawString方法来绘制动态的文字,该方法常用的语法格式如下:

public void DrawString(string s,Font font,Brush brush,PointF point)参数说明
s:要绘制的字符串。
font:定义字符串的文本格式。
brush:确定所绘制文本的颜色和纹理。
point:指定所绘制文本的左上角。

2.Thread类

        运行C#程序时,如果一个任务执行时间过长,会导致程序主窗体处于“假死”状态。为了避免这种情况发生,可以使用Thread类来创建多线程,即每一个线程完成一个功能,这样就可以有效地避免程序出现“假死”现象。

        本例中使用了Thread thread; //定义线程,thread = new Thread()方法、thread.Start()、thread.Interrupt()、Thread.Sleep()方法。

        其中,thread.Abort();  //已经废弃,用thread.Interrupt();代替。   

3.使用IEnumerable()迭代器

        详见本文作者写的其他文章, C#字符串倒序遍历:Reverse() vs for循环 vs IEnumerable迭代器 vs List<T> vs List<T>迭代器 vs IList<T> vs IList<T>迭代器-CSDN博客  https://wenchm.blog.csdn.net/article/details/136120594

二、实例

        为了使界面具有动态效果,可以在界面中实现一些特殊文字的动态效果。使用迭代器遍历文本字符串中的每一个文字,然后使用GDI+技术在窗体上以不同的字体样式依次绘制每一个文字,以便实现文字的动态效果。

1.源码

// 使用迭代器实现文字的动态效果
// 给窗体添加背景图
using System.Resources;namespace _123
{public partial class Form1 : Form{private Panel? panel1;public Form1(){InitializeComponent();BackgroundImage = Properties.Resources.GetObject("bc");BackgroundImageLayout = ImageLayout.Stretch;StartPosition = FormStartPosition.CenterScreen;Load += Form1_Load;}private void Form1_Load(object? sender, EventArgs e){// // panel1// panel1 = new Panel{Location = new Point(321, 12),Name = "panel1",Size = new Size(250, 83),TabIndex = 0};// // Form1// AutoScaleDimensions = new SizeF(7F, 17F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(600, 416);Controls.Add(panel1);Name = "Form1";Text = "使用迭代器实现文字的动态效果";//Graphics Car_Paint = panel1.CreateGraphics();//实例化绘图对象string CartoonString = "编程词典网";            //定义要绘制的动态文字Character character = new();                   //实例化自定义类对象character.CartoonEffect(panel1, CartoonString);//在窗体上显示动态文字}}class Character{Graphics? graphics;                           //定义Graphics对象static readonly int[] FSize = [20, 25, 30];   //设置字体的大小readonly int Str_block = 5;                   //字体间的间隔readonly Font Str_Font = new("宋体", FSize[0], FontStyle.Bold);//定义字体样式readonly Color Str_Color = Color.Orange;      //定义字体颜色float Str_Width = 0;    //获取字符串的位置float Str_Height = 0;float Panel_W = 0;      //获取控件的宽度float Panel_H = 0;      //获取控件的高度Color Panel_C;          //记录控件的背景颜色float Str_Odd_Width = 0;//获取单个文字的宽度Thread? thread;         //定义线程/// <summary>/// 在Panel控件中绘制动画文字/// </summary>/// <param Panel="C_Panel">显示文字的容器控件</param>/// <param string="C_Str">文字字符串</param>public void CartoonEffect(Panel C_Panel, string C_Str){graphics = C_Panel.CreateGraphics();//为控件创建Graphics对象Panel_H = C_Panel.Height;           //获取控件的高度Panel_W = C_Panel.Width;            //获取控件的宽度Panel_C = C_Panel.BackColor;        //获取控件背景颜色GetTextInfo(C_Str);                 //获取文字的大小及位置graphics.FillRectangle(             //用控件背景填充控件new SolidBrush(Panel_C), 0, 0, Panel_W, Panel_H);DrawFullText(C_Str, 0);             //绘制文字//实例化ParameterizedThreadStart委托线程thread = new Thread(new ParameterizedThreadStart(DynamicText!));thread.Start(C_Str);                //传递一个字符串的参数}/// <summary>/// 获取文字的大小及绘制位置/// </summary>/// <param string="C_Str">文字字符串</param>public void GetTextInfo(string C_Str){SizeF TitSize = graphics!.MeasureString(C_Str, Str_Font); //将绘制的字符串进行格式化Str_Width = TitSize.Width;                           //获取字符串的宽度Str_Height = TitSize.Height;                         //获取字符串的高度Str_Odd_Width = Str_Width / C_Str.Length;            //获取单个文字的宽度Str_Width = (Str_Odd_Width + Str_block) * C_Str.Length; //获取文字的宽度Str_Width = (Panel_W - Str_Width) / 2F;              //使文字居中Str_Height = Panel_H - Str_Height;                   //使文字显示在控件底端}/// <summary>/// 绘制全部文字/// </summary>/// <param string="C_Str">绘制的文字字符串</param>public void DrawFullText(string C_Str, int n){float Str_Place = Str_Width;          //单个字符的位置for (int i = 0; i < C_Str.Length; i++)//遍历字符串中的文字{if (i != n)DrawText(C_Str[i].ToString(), Str_Font, Str_Place, Str_Height); //绘制单个文字Str_Place += Str_Odd_Width + Str_block;                             //获取下一个文字的位置}}/// <summary>/// 绘制单个文字/// </summary>/// <param name="C_Odd_Str">单个文字字符串</param>/// <param name="S_Font">文本样式</param>/// <param name="left"></param>/// <param name="top"></param>public void DrawText(string C_Odd_Str, Font S_Font, float left, float top){graphics!.DrawString(C_Odd_Str, S_Font, new SolidBrush(Str_Color), new PointF(left, top));//绘制字符串中单个文字}/// <summary>/// 通过迭代器实现字符串的遍历/// </summary>/// <param string="n">文字字符串</param>/// <returns>返回单个文字</returns>public static IEnumerable<object> Transpose(string n){if (n.Length > 0){foreach (object i in n)yield return i;}}/// <summary>/// 绘制动态文字/// </summary>/// <param string="C_Str">绘制的文字字符串</param>public void DynamicText(Object C_Str){float tem_left = 0;             //获取当前文字的左端位置float tem_top = 0;              //获取当前文字的顶端位置float tem_width = 0;            //获取文字的宽度float tem_high = 0;             //获取文字的高度float tem_place = Str_Width;    //获取起始文字的位置Font Tem_Font = new("黑体", FSize[0], FontStyle.Bold);//定义字体样式int p = 0;                      //记录字符串中文字的索引号int Str_Index = 0;try{foreach (object s in Transpose(C_Str.ToString()!))//遍历字符串{for (int i = 1; i < 5; i++){if (i >= 3)p = Convert.ToInt16(Math.Floor(i / 2F));elsep = i;DrawFullText(C_Str.ToString()!, Str_Index);Tem_Font = new Font("黑体", FSize[p], FontStyle.Bold);//定义字体样式            SizeF TitSize = graphics!.MeasureString(s.ToString(),Str_Font);//将绘制的单个文字进行格式化 tem_width = TitSize.Width;//获取文字的宽度tem_high = TitSize.Height;//获取文字串的高度tem_left = tem_place - (tem_width - Str_Odd_Width) / 2F;//获取文字改变大小后的左端位置       tem_top = Str_Height - (Str_Height - tem_high) / 2F;  //获取文字改变大小后的顶端位置              DrawText(s.ToString()!, Tem_Font, tem_left, tem_top); //绘制单个文字             Thread.Sleep(200);         //待待0.2秒graphics.FillRectangle(new SolidBrush(Panel_C), 0, 0, Panel_W,Panel_H);//清空绘制的文字}tem_place += Str_Odd_Width + Str_block;//计算下一个文字的左端位置                               Str_Index += 1;                 //将索引号定位到下一个文字}DrawFullText(C_Str.ToString()!, -1);//恢复文字的原始绘制样式//实例化ParameterizedThreadStart委托线程thread = new Thread(new ParameterizedThreadStart(DynamicText!));thread.Start(C_Str);                 //传递一个字符串的参数}catch//这里之所以用异常语句,是在关闭窗体时关闭线程{//thread.Abort();   //已经废弃thread!.Interrupt(); //关闭线程}}}
}

2.生成效果:

 

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

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

相关文章

在UE5中使用体积材质

在平时使用UE的材质设置时&#xff0c;经常会看见Material Domain Volume类型&#xff0c;但是却很少使用。其实该类型可以配合体积雾使用&#xff0c;并制作体积效果以弥补自带雾参数的不足。 操作流程 首先找到场景中的ExponentialHeightFog组件&#xff0c;开启体积雾Volu…

c++阶梯之类与对象(下)

前文&#xff1a; c阶梯之类与对象&#xff08;上&#xff09;-CSDN博客 c阶梯之类与对象&#xff08;中&#xff09;-CSDN博客 c阶梯之类与对象&#xff08;中&#xff09;&#xff1c; 续集 &#xff1e;-CSDN博客 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&a…

Momentum2

攻击机 192.168.223.128 目标机 192.168.223.147 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -A -p- 192.168.223.147 开启了22 80 端口 看一下web界面 源码&#xff0c;robots.txt ,url都观察了一下好像没什么有用信息 扫一下目录 gobuster dir -u http:…

C++面试宝典第28题:寻找丢失的数字

题目 给定一个包含n个整数的数组nums,其中nums[i]在区间[1, n]内。请找出所有在[1, n]范围内,但没有出现在nums中的数字,并以数组的形式返回结果。 示例1: 输入:nums = [4, 3, 2, 7, 8, 2, 3, 1] 输出:[5, 6] 示例2: 输入:nums = [1, 1] 输出:[2] 解析 初看这道题,…

VFH特征的使用(一)

一、SHOT特征描述符可视化 C #include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pcl/io/pcd_io.h> #include <pcl/features/normal_3d_omp.h> #include <pcl/registration/correspondence_estimation.h> #include <boo…

『 C++ 』海量数据处理

文章目录 &#x1f996; 快速找出海量数据中是否存在该整型数据&#x1f996; 有限内存情况下两个文件(海量query)中找出交集&#x1f996; 海量数据中找出只出现1次的数据&#x1f996; 有限内存情况下两个文件(整型)找出交集&#x1f996; 海量数据中找出出现次数不超过2次的…

挑战杯 YOLOv7 目标检测网络解读

文章目录 0 前言1 yolov7的整体结构2 关键点 - backbone关键点 - head3 训练4 使用效果5 最后 0 前言 世界变化太快&#xff0c;YOLOv6还没用熟YOLOv7就来了&#xff0c;如果有同学的毕设项目想用上最新的技术&#xff0c;不妨看看学长的这篇文章&#xff0c;学长带大家简单的…

5G——小区搜索流程

小区搜索流程 小区搜索目标&#xff1a;读取到SIB1. 小区搜索流程概述&#xff1a;SIB1在PDSCH信道承载&#xff0c;承载SIB1的信道在哪个位置由PDCCH告诉&#xff0c;而PDCCH的基本信息由MIB告诉&#xff0c;MIB信息由广播信道PBCH广播出去&#xff0c;物理信道解调需要解调…

vue3-组合式 API

什么是组合式 API&#xff1f; 组合式 API (Composition API) 是一系列 API 的集合&#xff0c;使我们可以使用函数而不是声明选项的方式书写 Vue 组件。它是一个概括性的术语&#xff0c;涵盖了以下方面的 API&#xff1a; 响应式 API&#xff1a;例如 ref() 和 reactive()&a…

HttpRunner自动化测试之实现参数化传递

参数化实现及重复执行 参数化测试&#xff1a;在接口测试中&#xff0c;为了实现不同组数据对同一个功能模块进行测试&#xff0c;需要准备多组测试数据对模块进行测试的过程。 在httprunner中可以通过如下方式实现参数化&#xff1a; 1、在YAML/JSON 中直接指定参数列表 2、…

【C++】C++入门

关于C是什么 C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c;20世纪80年代&#xff0c;计算机界提出了OOP(object or…

静态时序分析:SDC约束命令set_clock_latency详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 时钟的延迟可以使用set_clock_latency命令设置&#xff0c;这里的时钟延迟包括源延迟(source latency)&#xff0c;即时钟对象到时钟源对象&#xff08;时钟定义…

Linux——网络通信TCP通信常用的接口和tcp服务demo

文章目录 TCP通信所需要的套接字socket()bind()listen()acceptconnect() 封装TCP socket TCP通信所需要的套接字 socket() socket()函数主要作用是返回一个描述符&#xff0c;他的作用就是打开一个网络通讯端口&#xff0c;返回的这个描述符其实就可以理解为一个文件描述符&a…

抖音关键词搜索爬虫,抖音API数据接口,抖音商品详情数据采集

抖音商品API接口抖音关键词搜索抖音直播间小黄车抖店商品数据采集 除了微博&#xff0c;小红书&#xff0c;抖音也是一个巨大的流量池。 除了评论&#xff0c;其实关键词搜索视频是更为常见的一个需求&#xff0c;于是上周末抽空开发了下&#xff0c;完成了 mvp。

数据结构——lesson3单链表介绍及实现

目录 1.什么是链表&#xff1f; 2.链表的分类 &#xff08;1&#xff09;无头单向非循环链表&#xff1a; &#xff08;2&#xff09;带头双向循环链表&#xff1a; 3.单链表的实现 &#xff08;1&#xff09;单链表的定义 &#xff08;2&#xff09;动态创建节点 &#…

【数据结构】链表OJ面试题5《链表的深度拷贝》(题库+解析)

1.前言 前五题在这http://t.csdnimg.cn/UeggB 后三题在这http://t.csdnimg.cn/gbohQ 给定一个链表&#xff0c;判断链表中是否有环。http://t.csdnimg.cn/Rcdyc 给定一个链表&#xff0c;返回链表开始入环的第一个结点。 如果链表无环&#xff0c;则返回 NULLhttp://t.cs…

OpenCV识别人脸案例实战

使用级联函数 基本流程 函数介绍 在OpenCV中&#xff0c;人脸检测使用的是cv2.CascadeClassifier.detectMultiScale()函数&#xff0c;它可以检测出图片中所有的人脸。该函数由分类器对象调用&#xff0c;其语法格式为&#xff1a; objects cv2.CascadeClassifier.detectMul…

vue-进阶语法(四)

目录 v-model原理 v-model应用于组件 sync修饰符 ref 和 $refs&#xff08;重点&#xff09; $nextTick v-model原理 原理&#xff1a;v-model本质上是一个语法糖。例如应用在输入框上&#xff0c;就是 value属性 和 input事件 的合写。 作用&#xff1a;提供数据的双向…

[NSSRound#16 Basic]Web

1.RCE但是没有完全RCE 显示md5强比较&#xff0c;然后md5_3随便传 md5_1M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&md5_2M%C9h%FF%0E%E3%5C%20%95r%D4w…

ClickHouse--08--SQL DDL 操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 SQL DDL 操作1 创建库2 查看数据库3 删除库4 创建表5 查看表6 查看表的定义7 查看表的字段8 删除表9 修改表9.1 添加列9.2 删除列9.3 清空列9.4 给列修改注释9.5 修…