Componente de imagen de Windows – Direct2D C ++ – Dibujar, guardar

Utilizando Windows Image Component (WIC), quiero hacer lo siguiente para mi aplicación de escritorio de Windows (Direct2D / C ++ con Windows 7 SP1 – Visual Studio 2013)

  1. Elija cualquier tipo de RenderTarget (Direct2D Hwnd / Bitmap / WICBitmap – etc) para dibujar

  2. Cree un bitmap vacío (D2D1Bitmap o IWICBitmap, según corresponda)

  3. Comenzar el dibujo: rellenar el color, dibujar algunas líneas y puntos suspensivos: finalizar el dibujo ==> (Todo en el bitmap)

  4. En algún momento, necesito guardar el contenido dibujado en el bitmap como una imagen en mi computadora

  5. Coloque el bitmap en x1, y1 (coordenadas superior izquierda – xy) y x2, y2 (coordenadas inferior derecha – xy) del objective de procesamiento. Porque el rest del espacio de la ventana sería utilizado por la barra de herramientas.

¿Cómo logro esto usando C ++ / Direct2D?

Código GDI + para mi funcionalidad:

Bitmap* pBmp = NULL; //create null or empty bitmap Graphics* pGrBuf = NULL; //initialise graphics to null pBmp = new Bitmap((INT)rectClient.Width, (INT)rectClient.Height); pGrBuf = new Graphics(pBmp); 

En estos gráficos, siempre podría dibujar líneas, rectangularjs, etc.

 pGrBuf.DrawRectangle(....) pGrBuf.DrawLine(...) 

Al final, por lograr el punto número 5.

 //leave some space (30, 30 in xy co-ordinates) for putting the toolbox in the top pGrBuf.DrawImage(m_pBmp, 30.0f, 30.0f); 

El código para el punto 4 se omite intencionalmente.

La pregunta tiene una respuesta simple e inequívoca, pero hay algunos detalles que debe (re) considerar.

Direct2D no es un marco de panacea que superará fácilmente a otros. No está muy claro de qué se tratan tus dibujos y cuál es su propósito, pero hay casos en los que el uso de Direct2D no es muy apropiado. Si reemplaza GDI (+) con D2D, algunos de sus sufrimientos serán:

  • (oficialmente) soporte de sistema operativo limitado, de acuerdo con la versión de DirectX y / o las funciones que utilizará. Deberá olvidarse de Windows XP, (muy posiblemente) Windows Vista y (menos posiblemente) Windows 7
  • el rendimiento (comparado con GDI +, GDI) no siempre es mayor. Depende principalmente de la forma y el propósito que utilice D2D. Hay casos en los que D2D tiene un rendimiento muy bajo (por lo general, uso incorrecto o conceptos mal entendidos).

Pero también, las ventajas que Direct2D podría proporcionar son innumerables.

En términos generales, Direct2D no es más que una envoltura alrededor de Direct3D. Se introdujo con DirectX 10 y su uso fue muy similar al GDI (+). Pero con DirectX 11 (1), los “principios” de Direct2D se cambiaron y ahora son más parecidos a D3D. Añade otros acercamientos y deja caer los viejos. Podría ser un poco confuso al principio. Confuso, también porque todos los tutoriales, artículos y cualquier recurso D2D (incluido MSDN) en la web están mezclados entre las versiones D2D. Algunos de ellos son para la versión anterior y recomiendan una cosa (enfoque), otros describen la nueva versión.

De todos modos, recomiendo la nueva versión, es decir, Direct2D 11.1.

A tu pregunta …

  1. El “RenderTarget” es un concepto de la “antigua” D2D. El nuevo es un DeviceContext.
  2. DeviceContext tiene un objective que podría ser un D2D1Bitmap (1): uno fuera de pantalla, un búfer posterior de una cadena de intercambio.
  3. El enfoque de dibujo más típico es llamar a funciones de dibujo dentro de un bloque DeviceContext.BeginScene — DeviceContext.EndScene. Las funciones de dibujo son muy similares a las de GDI (+).
  4. Hay varias maneras de hacer eso. Puedes hacerlo con la ayuda de WIC. También puede copiar sus datos D2D1Bitmap en un DIBBitmap o incluso puede (re) dibujarlos sobre un contexto GDI.
  5. Existe una función DeviceContext.DrawImage, pero la forma de hacerlo depende de muchas cosas. Por ejemplo, podría tener dos mapas de bits, que se dibujan sobre dos HWnd diferentes (uno para la barra de herramientas, otro para el otro dibujo).

Aquí hay algunos recursos que podrían ayudarte:

  • ¿Qué es Direct2D para
  • Dibujando un rectángulo con Direct2D
  • Guía muy bien explicada sobre la migración a Direct2D 1.1.
  • Responda a otra pregunta aquí , relacionada con Direct2D, pero explica brevemente la forma en que debe dibujar a un HWnd