要点: 它只是不在初始表单大小之外绘制。我可以缩小规模,只是不缩放,它会被裁掉。
描述摘要是否不够明确: 因此,如果我的表格最初为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。
答案 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);