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

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

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

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

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

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

如果您尝试创建新图像,则可以始终初始化Image ,然后调用Graphics.CreateGraphics.FromImage(YourImage)例如

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

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

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

如果要在屏幕上绘制某些内容,则必须处于“Paint”事件中,否则将在下一次绘制时清除它。

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

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

以上所有答案都不适用于我。 我发现Rajnikant Rajwadi解决方案有效(请参阅https://social.msdn.microsoft.com/Forums/vstudio/en-US/ce90eb80-3faf-4266-b6e3-0082191793f7/creation-of-graphics-object-in-wpf-用户控制?论坛= 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));