Gestión de recursos

A lo largo del programa necesitaremos usar a algunos recursos. Ya hemos resuelto los referentes a los gráficos de los naipes, máscaras, icono, cursor... Pero necesitaremos algunos otros, que incorporaremos a nuestro fichero de recursos.

Menú

Como es lógico, usaremos un menú para acceder a las funciones y opciones de nuestro programa.

Como también usaremos aceleradores, añadiremos la información, al menos para algunos de ellos, a las opciones de menú que dispongan de un acelerador.

Para el caso de las opciones de "Deshacer" y "Ayuda", usaremos un espacio como separador entre el texto del menú y el acelerador. Para la opción de "Nueva partida", usaremos el separador '\a'.

Menu MENU
BEGIN
    POPUP "&Juego"
    BEGIN
        MENUITEM "&Nueva partida\aF2",CMD_NUEVO
        MENUITEM "&Opciones...",CMD_OPCIONES
        MENUITEM SEPARATOR
        MENUITEM "S&obre...",CMD_SOBRE
        MENUITEM SEPARATOR
        MENUITEM "&Salir",CMD_SALIR
    END
    MENUITEM "&Deshacer ^Z",CMD_DESHACER
    MENUITEM "&Ayuda F1",CMD_AYUDA
END

Aceleradores

Por supuesto, no basta con poner un texto en el menú para definir un acelerador, también hay que crear una tabla de aceleradores, cargarla y modificar el bucle de mensajes de la aplicación para que se procesen adecuadamente.

Nuestra tabla de aceleradores será:

Aceleradores ACCELERATORS
BEGIN
 VK_F2, CMD_NUEVO, VIRTKEY
 "^Z",   CMD_DESHACER
 VK_F1, CMD_AYUDA, VIRTKEY
END

Para cargarla usaremos las sentencias siguientes:

    HACCEL hAcelerador;      /* Manupulador de aceleradores */
...
    hAcelerador = LoadAccelerators(hThisInstance, "Aceleradores");
...

Y modificaremos el bucle de mensajes para procesar los aceleradores:

    while (TRUE == GetMessage (&messages, NULL, 0, 0)) {
        if(!TranslateAccelerator(hwnd, hAcelerador, &messages)) {
           /* Traducir mensajes de teclas virtuales a mensajes de caracteres
              sólo si TranslateAccelerator regresa con nulo */
           TranslateMessage(&messages);
           /* Enviar el mensaje a WindowProcedure */
           DispatchMessage(&messages);
        }
    }

Diálogos

Necesitamos tres cuadros de diálogo diferentes: uno de opciones, que permitirá al usuario seleccionar el gráfico para el dorso de los naipes. Otro para mostrar los datos sobre el programa, versión y el autor. Un tercero para mostrar un texto de ayuda.

Tabla de cadenas de texto

Los textos que usemos durante el programa para mostrar mensajes, los almacenaremos en una "string table":

STRINGTABLE
BEGIN
   ID_TITULO,          "Solitario"
   ID_RESUELTO,        "Enhorabuena, has resuelto el juego."
   ID_SINSOLUCION,     "El juego no tiene solución."
   ID_CARTASMAZO,      "Cartas en mazo %d"
   ID_CARTASMONTON,    "Cartas en montón %d"
   ID_CARTASCOLOCADAS, "Cartas colocadas %d"
END

El programa

Nombre Fichero Fecha Tamaño Contador Descarga
Ficheros fuente solitario.zip 2011-11-09 48642 bytes 521