-2

摘要:它只是不会超出初始表单大小。我可以按比例缩小,但不能按比例放大,它会被裁掉。

如果摘要不够清晰,则说明:因此,如果我的表单最初大小为 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 比例。

4

2 回答 2

1

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

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

于 2012-07-17T11:23:37.850 回答
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);
于 2012-07-17T11:13:20.350 回答