          SWGPTG  - Small Windows Graphics Programming Tutorial with GDI

Con motivo de la apertura de este nuevo hilo me he decidido a postear un pequeo tutorial sobre la programacin de grficos con GDI, que es de hecho un subconjunto de mi tutorial de grficos sobre Windows con GDI. Ir dejando un nuevo post cada fin de semana (o as) hasta que usted / yo se canse, as como [url=]aqu[/url] y [url=]all[/url]. Tiene dos pruebas para ejercitarnos, que revisaremos en el siguiente fin de semana (o as).

El tamao del rea cliente ser de 640x400, que cumple con la condicin urea de la proporcionalidad: 1,6.

Puedes hacer uso de lo que aqu te resulte interesante con las restricciones lgicas: no est permitido el plagio y se requiere referencia si lo usas.

Seguramente, muchos de los que estis leyendo esto ya habis programado grficos en MS-DOS, probablemente en el modo 13H. La programacin de grficos para Windows con GDI no es muy diferente.


1.- Necesitamos un lienzo sobre el que pintar

En MS-DOS escribamos sobre el segmento:direccin A000:0000, ahora no podemos hacer eso, sino que escribiremos sobre el hDC (display device context) que nos proporciona la funcin BeginPaint que colocaremos dentro de la seccin/mensaje WM_PAINT. Sin embargo esto es muy muy lento, porque tiene muchas opciones diferentes de las que ocuparse. Si pintamos punto a punto la espera puede eternizarse. Para evitar este gran inconveniente haremos uso de un bfer de datos que mandaremos pintar de una sola vez, lo cul es casi inmediato.

El bfer de datos que crearemos ser un bitmap que mandaremos pintar en el hDC con una funcin BitBlt o StretchBlt. Ser este ltimo el que usemos. Para la creacin del bitmap usaremos la funcin CreateDIBSection, que devuelve un puntero a los valores de los bits del bitmap creado. Este puntero es muy importante porque es el que nos permitir escribir en l de forma muy rpida.

La escritura en nuestro bfer DIB lo podemos hacer manualmente o mediante funciones GDI, como SetPixel. Contrariamente a lo que mucha gente dice, SetPixel no es especialmente lenta en s misma, como demostr hace algn tiempo [url=]aqu[/url]. Es la escritura en el hDC lo que es lento. Aunque, por supuesto, siempre usaremos aquello que nos de mayor velocidad de escritura.

En resumen, podramos identificar la direccin A000:0000 del MS-DOS con el hDC de WM_PAINT, al que para acceder de forma efectiva, necesitaremos de un bfer de datos intermedio con formato DIB.


2.- Plantilla

Para terminar este primer post adjuntar las plantillas de varios compiladores. Si se compilan y ejecutan smplemente mostrarn una ventana relleno de un color por defecto. No conviene comerse la cabeza sobre cmo est estructurado este fichero, smplemente hay que tener en cuenta los siguientes procedures dentro del cdigo:

  * Inicio. Aqu incluirs el cdigo que slo quieras que se ejecute una sola vez al inicio de la aplicacin. Es llamado dentro de WM_CREATE. Por ejemplo para inicializar ciertas variables, etc.
  * PintaObjeto. Aqu incluirs el cdigo que quieras que se ejecute cada vez que se cumple el tiempo preestablecido. Yo lo he puesto cada 20 milisegundos. Es el cdigo que ir renovando lo que aparece en nuestra ventana. Se ejecuta dentro de WM_PAINT.
  
Sera interesante detenernos en los siguientes puntos:
  * Para pintar en nuestro bitmap DIB usaremos la variable pMainDIB, que es el puntero que lo direcciona. A esta direccin le pasaremos el color deseado del punto que tiene el formato AARRGGBB, donde AA(alfa) = 0 y el resto son te tamao byte (de 0 a 0xFF). Esto significa que el tamao del punto a pintar de dword, por lo que para pasar al siguiente tendremos que sumar 4. El puntero se inicia en la esquina superior izquierda y se incrementa hacia la derecha, cuando termina con la longitud de la lnea lo veremos aparecer en el primer punto de la izquierda de la lnea de abajo.
  * El color de fondo de nuestra ventana, establecido en la estructura WNDCLASSEX debe ser 0, lo cul indica que no tiene, de otro modo obtendrs parpadeo en la pantalla.
  * La captura de mensajes del procedure WinMain la hago con GetMessage en lugar de PeekMessage porque este ltimo genera un incremento de trabajo innecesario en la mayora de las ocasiones, como se demuestra [url=]aqu[/url].
  * Cuando establecemos la dimensin de la ventana, no es la del rea cliente, que ser inferior, por lo que, si lo queremos para sta tendremos que hacer unas cuentas extra, aunque dado que la ventana es redimensioanble, tal vez no merezca la pena.
  
  
3.- Quiz 1
Hacer un pequeo programa que dibuje un degradado de colores.
[img][/img]


4.- Quiz 2
Temtica libre para subir nota.

