lunes, 12 de noviembre de 2012

Cambiar icono en una ventana mediante el API Windows

A veces es interesante personalizar tu aplicación y más si es un videojuego. Una manera de lograr esto es cambiar el icono de la ventana de tu aplicación.

Bien, pues algo "sencillito" como cambiar el icono de una ventana en Windows utilizando su API se puede convertir en algo infernal si una guía de como hacerlo.

Después de googlear bastante he llegado a la conclusión de que la mejor forma es mandar un mensaje a la ventana pidiendole un cambio de icono (WM_SETICON):

mInstance = GetModuleHandle(NULL);

HANDLE icon_small = LoadImage(mInstance, "C:\\crosshair.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE);

HANDLE icon_big = LoadImage(mInstance, "C:\\crosshair32.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE);

Los dos tamaños son para el icono que aparece arriba a la izquierda de la ventana y el grande es para la barra de tareas.

Una vez hecho esto y después de crear la ventana:

    // Create The Window
    mWnd = CreateWindowEx( lExStyle,
       lProperties.macApplicationName.c_str(),  // Class Name            
       lProperties.macApplicationName.c_str(),  // Window Title
       lStyle |                                                      // Defined Window Style
       WS_CLIPSIBLINGS |                            // Required Window Style
       WS_CLIPCHILDREN,                           // Required Window Style
       0, 0,                                                         // Window Position
       lWindowRect.right-lWindowRect.left,       // Calculate Window Width
       lWindowRect.bottom-lWindowRect.top,   // Calculate Window Height
       NULL,                                                     // No Parent Window
       NULL,                                                     // No Menu
       mInstance,                                                // Instance
       NULL);


Tenemos que enviar el mensaje de cambio de icono:

  SendMessage(mWnd, (UINT)WM_SETICON, ICON_SMALL, (LPARAM)icon_small);
  SendMessage(mWnd, (UINT)WM_SETICON, ICON_BIG, (LPARAM)icon_big);


Con esto ya tendríamos personalizado el icono ;-)