C#表单,调整表单大小后,图像无法超出原始表单大小
Posted
技术标签:
【中文标题】C#表单,调整表单大小后,图像无法超出原始表单大小【英文标题】:C# Form, After resizing Form, Image could not draw out of original form size 【发布时间】:2012-07-17 10:16:54 【问题描述】:总结: 它只是不会在初始表单大小之外绘制。我可以缩小,但不能放大,它会被裁剪掉。
如果摘要不够清晰,请说明: 因此,如果我的表格最初大小为 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 比例。
【问题讨论】:
请出示您的代码... “摘要”应该读作上面的“谜语”吗? 好吗?你是否缩放你的 mapDrawer,不管那是什么? @J. Steen:我最好的猜测是Graphics
。
@Tharwen 是的,但是 Graphics
对象属于某物。可能是表单,也可能是表单上不随表单缩放的控件。
【参考方案1】:
您的 mapDrawer 对象是问题所在,尽管从不适当的 sn-p 中无法看出。毫无疑问,这是您早期创建的 Graphics 对象,可能是在表单的 Load 事件中。它有一个基于当时表单大小的剪辑区域。如果您随后通过调整大小使表单变大,您会发现这个复制的 Graphics 对象无法绘制超出其原始边界。不能。
从不复制 Graphics 对象,始终在 Paint 事件处理程序中进行绘制并使用传递的 e.Graphics 对象。这也确保了双缓冲正常工作,您可能想要打开它。如果发生需要重绘图像的事情,请使用 Invalidate() 方法。
【讨论】:
是你对我上面的回答发表评论的吗?如果是这样,我已经做了一些更正。如果不是你,我还是做了一些更正,但我也给了你一个不必要的评论通知。 是的,就是我。我决定最好发布一个答案来解释为什么会出错。 我会看看这个,看看这是否是问题所在。谢谢!【参考方案2】:我最好的猜测是在重绘表单时需要重绘图像:
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);
【讨论】:
以上是关于C#表单,调整表单大小后,图像无法超出原始表单大小的主要内容,如果未能解决你的问题,请参考以下文章
根据表单大小设置 splitContainer 属性大小 C# WinForms
在 PictureBox Form C# 中调整大小时丢失图像质量