drawstring 文本居中_c#-Graphics.DrawString()的中心文本输出

drawstring 文本居中_c#-Graphics.DrawString()的中心文本输出c Graphics DrawString 的中心文本输出我正在使用 NETCF WindowsMobil Graphics 类和 DrawString 方法将单个字符呈现到屏幕 问题是我似乎无法使其正确居中 无论我为字符串渲染的位置的 Y 坐标设置什么 它总是比该值低 并且文本大小越大 Y 偏移量就越大 例如 在文本大小 12 处 偏移量约为 4 但在 32 处 偏移量约为 10 我希望角色垂直占据绘制的

c#-Graphics.DrawString()的中心文本输出

我正在使用.NETCF(Windows Mobile)Graphics类和DrawString()方法将单个字符呈现到屏幕。

问题是我似乎无法使其正确居中。 无论我为字符串渲染的位置的Y坐标设置什么,它总是比该值低,并且文本大小越大,Y偏移量就越大。

例如,在文本大小12处,偏移量约为4,但在32处,偏移量约为10。

我希望角色垂直占据绘制的矩形的大部分并水平居中。 这是我的基本代码。 Graphics引用了正在绘制的用户控件。

Graphics g = this.CreateGraphics();

float padx = ((float)this.Size.Width) * (0.05F);

float pady = ((float)this.Size.Height) * (0.05F);

float width = ((float)this.Size.Width) – 2 * padx;

float height = ((float)this.Size.Height) – 2 * pady;

float emSize = height;

g.DrawString(letter, new Font(FontFamily.GenericSansSerif, emSize, FontStyle.Regular),

new SolidBrush(Color.Black), padx, pady);

是的,我知道可以使用标签控件来代替它并设置居中,但是实际上我确实需要使用Graphics类手动执行此操作。

6个解决方案

77 votes

我想为StringFormat对象添加另一个投票。您可以简单地使用它来指定“中心,中心”,文本将在矩形或所提供的点的中心绘制:

StringFormat format = new StringFormat();

format.LineAlignment = StringAlignment.Center;

format.Alignment = StringAlignment.Center;

但是,CF中存在一个问题。 如果您对两个值都使用Center,则它将关闭TextWrapping。 不知道为什么会这样,这似乎是CF的一个错误。

Quibblesome answered 2019-11-09T22:20:26Z

55 votes

要对齐文本,请使用以下命令:

StringFormat sf = new StringFormat();

sf.LineAlignment = StringAlignment.Center;

sf.Alignment = StringAlignment.Center;

e.Graphics.DrawString(“My String”, this.Font, Brushes.Black, ClientRectangle, sf);

请注意,此处的文本在给定范围内对齐。 在此示例中,这是ClientRectangle。

Chris Hughes answered 2019-11-09T22:20:56Z

19 votes

通过结合我的建议,我想到了:

private void DrawLetter()

{

Graphics g = this.CreateGraphics();

float width = ((float)this.ClientRectangle.Width);

float height = ((float)this.ClientRectangle.Width);

float emSize = height;

Font font = new Font(FontFamily.GenericSansSerif, emSize, FontStyle.Regular);

font = FindBestFitFont(g, letter.ToString(), font, this.ClientRectangle.Size);

SizeF size = g.MeasureString(letter.ToString(), font);

g.DrawString(letter, font, new SolidBrush(Color.Black), (width-size.Width)/2, 0);

}

private Font FindBestFitFont(Graphics g, String text, Font font, Size proposedSize)

{

// Compute actual size, shrink if needed

while (true)

{

SizeF size = g.MeasureString(text, font);

// It fits, back out

if (size.Height <= proposedSize.Height &&

size.Width <= proposedSize.Width) { return font; }

// Try a smaller font (90% of old size)

Font oldFont = font;

font = new Font(font.Name, (float)(font.Size * .9), font.Style);

oldFont.Dispose();

}

}

到目前为止,这是完美的。

我唯一要更改的是将FindBestFitFont()调用移至OnResize()事件,这样我每次绘制字母时都不会调用它。 仅在控件大小更改时才需要调用它。 我只是为了完整性而将其包括在函数中。

Adam Haile answered 2019-11-09T22:21:33Z

10 votes

绘制居中文字:

TextRenderer.DrawText(g, “my text”, Font, Bounds, ForeColor, BackColor,

TextFormatFlags.HorizontalCenter |

TextFormatFlags.VerticalCenter |

TextFormatFlags.GlyphOverhangPadding);

确定最佳字体大小以填充区域会有些困难。 我发现一个可行的尝试是反复试验:从大字体开始,然后反复测量字符串并缩小字体,直到适合为止。

Font FindBestFitFont(Graphics g, String text, Font font,

Size proposedSize, TextFormatFlags flags)

{

// Compute actual size, shrink if needed

while (true)

{

Size size = TextRenderer.MeasureText(g, text, font, proposedSize, flags);

// It fits, back out

if ( size.Height <= proposedSize.Height &&

size.Width <= proposedSize.Width) { return font; }

// Try a smaller font (90% of old size)

Font oldFont = font;

font = new Font(font.FontFamily, (float)(font.Size * .9));

oldFont.Dispose();

}

}

您可以将其用作:

Font bestFitFont = FindBestFitFont(g, text, someBigFont, sizeToFitIn, flags);

// Then do your drawing using the bestFitFont

// Don’t forget to dispose the font (if/when needed)

dbkk answered 2019-11-09T22:22:10Z

3 votes

您可以使用传递到DrawString方法中的StringFormat对象的实例来使文本居中。

请参见Graphics.DrawString方法和StringFormat类。

John answered 2019-11-09T22:22:40Z

2 votes

这是一些代码。 假定您正在表单或UserControl上执行此操作。

Graphics g = this.CreateGraphics();

SizeF size = g.MeasureString(“string to measure”);

int nLeft = Convert.ToInt32((this.ClientRectangle.Width / 2) – (size.Width / 2));

int nTop = Convert.ToInt32((this.ClientRectangle.Height / 2) – (size.Height / 2));

在您的帖子中,听起来好像ClientRectangle部分(例如,您没有使用它)给您带来了困难。

TheSmurf answered 2019-11-09T22:23:11Z

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232089.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • navicat pe15激活码_在线激活

    (navicat pe15激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1STL5S9V8F-eyJsaWNlbnNlSW…

    2022年3月27日
    43
  • 域名转接公告

    域名转接公告

    2021年7月25日
    74
  • sql注入及用PrepareStatement就不用担心sql注入了吗?

    sql注入及用PrepareStatement就不用担心sql注入了吗?首先讲一下sql注入所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露

    2022年5月30日
    66
  • django的orm查询方法_查看django版本命令

    django的orm查询方法_查看django版本命令前言查找是数据库操作中一个非常重要的技术。查询一般就是使用filter、exclude以及get三个方法来实现。我们可以在调用这些方法的时候传递不同的参数来实现查询需求。在ORM层面,这些查询条件都

    2022年8月7日
    7
  • MixMatch论文学习笔记

    MixMatch论文学习笔记项目内容论文名MixMatch:AHolisticApproachtoSemi-SupervisedLearning作者DavidBerthelot,NicholasCarlini,IanGoodfellow,AvitalOliver,NicolasPapernot,ColinRaffel主要内容发表时间2019年Abstract

    2025年5月31日
    3
  • native/ascii在线转换工具_中文转ascii

    native/ascii在线转换工具_中文转ascii1,原理Property文件中,使用的编码根据机器的设置可能是GBK或者UTF-8。而在Java中读取Property文件时使用的是Unicode编码,编码方式不同会导致中文乱码,因此需要将Property文件中的中文字符转化成Unicode编码才能正常显示中文。2,解决办法Java提供了native2ascii这种专门的工具对Property文件进行编码转换,在JDK安装环境的bin目录下可以找…

    2025年10月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号