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

news2024/11/22 6:01:16

目录

一、涉及到的知识点

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));
                        else
                            p = 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.coloradmin.cn/o/1452404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能专题:基础设施行业智能化的基础设施,自智网络双价值分析

今天分享的是人工智能系列深度研究报告&#xff1a;《人工智能专题&#xff1a;基础设施行业智能化的基础设施&#xff0c;自智网络双价值分析》。 &#xff08;报告出品方&#xff1a;埃森哲&#xff09; 报告共计&#xff1a;32页 自智网络驱动的电信产业变革 经过多年的…

mysql-E-R图的组成要素及其画法

一、概念结构设计-E-R图方法 实体关系图&#xff1a; 简记E-R图&#xff0c;是指以实体、关系、属性三个基本概念概括数据的基本结构&#xff0c;从而描述静态数据结构的概念模式。 实体型(Entity)&#xff1a; 具有相同的特征和性质的集合体&#xff0c;用实体名及其属性名来…

SW2000TSN-千兆百兆车载以太网TSN交换机

更多资讯可以进入官网查看或者联系我们http://www.hdn-vdo.com

智慧公厕的主要应用

在现代社会中&#xff0c;随着城市化进程的加速推进&#xff0c;公共卫生设施的建设和管理变得愈加重要。而智慧公厕作为一种新型城市公共设施&#xff0c;正以其智能化、高效化的特点&#xff0c;成为改善城市卫生环境的重要手段。智慧公厕运用物联网、互联网、大数据、云计算…

SAP PP学习笔记- 豆知识02 - 品目要谁来维护?怎么决定更不更新品目的数量金额?

其实都是在品目类型的Customize中设定的。 咱们这里简单试着说一下什么场景使用。 1&#xff0c;SAP中品目有很多View&#xff0c;都要由哪些部门来维护呢&#xff1f; 其实就是谁用谁维护呗。 在新建一个品目的时候&#xff0c;品目Type本身就决定了该品目要由哪些部门来维…

《Go 简易速速上手小册》第5章:并发编程(2024 最新版)

文章目录 5.1 Goroutines 的基础 - Go 语言中的轻盈舞者5.1.1 基础知识讲解5.1.2 重点案例&#xff1a;并发下载器功能描述实现代码扩展功能 5.1.3 拓展案例 1&#xff1a;网站健康检查功能描述实现代码扩展功能 5.1.4 拓展案例 2&#xff1a;并发日志处理器拓展案例 2&#xf…

异质结太阳能电池中氢化本征非晶硅的设计

在硅异质结太阳能电池&#xff08;SHJ&#xff09;中&#xff0c;pn结由两种不同形貌的硅形成&#xff0c;即一种是n型晶体硅&#xff08;c-Si&#xff09;&#xff0c;另一种是p掺杂&#xff08;III族&#xff09;元素掺杂&#xff09;非晶硅&#xff08;a-Si&#xff09;。许…

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

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在静态时序分析&#xff1a;SDC约束命令create_clock详解一文的最后&#xff0c;我们谈到了针对理想(ideal)时钟&#xff0c;可以使用set_clock_transition命令直…

java数据结构与算法刷题-----LeetCode696. 计数二进制子串

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 法一&#xff1a;时间复杂度O(n).空间复杂度O(n)2. 法二&…

【C++ QT项目2】——高仿安信可串口调试助手

【C QT项目2】——高仿安信可串口调试助手 1. 项目概述2. 项目UI设计3. 串口通信核心代码开发3.1 QSerialPort介绍及示例3.2 扫描系统串口3.3 数据的收发3.4 定时发送&#xff08;QT定时器&#xff09;3.5 HEX显示与发送 4. 串口调试助手功能的优化4.1 串口的实时扫描4.2 获取系…

skimage库简介

scikit-image 是专注于图像处理的Python包&#xff0c;全称是scikit-image SciKit。该包由python语言编写&#xff0c;由scipy 社区开发和维护&#xff0c;使用原生的Numpy数组作为图像对象。 一、skimage简介 skimage&#xff08;scikit-Image&#xff09;是基于python开发的…

petalinux安装

跟着正点原子文档安装的&#xff0c;记录一下 1. 安装包下载 xilinx官网&#xff08;没有注册需要注册&#xff0c;注册比较慢&#xff0c;嫌弃耽搁时间直接用正点原子网盘里下好的&#xff09; https://china.xilinx.com/support/download/index.html/content/xilinx/zh/dow…

人工智能学习与实训笔记(十四):Langchain Agent

0、概要 Agent是干什么的&#xff1f; Agent的核心思想是使用语言模型&#xff08;LLM&#xff09;作为推理的大脑&#xff0c;以制定解决问题的计划、借助工具实施动作。在agents中几个关键组件如下&#xff1a; Agent&#xff1a;制定计划和思考下一步需要采取的行动。Tools…

拿捏单链表

目录 引言 一&#xff1a;链表的定义 二&#xff1a;单链表的定义 三&#xff1a;单链表的增删查改 1.单链表增删查改及遍历的声明 注&#xff1a;在测试中创建指向头结点的指针plist 2.二级指针应用的说明 3.单链表的遍历 4.创建节点 5.单链表的插入 (1)头插 …

【深度学习:DICOM 注释工具】在 DICOM 注释工具中寻找的 7 个功能

【深度学习&#xff1a;DICOM 注释工具】在 DICOM 注释工具中寻找的 7 个功能 原生 DICOM 支持原生 3D 注释易于使用的界面DICOM 图像的自动注释质量控制功能审计跟踪SOC2 和 HIPAA 合规性 如果您尝试为医疗 AI 模型创建训练数据&#xff0c;您可能已经使用了免费的开源工具&am…

html从零开始9:javaScript简介,语句、标识符,变量,JavaScript引入到文件【搬代码】

javaScript简介 javaScript语句、标识符 变量 var num 10; var就是固定声明,num就是变量名&#xff0c;10就是变量&#xff1b;<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Comp…

【pyopenGL编程手册- 01/20】pyopenGL安装和简要说明

目录 一、说明二、测试系统安装的健康性三、安装64位的openGL四、写给程序员的4. 1 函数库介绍4.2 库内函数的命名 五、常见库的函数介绍5.1 OpenGL 核心库 GL5.2 OpenGL 实用库 GLU5.3 OpenGL 工具库 GLUT5.4 Windows 专用库 WGL 六、错误引发点和异常追踪6.1 错误检查开关6.…

人工智能学习与实训笔记(五):神经网络之推荐系统处理

目录 ​​​​​​​七、智能推荐系统处理 7.1 常用的推荐系统算法 7.2 如何实现推荐​​​​​​​ 7.3 基于飞桨实现的电影推荐模型 7.3.1 电影数据类型 7.3.2 数据处理 7.3.4 数据读取器 7.3.4 网络构建 7.3.4.1用户特征提取 7.3.4.2 电影特征提取 7.3.4.3 相似度…

TenorFlow多层感知机识别手写体

文章目录 数据准备建立模型建立输入层 x建立隐藏层h1建立隐藏层h2建立输出层 定义训练方式建立训练数据label真实值 placeholder定义loss function选择optimizer 定义评估模型的准确率计算每一项数据是否正确预测将计算预测正确结果&#xff0c;加总平均 开始训练画出误差执行结…

C++初阶(十一) list

一、list的介绍及使用 1.1 list的介绍 list的文档介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点…