gpt4 book ai didi

c# - 如何应用图形缩放并转换为 TextRenderer

转载 作者:太空狗 更新时间:2023-10-29 21:35:41 26 4
gpt4 key购买 nike

我在绘制自定义控件时使用缩放和转换我的图形对象,以便应用缩放和滚动。我使用以下内容:

            Matrix mx = new Matrix();
mx.Scale(mZoomFactor, mZoomFactor);
mx.Translate(-clip.X + mGraphicsOffsetx, -clip.Y + mGraphicsOffsety);

e.Graphics.Clip = new Region(this.Bounds);
e.Graphics.Transform = mx;

然后当我使用以下方法绘制我的字符串时:

Graphics g = ...
g.DrawString(...)

缩放和变换正确应用于字符串,它们被缩小和放大等等。

但是,如果我使用以下内容来绘制我的字符串:

TextRenderer.DrawText(...)

文本未正确缩放和转换。

你知道如何将这些概念应用到 TextRenderer 吗?

最佳答案

上面的评论是准确的——TextRenderer.DrawText 是 GDI,鉴于其分辨率依赖性,对坐标转换的支持有限。正如您所注意到的,支持坐标平移但不支持缩放(坐标旋转也不支持)。

我们使用的解决方案(也是我能够在互联网上找到的唯一资源)是手动缩放 FontRectangle 对象以反射(reflect)Matrix.Scale(float, float) 结合 Graphics.Transform 应用的缩放:

    private Font GetScaledFont(Graphics g, Font f, float scale)
{
return new Font(f.FontFamily,
f.SizeInPoints * scale,
f.Style,
GraphicsUnit.Point,
f.GdiCharSet,
f.GdiVerticalFont);
}

private Rectangle GetScaledRect(Graphics g, Rectangle r, float scale)
{
return new Rectangle((int)Math.Ceiling(r.X * scale),
(int)Math.Ceiling(r.Y * scale),
(int)Math.Ceiling(r.Width * scale),
(int)Math.Ceiling(r.Height * scale));
}

这是完整的测试表格:

public partial class Form1 : Form
{
private PictureBox box = new PictureBox();

public Form1()
{
InitializeComponent();
this.Load += new EventHandler(Form1_Load);
}

public void Form1_Load(object sender, EventArgs e)
{
box.Dock = DockStyle.Fill;
box.BackColor = Color.White;

box.Paint += new PaintEventHandler(DrawTest);
this.Controls.Add(box);
}

public void DrawTest(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;

string text = "Test Text";
float scale = 1.5F;
float translate = 200F;

var flags = TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.PreserveGraphicsTranslateTransform;

var mx = new Matrix();
mx.Scale(scale, scale);
mx.Translate(translate, translate);

g.Clip = new Region(Bounds);
g.Transform = mx;

Size rendererPSize = Bounds.Size;
Font f = GetScaledFont(g, new Font("Arial", 12), scale);
Size rendererRSize = TextRenderer.MeasureText(g, text, f, rendererPSize, flags);

Rectangle rendererRect = new Rectangle(0, 0, rendererRSize.Width, rendererRSize.Height);
Rectangle r = GetScaledRect(g, rendererRect, scale);

TextRenderer.DrawText(g, text, f, realRect, Color.Black, flags);
}

private Font GetScaledFont(Graphics g, Font f, float scale)
{
return new Font(f.FontFamily,
f.SizeInPoints * scale,
f.Style,
GraphicsUnit.Point,
f.GdiCharSet,
f.GdiVerticalFont);
}

private Rectangle GetScaledRect(Graphics g, Rectangle r, float scale)
{
return new Rectangle((int)Math.Ceiling(r.X * scale),
(int)Math.Ceiling(r.Y * scale),
(int)Math.Ceiling(r.Width * scale),
(int)Math.Ceiling(r.Height * scale));
}
}

关于c# - 如何应用图形缩放并转换为 TextRenderer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8850528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com