El Editor de Recursos (todos los proyectos)

Texto escrito por P. Eugene Brennick (traducción de Ramon Sala)


Disponible a través del menú Proyecto->Agregar Recurso

Cuando hay que proveer un método que genere fácilmente los recursos de un proyecto, que sea rápido y nada complicado, y que se encargue de ahorrarnos todo el código que ello supone, es cuando hace falta un buén Generador Visual de Recursos. El Editor de Recursos de Easy Code ha sido diseñado para hacer precisamente eso. Prácticamente puede sentarse y ver como los proyectos se hacen solos mientras se generan sin esfuerzo una ventana trás otra.

Si alguien hubiese escrito alguna vez un programa llamado La Anatomia de un Programa, habría podido ver en él que hay ciertos requisitos previos que llevan a crear un programa. Debe tener una idea que nace de una necesidad y que muestra los elementos que se necesitarán en el proyecto. Empiece a pensar cómo desea que funcione su programa, en todas las ventanas y cuadros de diálogo que necesitará, y también en hacer una lista de todas las herramientas necesarias en cada una de ellas. Debe tomarse el tiempo de pensar en el flujo del programa y anotar qué recursos estarán involucrados. En este punto, debe empezar a crear todas las ventanas y/o cuadros de diálogo que se necesitarán en el proyecto. Esto puede suponer incluir montones de recursos de la Caja de herramientas. Si esta caja no está visible, haga clic en el menú Ver, Caja de herramientas. Cosas como Botones, Cuadros de verificación, Botones de opción, Cuadros de texto, Etiquetas, Imágenes, Barras de desplazamiento, Vistas de lista y de árbol, son precisas para ayudarle a llevar su idea a la realidad.

No sufra por hacer más de la cuenta, puesto que, si algunos no se utilizan, se pueden suprimir fácilmente. Recuerde una máxima del programador, "La creatividad viene de un conflicto de ideas". Una vez que haya creado todos sus recursos, todo lo que tiene que hacer es escribir el código que enlace todo el proyecto. Una buena prestación de Easy Code es la habilidad de probar los cuadros de diálogo tal como se van haciendo.

Le animo a que haga una copia de la carpeta "Examples" en un archivo zip y entonces cargue los diversos proyectos que contiene para utilizarlos o simplemente verlos. Haga todos los cambios que desee y después genere el proyecto y observe el resultado. Si el proyecto genera errores, examine sus cambios para ver qué los produce. En mi opinión, esa es la mejor manera de aprender a programar en lenguaje ensamblador. Recuerde también que todos los proyectos de ejemplo son "freeware" para su uso y para aprender de ellos.

Con el fin de que todo funcionase eficientemente y fuese compatible con versiones anteriores, tuve que hacer algunos cambios en los archivos de proyecto. Estos cambios se describen a continuación:

1 - El formato del archivo de proyecto ha cambiado

El formato del archivo de proyecto ha cambiado para dar soporte al nuevo Editor de Recursos. Ahora, se añade un nuevo archivo (con extensión ecr) para guardar los recursos. La compatibilidad se ha mantenido, por lo tanto puede cargar con seguridad proyectos hechos con versiones anteriores de Easy Code sin errores. Cuando guarde un proyecto antiguo, será guardado en el nuevo formato. Easy Code se encarga del mantenimiento de las carpetas, que significa que si algun archivo en particular es ahora superfluo, será eliminado. Esta novedad no incluye los archivos RES externos, que no se tocan para nada puesto que es usted quien tiene todo el control sobre ellos, pero le recomendaría que llegase al punto de conseguir que todos los recursos, particularmente de proyectos visuales, estuviesen creados con Easy Code (vea Importación de archivos de recursos).

2 - Editor completo de Recursos (disponible en todos los proyectos)

Disponible a través del menú: Proyecto-->Agregar Recurso... o desde el nodo Recursos del Explorador del proyecto a través del menú contextual. Puede elegir uno de los siguientes recursos:

- Acelerador agrega una nueva tabla de aceleradores. Le animo a utilizar esta prestación. Funciones como Cortar, Copiar, Pegar, Deshacer, Rehacer, etc. a menudo se llevan a cabo más fácilmente utilizando las teclas adecuadas (especialmente si está acostumbrado a utilizarlas). Recuerde también que debería programar pensando en que su programa puede ser utilizado por el máximo número de gente posible. Sólo porque usted tal vez no utilice las teclas Control, piense que hay muchos otros usuarios que lo hacen casi sin pensar, y un buen programador también debe contemplar sus necesidades.

- Diálogo agrega un nuevo cuadro de diálogo ("dialog box"), sólamente disponible en los proyectos clásicos puesto que los proyectos visuales ya tienen su propio objeto DialogBox. Las cuadros de diálogo son indispensables. Son la principal manera de obtener información del usuario en diferentes etapas del programa. Agregue todos los Botones, Cuadros de verificación, Botones de opción, Cuadros de texto, Etiquetas, Imágenes, Barras de desplazamiento, Vistas de lista y de árbol que sean necesarias. Personalmente, considero que esta es una parte amena del diseño de una aplicación. Aquí es donde puede ir moviendo los controles con el método de hacer ‘clic y arrastrar’ hasta conseguir la apariencia correcta de su aplicación. Una cosa que me gusta, por ejemplo, es que cuando has agregado cuatro botones en el cuadro de diálogo, y deseas alinearlos perfectamente por la izquierda, puede ser bastante difícil saber donde se mueve el extremo izquierdo de los botones para que queden exactamente en el mismo sitio. Todo lo que hay que hacer es utilizar la barra de herramientas del cuadro de diálogo, donde hay diversos botones para igualar diferentes aspectos de los controles, o también hacer clic en cada botón para obtener el foco. Entonces vaya a la Ventana de Propiedades, encuentre la linea que dice 'Left' y cambie su valor. Después, haga clic encima de cada uno del resto de botones y efectue el mismo cambio. Es tan fácil como eso! Vea las otras lineas en la Ventana de Propiedades, hay muchos parámetros para ajustar o modificar! Finalmente, recuerde que el objecto Dialog puede tener un nombre de clase (propiedad (ClassName). Si es así, la clase debe estar registrada antes de crear el cuadro de diálogo. De otro modo, la creación fallará y nunca será vista.

- Imagen agrega una nueva imagen: Icono, Cursor o Mapa de bits (Bitmap). Los Iconos se pueden utilizar para diferentes propósitos. Pueden aparecer en la Barra de título, en los Menús y asignarse a un acceso directo, por nombrar sólamente algunos. También son interesantes para poner en las ventanas 'Acerca de' ("About"). Los Cursores son útiles para informar al usuario de una cuestión en particular, como por ejemplo, una cadena de texto que apunta a un enlace web o a una dirección de correo electrónico (vea también El icono de la aplicación).

- Menú agrega un nuevo menú. En este punto, piense en todas las operaciones que debe efectuar su aplicación, puesto que debería poner un ítem de menú para cada una de ellas. Cada cuadro de diálogo que haya sido creado debe tener también un ítem de menú que la haga aparecer. ¿Recuerda los comentarios sobre las teclas de Control para ciertas funciones? Pués aquí es donde se hacen claras. Cada ítem de menú puede tener dos versiones de 'teclas rápidas', que son ALT y CTRL.

Las teclas ALT se declaran poniendo un ampersand (&) justo antes de la letra que debe llevar a cabo la acción. Por ejemplo, si desea activar el menú Archivo pulsando ALT+F, el texto para el ítem de menú correspondiente debe ser &Archivo. Si deseara que fuese ALT+R, el texto debería ser, A&rchivo, etc. Recuerde, cuando trabaje con submenús, que si tiene diferentes ítems en el mismo submenú que lleven a cabo una acción utilizando la misma letra, ninguno de ellos funcionará. Por ejemplo, no debe permitir estos dos textos en el mismo submenú, &Guardar Archivo, &Guardar Configuración. En su lugar, asigne una letra diferente a uno de los dos textos. Las declaraciones de la tecla ALT (yo las llamo promociones porque, desde el momento en que la tecla está relacionada con una función, ha sido promocionada) no diferencian entre mayúsculas y minúsculas.

Las teclas CTRL también se utilizan en los textos de los ítems de menú, pero de la siguiente manera: "Seleccionar &Todo\tCtrl+T". Como puede ver, otorga una promoción a la tecla CTRL con esta secuencia, “\t”. Es MUY importante notar dos cosas:

- 1. Las promociones de la tecla ALT están limitadas a un submenú específico. &Archivo y F&ormato, &Archivo son ambas válidas. Las promociones de la tecla CTRL son declaraciones globales dentro de todo el sistema de menú. Por ejemplo, si está utilizando "Seleccionar &Todo\tCtrl+T", CTRL+T no debe utilizarse en ningún otro sitio.

- 2. Recuerde que hay teclas CTRL promocionadas inherentemente por el sistema. Estas declaraciones deben considerarse como reservadas y NO deben utilizarse en ninguna parte. Ejemplos de estas teclas son CTRL seguida de cualquiera de las siguientes letras, A, C, U, V, X, Y y Z, más F1, TAB, ESC y DEL.

Las declaraciones de la tecla CTRL (yo las llamo promociones porque, desde el momento en que la tecla está relacionada con una función, ha sido promocionada) no diferencian entre mayúsculas y minúsculas. Por ejemplo, las letras ‘c’ y ‘C’ son la mísma.

- Datos binarios agrega datos binarios ("Raw data"), tanto si son valores sueltos como un archivo entero. Esta parte se puede utilizar para almacenar bloques de datos, típicamente en hexadecimal. Los iconos y gráficos de mapas de bits se pueden insertar en un archivo de recursos utilizando esta habilidad.

- Cadena agrega una nueva cadena de texto. Aquí es donde puede declarar, por ejemplo, las descripciones para las teclas promocionadas, o también los mensajes de error y de ayuda. Un ejemplo: una descripción de COPIAR (CTRL+C) sería “ "IDM_COPIAR" "&Copiar" ”. Otro ejemplo, esta vez de mensaje de ayuda, “ "IDS_DESHACER" "Para deshacer el último cambio, pulse CTRL+Z" ”.

- Versión agrega un recurso de versión (sólo uno). Se puede eliminar si no desea que su .exe o .dll finales tengan versión, pero si tienen, cuando haga clic con el botón derecho sobre el archivo EXE o DLL generado por su aplicación, y seleccione Propiedades y la página Versión; podrá ver cierta información específica que haya declarado aquí. Es una bonita manera de revelar la autoria, etc. a sus usuarios.

Cada recurso debe tener un ID único, habitualmente todo en mayúsculas, y no ser ninguna de las palabras reservadas. Las palabras reservadas son aquellas que forman parte de la sintaxis de Masm, los nombres de los registros del procesador, las constantes y variables de Windows, o ID's reservados de Easy Code (por ejemplo, IDR_VERSION o RT_FILEDATA). La lista de las palabras reservadas de Easy Code ha sido generada como un proyecto de ejemplo (carpeta Examples), para matar dos pájaros de un tiro.

El recurso Versión siempre tiene el nombre constante IDR_VERSION, que vale 1. Sólamente se permite un recurso versión en una aplicación, y puede eliminarlo si no desea que su EXE o DLL finales tengan versión.

El recurso Cuadro de Diálogo no se encuentra disponible en los proyectos visuales, porque tienen su propio diálogo, el objeto DialogBox, que es más completo.

Para los recursos Acelerador, Imagen, Datos binarios y Cadena, debe especificar un ID (p.e. IDS_STRING) y un valor o datos para ese ID (una cadena de texto para Cadena, un archivo de imagen para Imagen, etc.).

Cuando se definen Datos binarios, puede indicar dos tipos diferentes de datos:

- Un nombre de archivo que exista (y que debe estar en el directorio RES). Este archivo será incluído en el .EXE o .DLL finales como un recurso.

- Un valor o valores consecutivos, cada uno de ellos separados por una coma.

Notas:

- Cuando se especifique un nombre de archivo, el archivo correspondiente debe estar en el directorio RES.

- Cuando se especifiquen valores, deben estar en uno de los siguientes formatos válidos:

L"Aquí tenemos una cadena Unicode\0" // Una cadena Unicode (explícitamente "null-terminated")
"Aquí tenemos una cadena ANSI\0"     // Una cadena ANSI (explícitamente "null-terminated")
1024                                 // Un valor entero
0x029a                               // Un valor entero Hexadecimal
0o733                                // Un valor entero octal
"\07"                                // Un valor de Byte (8 bits)

Ejemplos:

2048            // Un valor entero (16 bits)
1,2,3,4         // Cuatro valores enteros (16 bits)
"1","2","3","4" // Cuatro valores Byte (8 bits) (valores ASCII: 49, 50, 51 y 52)
"\r"            // Un carácter de control (8 bits) correspondiente al código ASCII 13 (<Retorno de Carro>)

Note que cualquier valor numérico (en notación decimal, hexadecimal u octal) es siempre un entero de 16 bits (valor DW en ensamblador).

IMPORTANTE: Usted es responsable de especificar los valores en cualquiera de los formatos válidos de Datos binarios explicados más arriba, para evitar errores a la hora de compilar (para más información, vea la sentencia RCDATA en el archivo de ayuda de GoRC o de RC). No olvide las comillas dobles cuando sean necesarias, y la coma cuando se especifique más de un valor. Por otra parte, cuando se trate de una cadena de texto como Datos binarios, tenga en cuenta que es una cadena ANSI (si no es que está precedida de la macro 'L') y NO es "null-terminated", por lo tanto debe añadir explícitamente el cero final si es preciso. Esto no es necesario para los recursos Cadena, puesto que siempre son cadenas de texto Unicode "null-terminated".

Cuando necesite cargar un recurso de Datos binarios en alguna parte del código, primero debe localizarlo (función de la API: FindResource). El último parámetro de FindResource es el tipo de recurso que debe encontrarse. Este tipo tiene que ser RT_RCDATA para datos enteros, o RT_FILEDATA si se trata de un archivo (RT_FILEDATA está definida internamente por Easy Code como 256 y no forma parte del sistema operativo Windows).

- Para guardar todos los recursos, Easy Code crea un nuevo archivo en el proyecto, con la extensión ECR (los proyectos de versiones antiguas de Easy Code serán convertidos sin errores y guardados en este nuevo formato).

- Finalmente, cuando genere el proyecto, un archivo.rc completo (con el mismo nombre que el proyecto más la extensión .rc) y su correspondiente archivo .h (un archivo de cabecera) serán generados en el directorio del proyecto. Ambos archivos se vuelven a generar cada vez que se compila una ventana o un módulo.

3 - Los recursos de Easy Code son ignorados cuando se agrega un archivo de recursos externos (*.RES)

Sólo se puede enlazar un archivo de recursos en una aplicación. Puesto que todos los recursos ahora ya pueden ser creados por Easy Code, si agrega un archivo externo de recursos (*.RES) al proyecto, Easy Code supondrá que ya tiene todos los recursos necesarios dentro del archivo externo agregado y, por lo tanto será éste último el que será enlazado ("link") a la aplicación. En ese caso, los recursos generados por Easy Code (si tiene alguno) serán ignorados. Por otra parte, cuando no se agrega ningún archivo externo de recursos, Easy Code enlazará los suyos (si tiene alguno) a la aplicación.

4 - Easy Code genera un archivo RC y su correspondiente archivo de cabecera (*.H)

A la hora de compilar, un archivo RC con todos los recursos de Easy Code, será generado en el directorio del proyecto.

Finalmente, gracias por dedicar tiempo a evaluar mi IDE. Ha sido hecho específicamente para su uso y entretenimiento. Si desea formar parte de este proyecto, puede ofrecer el código fuente que desee para incorporarse a una creciente lista de ejemplos de nuestro Equipo de evaluación de Recursos. Todos ellos son tratados igualmente y sólamente se evaluan en términos de funcionalidad (por ejemplo: ¿funcionan?) y ética de utilización (por ejemplo: no es necesario que envie nada que tenga que ver con el "cracking" o "hacking", ¡ya tenemos suficiente!).

OBSERVACIONES: Esta prestación no está disponible para los archivos clássicos COFF (proyectos (obj) puesto que no pueden tener recursos.

IMPORTANTE: Si escribe cualquier texto en la propiedad ClassName de un cuadro de diálogo, Easy Code entenderá que se trata del nombre de clase y así lo escribirá en el archivo de definición de recursos .RC. Si se trata de un número, significará un entero de 16 bits sin signo que identifica la clase. De lo contrario, significará directamente el nombre de una clase. A la hora de mostrar ese cuadro de diálogo, su clase debe estar registrada (o debe ser una de las clases predefinidas de Windows) para que la ventana pueda ser creada. Si no va a registrar la clase, simplemente deje la propiedad ClassName en blanco (valor por defecto) para evitar errores. Para más información, vea la sentencia CLASS en el archivo de ayuda de RC o GoRC

Recuerde que sólo un archivo de recursos puede ser enlazado a la aplicación. Por lo tanto, si agrega un archivo externo *.res, los recursos hechos por Easy Code serán ignorados.