17.2 图形绘制7

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

17.2.9 字体

17.2.9.1 Font类

Font类定义特定的文本格式,包括字体、字号和样式特性。

Font常用属性:

  1. Name:字体名称。
  2. FontFamily:获取与此FontFamily关联的 Font。
  3. Bold:是否设置为粗体。
  4. Italic:是否设置为斜体。
  5. Underline:是否设置下划线。
  6. Strikeout:是否设置删除线(文字中间有一横线)。
  7. Unit:度量单位,包括Point(打印机点,1/72 英寸)、Pixel(像素)等。
  8. Size:以设置的Unit为单位的字体大小。
  9. Style:获取此 Font 的样式信息。这是一个FontStyle枚举,包含以下成员:
  1. Bold:粗体。
  2. Italic:斜体。
  3. Regular:常规。
  4. Strikeout:删除线。
  5. Underline:下划线。
  1. Height:获取此字体的行距。

Font构造函数常用的重载版本:

1、public Font( FontFamily family, float emSize )

参数说明:

  1. familyName:字体名称。
  2. emSize:大小(单位:磅)。

2、public Font( FontFamily family, float emSize, FontStyle style )

参数说明:

  1. family:新字体的 FontFamily。
  2. emSize:大小(单位:磅)。
  3. style:新字体的FontStyle,这是一个FontStyle枚举。
17.2.9.2 FontFamily类

FontFamily类定义有着相似的基本设计但在形式上有某些差异的一组字样。

FontFamily常用属性:

  1. Families:静态成员,返回一个包含与当前图形上下文相关的所有FontFamily对象的数组。
  2. Name:获取此 FontFamily 的名称。

FontFamily常用方法:

  1. IsStyleAvailable:指定的 FontStyle 枚举是否可用。
17.2.9.3 InstalledFontCollection类

InstalledFontCollection 类表示安装在系统上的字体,它位于System.Drawing.Text命名空间下。

InstalledFontCollection常用属性:

  1. Families:获取关联的FontFamily对象的数组,这个数组包含了计算机上安装的字体。在实际使用时,此属性和FontFamily的Families属性类似。

【例 17.22【项目:code17-022】枚举本地计算机上安装的字体。

        private void Form1_Load(object sender, EventArgs e)

        {

            comFont.DropDownStyle = ComboBoxStyle.DropDownList;

            //获得字体名称

            //InstalledFontCollection 允许您获取使用 Families 属性运行应用程序的计算机上安装的字体系列的列表--Msdn

            InstalledFontCollection Installfont = new InstalledFontCollection();

            //开始枚举字体名称并加入到comFont中

            //foreach(FontFamily ff in FontFamily.Families)

            //或者

            foreach (FontFamily ff in Installfont.Families)

                comFont.Items.Add(ff.Name);

            comFont.Text = comFont.Items[0].ToString();

        }

        private void comFont_SelectedIndexChanged(object sender, EventArgs e)

        {

            //使用comFont中选择的字体

            Font f =new Font(comFont.Text, 12);

            //lblFontShow的文本为选择字体的名称

            lblFontShow.Text = f.Name;

            //lblFontShow的字体为选择的字体

        l

运行结果如下图所示:

图17-25 枚举并显示选中的字体

17.2.9.4 绘制字符串

在Graphics上绘制字符串的方法是DrawString,常用的一个重载版本:

public void DrawString( string s, Font font, Brush brush, PointF point )

参数说明:

  1. s:要绘制的字符串。
  2. font:Font,定义字符串的文本格式。
  3. brush:Brush,确定所绘制文本的颜色和纹理。
  4. point:PointF结构,指定所绘制文本的左上角。

【例 17.23【项目:code17-023】绘制字符串。

        private void button1_Click(object sender, EventArgs e)

        {

            //声明一个字体名称为隶书,大小20,粗体,以点为单位的Font

            Font f = new Font("隶书", 20, FontStyle.Bold, GraphicsUnit.Point);

            //需要绘制的字符串

            string strDrawString = "绘制字符串:" + f.Name;

            //绘制字符串的左上角位置

            Point posDrawString = new Point(10, 20);

            Graphics g = this.CreateGraphics();

            //使用DrawString方法绘制字符串

            g.DrawString(strDrawString, f, new SolidBrush(Color.Red), posDrawString);

            g.Dispose();

        }

运行结果如下图所示:

图17-26 绘制字符串

DrawString方法另一个重载版本指定在一个矩形区域内绘制字符串:

public void DrawString( string s, Font font, Brush brush, RectangleF layoutRectangle )

参数说明:

  1. s:要绘制的字符串。
  2. font:Font,定义字符串的文本格式。
  3. brush:Brush,确定所绘制文本的颜色和纹理。
  4. ayoutRectangle:RectangleF 结构,指定所绘制文本的位置。

【例 17.24【项目:code17-024】在指定的矩形区域内绘制字符串。

        private void button1_Click(object sender, EventArgs e)

        {

            Font f = new Font("隶书", 20, FontStyle.Bold, GraphicsUnit.Point);

            string strDrawString = "绘制字符串:" + f.Name;

            //绘制字符串的矩形区域

            Rectangle posDrawString = new Rectangle(10, 20, 120, 50);

            Graphics g = this.CreateGraphics();

            //使用DrawString方法绘制字符串

            g.DrawString(strDrawString, f, new SolidBrush(Color.Red), posDrawString);

            g.DrawRectangle(new Pen(Color.Blue, 2), posDrawString);

            g.Dispose();

        }

运行结果如下图所示:

图17-27 在矩形区域内绘制字符串

以上两个重载方法还可以增加对文本布局信息的支持:

  1. public void DrawString( string s, Font font, Brush brush, PointF point, StringFormat format)
  2. public void DrawString( string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format)

其中参数format是一个StringFormat 类,它封装文本布局信息(如对齐方式、方向和制表位)、显示操作(如省略号插入和区域数字替换)和OpenType功能。几个常用的属性:

  1. Alignment:文本字符串相对于其布局矩形的对齐方式。这是一个StringAlignment枚举,包含以下成员:
    1. Center:指定文本在布局矩形中居中对齐。
    2. Far:指定文本靠远布局位置对齐。如果是从左到右书写,起始点位于左侧,离右侧远,那么右对齐;否则左对齐。
    3. Near:指定文本靠近布局位置对齐。如果是从左到右书写,起始点位于左侧,右侧远,那么左对齐;否则右对齐。
  2. FormatFlags:文本字符串的显示和布局信息。这是一个 StringFormatFlags 枚举,常用成员有:
    1. DirectionRightToLeft:按从右向左的顺序显示文本。
    2. DirectionVertical:文本垂直对齐。
  3. Trimming:指定如何在不完全适合布局形状的字符串中修整字符。这是一个StringTrimming枚举,包含以下成员:
  1. Character:指定将文本修整成最接近的字符。
  2. EllipsisCharacter:指定将文本修整成最接近的字符,并在被修整的行的末尾插入一个省略号。
  3. EllipsisPath:中心从被修整的行移除并用省略号替换。 这种算法尽可能多地保留了行中的最后一个由斜杠分隔的段。
  4. EllipsisWord:指定将文本修整成最接近的单词,并在被修整的行的末尾插入一个省略号。
  5. None:指定不进行任何修整。
  6. Word:指定将文本修整成最接近的单词。

【例 17.25【项目:code17-025】绘制字符串设置布局信息。

        private void button1_Click(object sender, EventArgs e)

        {

            Font f = new Font("隶书", 15, FontStyle.Bold, GraphicsUnit.Point);

            string strDrawString = "垂直绘制字符串";

            PointF posDrawString =new PointF(10, 20);

            StringFormat sf =new StringFormat();

            //文本垂直对齐

            sf.FormatFlags = StringFormatFlags.DirectionVertical;

            Graphics g = this.CreateGraphics();

            g.DrawString(strDrawString, f, new SolidBrush(Color.Red), posDrawString, sf);

            g.Dispose();

        }

        private void button2_Click(object sender, EventArgs e)

        {

            Font f = new Font("隶书", 15, FontStyle.Bold, GraphicsUnit.Point);

            string strDrawString = "这个例子示范了如何在矩形内绘制字符串";

            Rectangle posDrawString = new Rectangle(50, 20, 120, 60);

            StringFormat sf = new StringFormat();

            //超出矩形空间时截断并插入一个省略号

            sf.Trimming = StringTrimming.EllipsisCharacter;

            Graphics g = this.CreateGraphics();

            g.DrawString(strDrawString, f, new SolidBrush(Color.Red), posDrawString, sf);

            g.DrawRectangle(new Pen(Color.Blue, 1), posDrawString);

            g.Dispose();

        }

运行结果如下图所示:

图17-28 绘制垂直字符串以及截断字符串

17.2.9.5 获得绘制字符串的高度和宽度

通过Graphics的DrawString方法很容易就“画”出了字符串,但是也有个问题,如何获得绘制字符串得高度和宽度,从而有效地在给定空间内绘制。

常用的有两种方法可以获得绘制字符串的高度和宽度。

1、使用Graphics类的MeasureString方法。常用的一个重载版本:

public SizeF MeasureString( string text, Font font )

参数说明:

  1. text:要测量的字符串。
  2. font:Font,它定义字符串的文本格式。

返回值:

  1. 返回 SizeF 结构,该结构表示 text 参数指定的、使用 font 参数绘制的字符串的大小,单位由 PageUnit 属性指定。

2、使用TextRenderer类,它提供用于测量和呈现文本的方法。

TextRenderer常用方法都是静态方法:

  1. DrawText:使用指定的设备上下文、字体和颜色在指定位置绘制指定文本。
  2. MeasureText:在使用指定字体绘制时,提供指定文本的尺寸(以像素为单位)。

【例 17.26【项目:code17-026】获得绘制字符串的高度和宽度。

        private void button1_Click(object sender, EventArgs e)

        {

            Font f = new Font("隶书", 20, FontStyle.Bold, GraphicsUnit.Point);

            string strDrawText = "字体测试:" + f.Name;

            //方法1:Graphics.MeasureString

            SizeF sizeDrawText1;

            Point posDrawText1 = new Point(10, 10);

            Graphics g = this.CreateGraphics();

            //此方法返回 SizeF 结构,该结构表示 text 参数指定的、使用 font 参数绘制的字符串的大小,单位由 PageUnit 属性指定。

            sizeDrawText1 = g.MeasureString(strDrawText, f);

            g.DrawString(strDrawText, f, new SolidBrush(Color.Red), posDrawText1);

            g.DrawRectangle(new Pen(Color.Blue), posDrawText1.X, posDrawText1.Y, sizeDrawText1.Width, sizeDrawText1.Height);

            //方法2:TextRenderer.MeasureText

            Point posDrawText2 =new Point(10, 50);

            //使用指定字体进行绘制时测量指定的文本。

            SizeF sizeDrawtext2 = TextRenderer.MeasureText(strDrawText, f);

            g.DrawString(strDrawText, f, new SolidBrush(Color.Red), posDrawText2);

            g.DrawRectangle(new Pen(Color.Green), posDrawText2.X, posDrawText2.Y, sizeDrawtext2.Width, sizeDrawtext2.Height);

            //方法2扩展

            Point posDrawText3 = new Point(10, 90);

            //增加TextFormatFlags.NoPadding参数

            SizeF sizeDrawtext3 = TextRenderer.MeasureText(g, strDrawText, f, new Size(int.MaxValue, int.MaxValue), TextFormatFlags.NoPadding);

            g.DrawString(strDrawText, f, new SolidBrush(Color.Red), posDrawText3);

            g.DrawRectangle(new Pen(Color.Green), posDrawText3.X, posDrawText3.Y, sizeDrawtext3.Width, sizeDrawtext3.Height);

            //输出各个方法获得文字长宽的信息

            textBox1.Text = "使用MeasureString:" + "\r\n";

            textBox1.Text += "高度:" + sizeDrawText1.Height + "\r\n";

            textBox1.Text += "宽度:" + sizeDrawText1.Width + "\r\n";

            textBox1.Text += "使用TextRenderer:" + "\r\n";

            textBox1.Text += "高度:" + sizeDrawtext2.Height + "\r\n";

            textBox1.Text += "宽度:" + sizeDrawtext2.Width + "\r\n";

            textBox1.Text += "加上TextFormatFlags.NoPadding:" + "\r\n";

            textBox1.Text += "高度:" + sizeDrawtext3.Height + "\r\n";

            textBox1.Text += "宽度:" + sizeDrawtext3.Width + "\r\n";

            g.Dispose();

        }

运行结果如下图所示:

图17-29 绘制字符串的宽度和高度信息

从图17-29可以看出,第二种方法的扩展形态更准确一些。当然,具体问题具体分析,请根据实际情况来选择处理方法。

17.2.9.6 使用字体文件

有时候会在应用程序中使用字体文件(未安装到计算机上的字体),这个时候就可以使用PrivateFontCollection 类。

PrivateFontCollection 类可以通过字体文件生成字体集合。它属于System.Drawing.Text命名空间。

PrivateFontCollection常用属性:

  1. Families:关联的FontFamily对象的数组。

PrivateFontCollection常用方法:

  1. AddFontFile:将字体从字体文件添加到PrivateFontCollection中。它的参数是要添加的字体文件的路径。

注意:Windows 窗体应用程序支持TrueType字体,对OpenType字体提供有限的支持。如果尝试使用不受支持的字体,将出现异常。

使用字体文件时,通常使用PrivateFontCollection的AddFontFile方法将字体加入到集合中,从而获得Families属性中关联的FontFamily对象,使用Font的构造函数的重载版本即可实例化一个Font对象。

【例 17.27【项目:code17-027】使用字体文件。

        private void button1_Click(object sender, EventArgs e)

        {

            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Filter = "字体文件|*.ttf";

            if (ofd.ShowDialog() != DialogResult.OK)

                return;

            string fontFile;

            fontFile = ofd.FileName;

            Graphics g = this.CreateGraphics();

            g.Clear(this.BackColor);

            //实例化一个PrivateFontCollection对象

            PrivateFontCollection pfonts =new PrivateFontCollection();

            //使用AddFontFile方法添加字体文件

            pfonts.AddFontFile(fontFile);

            //检查是否支持常规字体,可以换成Bold(粗体)、Italic(斜体)等进行检测。

            if( pfonts.Families[0].IsStyleAvailable(FontStyle.Regular))

            {

                Font f =new Font(pfonts.Families[0], 20, FontStyle.Regular);

                string fontname = f.Name;

                SolidBrush b =new SolidBrush(Color.Red);

                g.DrawString(fontname, f, b, 0, 10);

            }

        }

运行结果如下图所示:

图17-30 使用字体文件

注意:开发商用项目的时候必须注意字体的版权。

 

学习更多vb.net知识,请参看vb.net 教程 目录

学习更多C#知识,请参看C#教程 目录

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

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

相关文章

浅析DDOS攻击及防御策略

DDoS(分布式拒绝服务)攻击是一种通过大量计算机或网络僵尸主机对目标服务器发起大量无效或高流量请求,耗尽其资源,从而导致服务中断的网络攻击方式。这种攻击方式利用了分布式系统的特性,使攻击规模更大、影响范围更广…

90,【6】攻防世界 WEB Web_php_unserialize

进入靶场 进入靶场 <?php // 定义一个名为 Demo 的类 class Demo { // 定义一个私有属性 $file&#xff0c;默认值为 index.phpprivate $file index.php;// 构造函数&#xff0c;当创建类的实例时会自动调用// 接收一个参数 $file&#xff0c;用于初始化对象的 $file 属…

HarmonyOS NEXT:保存应用数据

用户首选项使用 用户首选项的特点 数据体积小、访问频率高、有加载速度要求的数据如用户偏好设置、用户字体大小、应用的配置参数。 用户搜选项&#xff08;Preferences&#xff09;提供了轻量级配置数据的持久化能力&#xff0c;支持订阅数据变化的通知能力。不支持分布式同…

C++编程语言:抽象机制:模板(Bjarne Stroustrup)

目录 23.1 引言和概观(Introduction and Overview) 23.2 一个简单的字符串模板(A Simple String Template) 23.2.1 模板的定义(Defining a Template) 23.2.2 模板实例化(Template Instantiation) 23.3 类型检查(Type Checking) 23.3.1 类型等价(Type Equivalence) …

OVS-DPDK

dpdk介绍及应用 DPDK介绍 DPDK&#xff08;Data Plane Development Kit&#xff09;是一组快速处理数据包的开发平台及接口。有intel主导开发&#xff0c;主要基于Linux系统&#xff0c;用于快速数据包处理的函 数库与驱动集合&#xff0c;可以极大提高数据处理性能和吞吐量&…

基础项目实战——学生管理系统(c++)

目录 前言一、功能菜单界面二、类与结构体的实现三、录入学生信息四、删除学生信息五、更改学生信息六、查找学生信息七、统计学生人数八、保存学生信息九、读取学生信息十、打印所有学生信息十一、退出系统十二、文件拆分结语 前言 这一期我们来一起学习我们在大学做过的课程…

基于微信小程序的医院预约挂号系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

[Linux]从零开始的STM32MP157 U-Boot移植

一、前言 在上一次教程中&#xff0c;我们了解了STM32MP157的启动流程与安全启动机制。我们还将FSBL的相关代码移植成功了。大家还记得FSBL的下一个步骤是什么吗&#xff1f;没错&#xff0c;就是SSBL&#xff0c;而且常见的我们将SSBL作为存放U-Boot的地方。所以本次教程&…

单细胞-第四节 多样本数据分析,下游画图

文件在单细胞\5_GC_py\1_single_cell\2_plots.Rmd 1.细胞数量条形图 rm(list ls()) library(Seurat) load("seu.obj.Rdata")dat as.data.frame(table(Idents(seu.obj))) dat$label paste(dat$Var1,dat$Freq,sep ":") head(dat) library(ggplot2) lib…

高速稳定,功能强大的免费下载工具!!

今天&#xff0c;我向你们介绍一款超强的下载器——破姐版本&#xff0c;它完全免费&#xff0c;支持高速下载&#xff0c;将彻底解决你的下载难题。 01 软件介绍 P2P下载器免费下载工具&#xff0c;它以高速稳定、功能强大、无广告的特点&#xff0c;为你提供卓越的下载体验…

C++:虚函数与多态性习题2

题目内容&#xff1a; 编写程序&#xff0c;声明抽象基类Shape&#xff0c;由它派生出3个派生类&#xff1a;Circle、Rectangle、Triangle&#xff0c;用虚函数分别计算图形面积&#xff0c;并求它们的和。要求用基类指针数组&#xff0c;使它每一个元素指向一个派生类对象。 …

C#,入门教程(10)——常量、变量与命名规则的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(09)——运算符的基础知识https://blog.csdn.net/beijinghorn/article/details/123908269 C#用于保存计算数据的元素&#xff0c;称为“变量”。 其中一般不改变初值的变量&#xff0c;称为常变量&#xff0c;简称“常量”。 无论…

list的使用,及部分功能的模拟实现(C++)

目录&#xff08;文章中"节点"和"结点"是同一个意思&#xff09; 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list…

MySQL 索引

MySQL 索引 文章目录 MySQL 索引1. 索引概念2. 索引结构3. 索引分类4. 索引使用4.1 单列索引和联合索引4.2 覆盖索引4.3 前缀索引 5. SQL提示6. 索引失效情况 1. 索引概念 索引可以理解为MySQL中用来高效检索数据的数据结构&#xff0c;它是有序的&#xff0c;因为它底层使用的…

JVM方法区

一、栈、堆、方法区的交互关系 二、方法区的理解: 尽管所有的方法区在逻辑上属于堆的一部分&#xff0c;但是一些简单的实现可能不会去进行垃圾收集或者进行压缩&#xff0c;方法区可以看作是一块独立于Java堆的内存空间。 方法区(Method Area)与Java堆一样&#xff0c;是各个…

STM32 TIM定时器配置

TIM简介 TIM&#xff08;Timer&#xff09;定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能&#xff…

自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数

import numpy as np import torch import torch.nn as nn import torch.optim as optim from sklearn.metrics import precision_score, recall_score, f1_score# 数据准备 class1_points np.array([[1.9, 1.2],[1.5, 2.1],[1.9, 0.5],[1.5, 0.9],[0.9, 1.2],[1.1, 1.7],[1.4,…

< OS 有关 > 阿里云 几个小时前 使用密钥替换 SSH 密码认证后, 发现主机正在被“攻击” 分析与应对

信息来源&#xff1a; 文件&#xff1a;/var/log/auth.log 因为在 sshd_config 配置文件中&#xff0c;已经定义 LogLevel INFO 部分内容&#xff1a; 2025-01-27T18:18:55.68272708:00 jpn sshd[15891]: Received disconnect from 45.194.37.171 port 58954:11: Bye Bye […

[创业之路-270]:《向流程设计要效率》-2-企业流程架构模式 POS架构(规划、业务运营、支撑)、OES架构(业务运营、使能、支撑)

目录 一、POS架构 二、OES架构 三、POS架构与OES架构的差异 四、各自的典型示例 POS架构典型示例 OES架构典型示例 示例分析 五、各自的典型企业 POS架构典型企业 OES架构典型企业 分析 六、各自典型的流程 POS架构的典型流程 OES架构的典型流程 企业流程架构模式…

【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(一)

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;贪心算法篇–CSDN博客 文章目录 一.贪心算法1.什么是贪心算法2.贪心算法的特点 二.例题1.柠…