C#表单,调整表格大小后,图像无法绘制出原始表单大小

时间:2012-07-17 10:16:55

标签: c# forms resize crop

要点: 它只是不在初始表单大小之外绘制。我可以缩小规模,只是不缩放,它会被裁掉。

描述摘要是否不够明确: 因此,如果我的表格最初为1000,800。缩放后,我绘制的图像永远不会大于1000,800。

如果我将表格缩放到2000,1600的大小,它将被裁剪掉。图像将在下方和右侧中途裁剪,因此仅绘制左上角部分。

我确信我的缩放工作正确,因为只要我在创建时将表单设置为2000,1600就可以正常工作。

。 。 代码按要求,但我不确定是否重要。

mapDrawer.DrawImage( map1,
    new RectangleF(0, 0, ImageSizeX * scale, ImageSizeY * scale),
    new RectangleF(0, 0, ImageSizeX, ImageSizeY),
    GraphicsUnit.Pixel);

其中scale是form.size / map_size。 我采用较小的x或y。

2 个答案:

答案 0 :(得分:1)

您的 mapDrawer 对象是问题,尽管从不适当的代码段中无法看到。毫无疑问,您是早期创建的Graphics对象,可能是表单的Load事件。它有一个剪裁区域,它基于当时表单的大小。如果您通过调整大小来使表单更大,您将发现这个复制的Graphics对象无法绘制超出其原始边界。它不能。

永远不要复制Graphics对象,总是在Paint事件处理程序中进行绘制并使用传递的e.Graphics对象。这也可以确保双缓冲正常工作,您可能想要打开它。如果发生应该重绘图像的事情,请使用Invalidate()方法。

答案 1 :(得分:0)

我最好的猜测是,在重新绘制表单时需要重新绘制图像:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;

    g.DrawImage(map1,
        new RectangleF(0, 0, ImageSizeX * scale, ImageSizeY * scale),
        new RectangleF(0, 0, ImageSizeX, ImageSizeY),
        GraphicsUnit.Pixel);
}

要在调整窗体大小时(或强制它重绘的任何其他内容)调用此方法,您应该在窗体的构造函数中的Paint事件上添加句柄:

Paint += new EventHandler(Form1_Paint);