如何在WinForms中手动获取Graphics对象的实例?

时间:2011-01-21 14:01:19

标签: c# winforms graphics

我知道如何使用Graphics类型的对象(至少我能够渲染图像)但我总是通过传递从OnPaint方法检索的图形对象来做到这一点。

我想在应用程序打开时显示图像(即在Form_Load方法中),但不知道如何获取我可以使用的Graphics对象的实例? 感谢

5 个答案:

答案 0 :(得分:13)

使用OnPaint()提供给您的e.Graphics对象是正确的方法。它将在OnLoad()方法之后运行。该表单在OnLoad中不可见。

支持从Control.CreateGraphics()获取Graphics对象。但是,一旦表单重新绘制自己,用它绘制的任何内容都将被删除。当用户在您的另一个窗口(Aero前)移动窗口或者最小化并恢复窗口或以其他方式调整窗口大小时,会发生这种情况。只有在高速动画时才使用CreateGraphics。

答案 1 :(得分:2)

如果您尝试从表单的表面创建图形对象,可以使用this.CreateGraphics

如果您尝试创建新图片,可以随时初始化Image,然后拨打Graphics.CreateGraphics.FromImage(YourImage),例如

Bitmap b = new Bitmap(100,100);
var g = Graphics.CreateGraphics.FromImage(b);

此时,对Graphics对象执行的任何绘制都将绘制到图像上。

答案 2 :(得分:0)

答案 3 :(得分:0)

您打算如何使用Load事件中的Graphics对象?

如果你想在屏幕上画一些东西,你必须在Paint事件中,否则它将在下一个画面上被清除。

你可以做什么:加载另一个(简单)表单,只有一张图片,并在加载主表单时隐藏它。

由于您的Load事件可能会在UI线程上运行。调用DoEvents以显示其他表单。

答案 4 :(得分:0)

以上答案都不适合我。我发现Rajnikant Rajwadi解决方案有效(请参阅https://social.msdn.microsoft.com/Forums/vstudio/en-US/ce90eb80-3faf-4266-b6e3-0082191793f7/creation-of-graphics-object-in-wpf-user-control?forum=wpf

这是对Graphics.MeasureString()的非常简洁的电话。 (请更负责任地编码)

SizeF sf = System.Drawing.Graphics.FromHwnd(new System.Windows.Interop.WindowInteropHelper(this).Handle).MeasureString("w", new Font(TheControl.FontFamily.ToString(), (float)TheControl.FontSize));