gpt4 book ai didi

.net - GDI+:如何在任何设备上绘制一英寸长的线?

转载 作者:行者123 更新时间:2023-12-04 01:01:46 25 4
gpt4 key购买 nike

我需要在给定 Graphics 的任何设备上画一条一英寸长的线引用它。不管怎样,我都需要它是一英寸长 Transform设置为。让我们假设变换的缩放因子由 scale 给出。在水平和垂直方向。

一些 C++/CLI 代码:

g->DrawLine(Pens::Black, 50.0f, 50.0f, 50.0f + oneInchEquivalent / scale, 50.0f);

现在这根本不难!现在我们需要做的就是计算 oneInchEquivalent .
g->DpiX给我一个在屏幕上看起来像一英寸而不是在打印机上的距离。似乎在打印机上,用 g->PageUnit 画一条 100 个单位的线设置为 GraphicsUnit::Display 会给我一条一英寸长的线。但是,不管 PageUnit,我真的需要它来工作。设置。其实在变 PageUnit会改变笔的宽度!!

编辑:我暂时接受了这里唯一的答案,因为它非常接近我正在寻找的答案。

最佳答案

经过几次编辑后,答案变得相当长,所以这是最终结果:

设置 PageUnit Graphics 的属性(property)反对 GraphicsUnit.Pixel并将坐标与 DpiX 和 DpiY 值相乘将在显示器和打印机设备上呈现预期结果。

private static void DrawInchLine(Graphics g, Color color, Point start, Point end)
{
GraphicsUnit originalUnit = g.PageUnit;
g.PageUnit = GraphicsUnit.Pixel;
using (Pen pen = new Pen(color, 1))
{
g.DrawLine(pen,
start.X * g.DpiX,
start.Y * g.DpiY,
end.X * g.DpiX,
end.Y * g.DpiY);
}
g.PageUnit = originalUnit;
}

您可以将它绘制在表单(或某些控件)上:
using (Graphics g = this.CreateGraphics())
{
Point start = new Point(1, 1);
Point end = new Point(2, 1);
DrawInchLine(g, Color.Black, start, end);
}

...或将输出发送到打印机:
PrintDialog dialog = new PrintDialog();
if (dialog.ShowDialog() == DialogResult.OK)
{
PrintDocument pd = new PrintDocument();
pd.PrinterSettings = dialog.PrinterSettings;
pd.PrintPage += (psender, pe) =>
{
Point start = new Point(1, 1);
Point end = new Point(2, 1);
DrawInchLine(pe.Graphics, Color.Black, start, end);
pe.HasMorePages = false;
};

pd.Print();
}

然而,这确实依赖于设置 PageUnit .

关于.net - GDI+:如何在任何设备上绘制一英寸长的线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1340810/

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