Graphics.ScaleTransform()
在我的方法中使用比例变换( - 请参阅MSDN)绘制一条线时,我看到了奇怪的行为OnPaint()
。
当该方法使用较大的 y 比例因子时ScaleTransform
,如果 x 比例设置为 1x 以上,则线会突然变得更大。
将画线的笔宽设置为-1似乎可以解决问题,但我不想画很细的线(线必须稍后打印,1px太细了)。
这是一些示例代码来演示该问题:
public class GraphicsTestForm : Form
{
private readonly float _lineLength = 300;
private readonly Pen _whitePen;
private Label _debugLabel;
public GraphicsTestForm()
{
ClientSize = new Size(300, 300);
Text = @"GraphicsTest";
SetStyle(ControlStyles.ResizeRedraw, true);
_debugLabel = new Label
{
ForeColor = Color.Yellow,
BackColor = Color.Transparent
};
Controls.Add(_debugLabel);
_lineLength = ClientSize.Width;
_whitePen = new Pen(Color.White, 1f); // can change pen width to -1
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
float scaleX = ClientSize.Width / _lineLength;
const int ScaleY = 100;
e.Graphics.Clear(Color.Black);
_debugLabel.Text = @"x-scale: " + scaleX;
// scale the X-axis so the line exactly fits the graphics area
// scale the Y-axis by scale factor
e.Graphics.ScaleTransform(scaleX, ScaleY);
float y = ClientSize.Height / (ScaleY * 2f);
e.Graphics.DrawLine(_whitePen, 0, y, _lineLength, y);
e.Graphics.ResetTransform();
}
}
我希望线条/笔能够优雅地缩放,而不会如此显着地跳跃。
(另外,我注意到当线条很大时,它不会在多个显示器上连续绘制。也许这有关系?)