当前位置: 首页 > 编程日记 > 正文

winform动态的文字效果

效果图如下

  private void Form1_Load(object sender, EventArgs e){Graphics Car_Paint = panel1.CreateGraphics();//实例化绘图对象string Car_Str = "青岛**软件公司";//定义要绘制的动态文字Character character = new Character();//实例化自定义类对象character.DynamicEffect(panel1, Car_Str);//在窗体上显示动态文字
        }class Character{System.Drawing.Graphics g;//定义Graphics对象static int[] FSize = new int[3] { 20, 25, 30 };//设置字体的大小int Str_block = 5;//字体间的间隔Font Str_Font = new Font("宋体", FSize[0], FontStyle.Bold);//定义字体样式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 th;//定义线程/// <summary>/// 在Panel控件中绘制动画文字/// </summary>/// <param Panel="C_Panel">显示文字的容器控件</param>/// <param string="C_Str">文字字符串</param>public void CartoonEffect(Panel C_Panel, string C_Str){g = C_Panel.CreateGraphics();//为控件创建Graphics对象Panel_H = C_Panel.Height;//获取控件的高度Panel_W = C_Panel.Width;//获取控件的宽度Panel_C = C_Panel.BackColor;//获取控件背景颜色GetTextInfo(C_Str);//获取文字的大小及位置g.FillRectangle(new SolidBrush(Panel_C), 0, 0, Panel_W, Panel_H);//用控件背景填充控件ProtractText(C_Str, 0);//绘制文字//实例化ParameterizedThreadStart委托线程th = new Thread(new ParameterizedThreadStart(DynamicText));th.Start(C_Str);//传递一个字符串的参数
        }/// <summary>/// 获取文字的大小及绘制位置/// </summary>/// <param string="C_Str">文字字符串</param>public void GetTextInfo(string C_Str){SizeF TitSize = g.MeasureString(C_Str, Str_Font);//将绘制的字符串进行格式化Str_Width = TitSize.Width;//获取字符串的宽度Str_Height = TitSize.Height;//获取字符串的高度Str_Odd_Width = Str_Width / (float)C_Str.Length;//获取单个文字的宽度Str_Width = (float)((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 ProtractText(string C_Str, int n){float Str_Place = Str_Width;//单个字符的位置for (int i = 0; i < C_Str.Length; i++)//遍历字符串中的文字
            {if (i != n)ProtractOddText(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 ProtractOddText(string C_Odd_Str, Font S_Font, float left, float top){g.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_w = 0;//获取文字的宽度float tem_h = 0;//获取文字的高度float tem_place = Str_Width;//获取起始文字的位置Font Tem_Font = new Font("黑体", 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;ProtractText(C_Str.ToString(), Str_Index);Tem_Font = new Font("黑体", FSize[p], FontStyle.Bold);//定义字体样式SizeF TitSize = g.MeasureString(s.ToString(), Str_Font);//将绘制的单个文字进行格式化tem_w = TitSize.Width;//获取文字的宽度tem_h = TitSize.Height;//获取文字串的高度tem_left = tem_place - (tem_w - Str_Odd_Width) / 2F;//获取文字改变大小后的左端位置tem_top = Str_Height - (Str_Height - tem_h) / 2F;//获取文字改变大小后的顶端位置ProtractOddText(s.ToString(), Tem_Font, tem_left, tem_top);//绘制单个文字Thread.Sleep(200);//待待0.2秒g.FillRectangle(new SolidBrush(Panel_C), 0, 0, Panel_W, Panel_H);//清空绘制的文字
                    }tem_place += Str_Odd_Width + Str_block;//计算下一个文字的左端位置Str_Index += 1;//将索引号定位到下一个文字
                }ProtractText(C_Str.ToString(), -1);//恢复文字的原始绘制样式//实例化ParameterizedThreadStart委托线程th = new Thread(new ParameterizedThreadStart(DynamicText));th.Start(C_Str);//传递一个字符串的参数
            }catch//这里之所以用异常语句,是在关闭窗体时关闭线程
            {th.Abort();//关闭线程
            }}}

转载于:https://www.cnblogs.com/xuekai-to-sharp/p/3555850.html

相关文章:

使用Mycat构建MySQL读写分离、主从复制、主从高可用

数据库读写分离对于大型系统或者访问量很高的互联网应用来说&#xff0c;是必不可少的一个重要功能。 从数据库的角度来说&#xff0c;对于大多数应用来说&#xff0c;从集中到分布&#xff0c;最基本的一个需求不是数据存储的瓶颈&#xff0c;而是在于计算的瓶颈&#xff0c;…

SharePoint的Reporting Service Viewer Web Part

今天本来打算做一个专门用于Reporting Service报表浏览的SharePoint web part&#xff0c;记得在Reporting Service 2000下有一个viewer的Sample&#xff0c;就想找来参考一下&#xff0c;谁知在C:\Program Files\Microsoft SQL Server\90\Tools\Reporting Services\SharePoint…

7个面向对象常用原则的中英文名、别名、定义及显著特点

单一职责原则 英文名&#xff1a;Single Responsibility Principle(SRP) 别名&#xff1a;无 定义1&#xff1a;一个对象应该只包含单一的职责&#xff0c;并且该职责被完整地封装在一个类中 定义2&#xff1a;就一个类而言&#xff0c;应该仅有一个引起它变化的原因 开闭原则…

常见的“公共标志和说明”英文表达

1、Business Hours 营业时间  2、Office Hours 办公时间  3、Entrance 入口  4、Exit 出口  5、Push 推  6、Pull 拉  7、Shut 此路不通  8、On 打开 ( 放)  9、Off 关  10、Open 营业  11、Pause 暂停  12、Stop 关闭  13、Closed 下班  14、Menu 菜…

【T-SQL】基础——表别名

Som有时候我们需要为表设置别名&#xff0c;这样就可以方便的修改表。 如果在SSMS中&#xff0c;可以点击 Query-> SQL CMD mode --Set Alisa for the table:setvar tablename "[RetailDataWarehouse].[dbo].[FactUnit]" Select ExternalOrderId,COUNT(DISTINCT(R…

数据挖掘的实现流程

文章目录1.数据、信息与知识2.数据挖掘实现流程概览图3.数据准备(step 1)4.数据挖掘(step 2)5.模型的评估解释(step 3)6.知识运用(step 4)7.小结1.数据、信息与知识 2.数据挖掘实现流程概览图 这里提供两张图&#xff0c;以下讲解基于第一张图。 3.数据准备(step 1) Knowl…

设计模式:备忘录模式??

定 义&#xff1a;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态。 这样以后就可以将该对象恢复到原先保存的状态。 结构图&#xff1a; Originator(发起人):负责创建一个备忘录&#xff08;Memento&#xff09;&#xff…

如何用Python批量提取PDF文本内容?

本文为你展示&#xff0c;如何用Python把许多PDF文件的文本内容批量提取出来&#xff0c;并且整理存储到数据框中&#xff0c;以便于后续的数据分析。 问题 最近&#xff0c;读者们在后台的留言&#xff0c;愈发五花八门了。 写了几篇关于自然语言处理的文章后&#xff0c;一种…

常用的3种注入方式

构造注入 指通过构造函数来传入具体类的对象设值注入(Setter注入) 指通过Setter方法来传入具体类的对象接口注入 指通过在接口中声明的业务方法传入具体类的对象

WebService客户端添加SOAPHeader信息

WebService客户端添加SOAPHeader信息 通过JAXBContext创建Marshaller对头信息进行解析为dom&#xff0c;获取WSBindingProvider&#xff0c;使用Headers.creat()创建soap的Header元素&#xff1b; 另外就是&#xff1a;将user转换为dom是为了不在有wsdl生成的LicenceInfo类中增…

MATLAB 向量

MATLAB 向量&#xff1a; 1、MATLAB 行向量&#xff1a; 创建行向量括在方括号中的元素的集合&#xff0c;用空格或逗号分隔的元素。 2、MATLAB 列向量&#xff1a; 创建列向量括在方括号中的元素的集合&#xff0c;使用分号来分隔的元素。 3、

Wiki为什么会流行

我来开题&#xff0c;老段补充一下&#xff0c;嘿嘿。。。Wiki的优点&#xff1a;版本管理和版本比较多作者&#xff0c;多编辑的协作简洁Wiki的缺点(或者第一次用不是很习惯的地方)&#xff1a; 非所见即所得需要学习一下简单的语法文章的分类好像不是很地道所有的链接基本是自…

hung-yi lee_p18_图神经网络(cont.)

文章目录1. 简介2. 怎么把图喂到神经网络里面呢3. 为什么需要GNN4. 训练GNN遇到的问题5. 后面的内容安排6. GNN要做的事&#xff0c;常用数据集和基准7. 第一种实现GNN的方法(Spatial-based GNN)7.1 NN4G7.2 DCNN7.3 DGC7.4 MoNET番外&#xff1a;聚集的几种方法7.5 GAT7.5 GIN…

SQL Server2008附加数据库之后显示为只读

SQL Server2008附加数据库之后显示为只读时解决方法 啰嗦的话就不多说了&#xff0c;直入主题吧&#xff01; 方案一&#xff1a; 碰到这中情况一般是使用的sa账户登录的&#xff0c;只要改为Windows身份验证&#xff0c;再附加数据库即可搞定。 方案二&#xff1a; 使用sa登录…

java maven项目使用sonar审核代码

为什么80%的码农都做不了架构师&#xff1f;>>> 一、pom增加插件 <plugin><groupId>org.sonarsource.scanner.maven</groupId><artifactId>sonar-maven-plugin</artifactId><version>3.1.1</version> </plugin> 二…

ERP成功全球实施十大成功案例

、美铝公司&#xff08;Alcoa&#xff09; 公司简介 美铝公司创办于19世纪80年代中期&#xff0c;目前是世界最大的氧化铝、电解铝和铝加工产品的生产商&#xff0c;活跃于包括基础研究和开发、技术及回收利用等铝工业的所有主要领域。美铝产品应用于航空航天、汽车、包装、建筑…

CentOS安装Oracle全过程

1.准备工作 &#xff08;1&#xff09;安装Java环境 &#xff08;2&#xff09;增大SWAP空间 1.1 切换为root用户 1.2 dd if/dev/zero of/home/swap bs1024 count204800 1.3 /sbin/mkswap /home/swap 1.4 /sbin/swapon /home/swap 1.5 free -m 1.6 vi /etc/fstab 添加 /home/…

Hide the common top menu in Ubuntu 12.04

隐藏&#xff1a;1、sudo apt-get autoremove appmenu-gtk appmenu-gtk3 appmenu-qt2、reboot恢复&#xff1a;1、sudo apt-get install appmenu-gtk appmenu-gtk3 appmenu-qt2、reboot转载于:https://www.cnblogs.com/wiessharling/p/3569616.html

在IBatisNet中使用存储过程

其实在IBatisNet中使用存储过程应该很简单了&#xff0c;应为IBatisNet本来就是基于Sql Mapping的。想着Npetshop中应该有例子看一下就行了&#xff0c;可是查了查map文件&#xff0c;发现没有&#xff0c;只要自己动手搞搞了。 在建立的测试数据库中建立一个简单的存储过程del…

人工智能时代,教育如何做人工智能的“弄潮儿”?

汇新杯新兴科技互联网创新大赛报名火热进行中 汇新杯大赛报名入口&#xff1a;https://www.chuangcheng.org.cn/4552016年人工智能火了&#xff0c;它被行业公认为是继互联网、移动互联网之后的又一重大机遇和挑战&#xff0c;并将成为各个领域的“水电煤”&#xff0c;成为行业…

centOS安装Java环境全过程

1.通过ssh将安装包从本地传到/usr/local文件夹下 2.解压安装包 tar -zxvf /usr/local/jdk-**** 3.给解压后的文件夹改名 mv /usr/local/jdk1.8.0_271 /usr/local/java 4.修改配置文件&#xff0c;配置环境变量 vi /etc/profile export JAVA_HOME/usr/local/java export PAT…

vue组件的传参练习

为什么80%的码农都做不了架构师&#xff1f;>>> 首先是父组件与子组件沟通 父组件告诉子组件&#xff0c;“嘿&#xff0c;孩子&#xff0c;我有话和你说” 组件A代码 <template><section><h1>这是组件</h1><test-B :chile-name"u…

Avayaの初体验

这个题目是不是给了你一种无法抗拒的吸引力并引起了你无限的幻想呢&#xff1f;一个名为Avaya的清纯少女……Stop&#xff01;今天我要说的是电话交换机。说来惭愧&#xff0c;本来是个学通信的&#xff0c;到后来却不务正业搞了软件&#xff0c;到现在突然组织又需要我去搞Ava…

Git fetch和git pull的区别

原文&#xff1a;http://www.tech126.com/git-fetch-pull/ Git中从远程的分支获取最新的版本到本地有这样2个命令&#xff1a;1. git fetch&#xff1a;相当于是从远程获取最新版本到本地&#xff0c;不会自动merge git fetch origin master git log -p master..origin/mas…

powerdesigner中类图的内部类画法

点击一个已有类 点击1看到2 选择3 输入类名 右键类名选择Properties设置内部类的方法和参数 结果 如果在第二步里面找不到inner classfiers怎么办 自己添上

js获取页面属性

一些常用的页面属性获取&#xff1a; 网页可见区域宽&#xff1a;document.body.clientWidth;网页可见区域高&#xff1a;document.body.clientHeight; 类似视口宽度 网页正文全文宽&#xff1a;document.body.scrollWidth;网页正文全文高&#xff1a;document.body.scrollHeig…

jquery-12 折叠面板如何实现(两种方法)

jquery-12 折叠面板如何实现&#xff08;两种方法&#xff09; 一、总结 一句话总结&#xff1a;1、根据点击次数来判断显示还是隐藏&#xff0c;用data方法保证每个元素一个点击次数&#xff1b;2、找到元素的下一个&#xff0c;然后toggle实现显示隐藏。 1、toggle的两种用法…

上传图片并生成缩略图

前台<form id"Form1" method"post" runat"server" enctype"multipart/form-data"> <table id"Table1" cellpadding"1" cellspacing"1" width568 border"1"> …

物联网与互联网的6大区别

物联网互联网通过自动方式获取数据通过人工方式获取数据物联网是虚拟与现实的结合互联网构造了网络虚拟世界物联网是将计算机"装到"一切事务中在互联网时代把一切交给计算机去做物联网提供行业性服务互联网提供全球性公共信息服务物联网实现了信息世界与物理世界的融…

centoros 环境安装

1. nginx rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm yun install nignx 2.php yum install php yum install php-fpm 3. java yum list java* yum install java-1.7.0-openjdk.x86_64 转载于:https://www.cnblogs…