2011-01-21 15 views
7

Sé cómo trabajar con objetos de tipo Graphics (al menos soy capaz de representar imágenes) pero siempre lo hago pasando objetos gráficos recuperados del método OnPaint.Cómo obtener manualmente la instancia del objeto Graphics en WinForms?

Me gustaría mostrar una imagen cuando se abre la aplicación (es decir, en el método Form_Load) pero no tengo idea de cómo obtener la instancia del objeto Graphics que podría usar? Gracias

Respuesta

12

El uso del objeto e.Graphics que OnPaint() le proporciona es la forma correcta de hacerlo. Se ejecutará justo después del método OnLoad(). El formulario aún no está visible en OnLoad.

Obtención de un objeto Graphics desde Control.CreateGraphics() es compatible. Sin embargo, cualquier cosa que dibuje con esto se borrará tan pronto como la forma se vuelva a pintar. Lo que sucede cuando el usuario mueve otra ventana a través de la suya (pre-Aero) o cuando minimiza y restaura o cambia el tamaño de la ventana. Use CreateGraphics solo al animar a una velocidad alta.

2

Si usted está tratando de crear un objeto gráfico de la superficie de su formulario, puede utilizar this.CreateGraphics

Si está intentando crear una nueva imagen, se siempre puede inicializar un Image y luego llamar al Graphics.CreateGraphics.FromImage(YourImage) por ej.

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

En este punto, cualquier dibujo realizado en su objeto Graphics se dibujará en su imagen.

0

¿Y cómo piensa utilizar el objeto Graphics que obtuvo en el evento Load?

Si desea pintar algo en la pantalla, tiene que estar en el evento Paint, o se eliminará en la siguiente pintura.

Lo que puede hacer: cargar otra forma (simple), con solo una imagen, y ocultarla cuando se cargue su formulario principal.

Dado que su evento de carga probablemente se ejecutará en el subproceso de interfaz de usuario. Llame a DoEvents para que aparezca la otra forma.

0

Ninguna de las respuestas anteriores funciona para mí. Encontré la solución Rajnikant Rajwadi efectiva (vea https://social.msdn.microsoft.com/Forums/vstudio/en-US/ce90eb80-3faf-4266-b6e3-0082191793f7/creation-of-graphics-object-in-wpf-user-control?forum=wpf)

Aquí hay una llamada horriblemente condensada al Graphics.MeasureString(). (codifique de manera más responsable)

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