2011-12-28 3 views
5

Tengo una biblioteca que se basa en un HDC dado usando GDI + apis. Quiero usar eso en una aplicación WPF. Intenté obtener el identificador de la clase WindowInteropHelper y pasarlo al método de biblioteca que hace el dibujo. Sin embargo, falla simplemente porque no puede crear gráficos Gdi + desde ese mango.¿Puedo obtener HDC desde la ventana de WPF para poder dibujar con Gdi + API?

Intenté utilizar un elemento WinForm en el control WindowsFormsHost y utilicé el HDC disponible en el evento de pintura del control WinForm y funcionó bien. Lo que quiero saber es si se puede hacer lo mismo para trabajar directamente en WPF control \ window? ¿Hay alguna otra manera de obtener el HDC de los elementos de WPF en los que se puede utilizar GDI draw apis?

Respuesta

6

Si tiene el identificador de ventana (HWND) de la ventana de WPF, presumiblemente obtenido utilizando la clase WindowInteropHelper, a continuación, puede fácilmente obtener un identificador para un contexto de dispositivo (HDC) para esa ventana.

Hay dos maneras de lograrlo, aunque en última instancia, ambos hacen lo mismo. El primero es P/Invocar las funciones GDI + API necesarias, pero podemos descartar eso rápidamente ya que consume mucho tiempo innecesariamente. Recuerde que .NET Framework ya incluye todo esto para el desarrollo de WinForms en el System.Drawing namespace y, en particular, el Graphics class. Entonces, todo lo que necesita hacer es agregar una referencia al System.Drawing en su aplicación WPF, y obtendrá todas estas funcionalidades envueltas de forma gratuita.

La parte que le interesa es Graphics.FromHwnd method, que crea un nuevo objeto Graphics desde el manejador de ventana especificado (HWND).

Una vez que tenga eso, se puede obtener un identificador de un contexto de dispositivo (HDC) llamando a la Graphics.GetHdc method, que devuelve exactamente lo que busca es un valor-IntPtr que representa un identificador para un contexto de dispositivo.

Recuerde que tendrá que llamar al Dispose method en su objeto Graphics después de que haya terminado con él para liberar sus recursos asociados.

+0

Lamentablemente, esto ahora me funciona – Andreas

Cuestiones relacionadas