用于绘制图形和滚动的面板
Posted
技术标签:
【中文标题】用于绘制图形和滚动的面板【英文标题】:Panel for drawing graphics and scrolling 【发布时间】:2011-05-17 08:12:44 【问题描述】:我希望能够使用Panel
或类似工具在 Winform 上绘制图形。如果图形变得比控件大,我似乎看不到有关添加滚动条的任何内容?
是否可以使用Panel
来执行此操作,或者是否有类似的控件允许这样做?
【问题讨论】:
为什么有人会反对这个?这是一个完全合理的问题? 【参考方案1】:将 AutoScroll 属性设置为 true,将 AutoScrollMinSize 属性设置为图像的大小。当图像太大时,滚动条现在会自动出现。
您需要从 Panel 继承您自己的类,以便可以在构造函数中将 DoubleBuffered 属性设置为 true。否则闪烁会很明显。一些示例代码:
using System;
using System.Drawing;
using System.Windows.Forms;
class ImageBox : Panel
public ImageBox()
this.AutoScroll = true;
this.DoubleBuffered = true;
private Image mImage;
public Image Image
get return mImage;
set
mImage = value;
if (value == null) this.AutoScrollMinSize = new Size(0, 0);
else
var size = value.Size;
using (var gr = this.CreateGraphics())
size.Width = (int)(size.Width * gr.DpiX / value.HorizontalResolution);
size.Height = (int)(size.Height * gr.DpiY / value.VerticalResolution);
this.AutoScrollMinSize = size;
this.Invalidate();
protected override void OnPaint(PaintEventArgs e)
e.Graphics.TranslateTransform(this.AutoScrollPosition.X, this.AutoScrollPosition.Y);
if (mImage != null) e.Graphics.DrawImage(mImage, 0, 0);
base.OnPaint(e);
【讨论】:
谢谢汉斯。我现在就试试看。 Sorry Hans....适合面板的图像是在运行时动态创建的。图形是根据某些参数创建的。这还能用吗? 嗯,分配 Image 属性。在设计时和运行时都可以正常工作。 我创建图像的方式是使用图形在面板上绘制圆圈。我会将此面板另存为图像吗?对不起,也许是愚蠢的问题——我对图形/图像编程完全陌生。再次感谢。 只需在 OnPaint() 方法中进行绘图。那里的 TranslateTransform 调用确保您的绘图正确滚动。但是,您必须自己设置 AutoScaleMinSize 属性。【参考方案2】:我不能 100% 确定您想要完成什么,但这里有一个类似的 SO question 可能会对您有所帮助。
您也可以尝试使用PictureBox,随着图形变大,您可以手动更改其大小。然后将表单 AutoScroll 设置为 true。
【讨论】:
我不会将图片框用作绘图的画布。图片框仅用于显示图片。请参阅 Bob Powell 关于这个确切问题的文章。以上是关于用于绘制图形和滚动的面板的主要内容,如果未能解决你的问题,请参考以下文章