| Artículos | 01 SEP 1995

Arrastrar y soltar en OS/2 y Windows 95

Tags: Histórico
Editor ObjectWindows 2.0 con capacidades Drag & Drop y menús emergentes
Jaime Peña.

En los más recientes sistemas operativos la presencia de menús emergentes y el método de arrastrar y soltar se convierten en algo casi necesario para todas las aplicaciones.

Si usted dispone de Windows para Trabajo en Grupo 3.11 ya puede utilizar parte de lo que OS/2 Warp 3.0 y el venidero Windows 95 incluyen como un modo de hacer habitual. Puede probarlo con el Bloc de notas de Windows, o con un procesador de textos de la última versión, como WordPerfect para Windows 6.x o Word 6.0. Abra el Administrador de archivos, localice el icono del documento que quiera editar, pulse con el botón izquierdo sobre él y arrástrelo sobre la ventana de su procesador de textos. Al liberar el botón del ratón, se abrirá el documento en el procesador de textos. Esa operación es la que ya conoce como arrastrar y soltar (drag & drop). En los sistema operativos enfocados a objetos, se extiende dicha capacidad a todo él. Así, en el WorkPlace Shell de Warp o en el escritorio de Windows 95, en los que ya no hay una estructura jerárquica estricta de grupos de programas/elementos de programa, podremos tener iconos de documentos sobre él y no precisamos acceder a algo semejante a un Administrador de archivos (que desaparece).

Naturalmente, tanto los menús emergentes como arrastrar y soltar ya se emplean en aplicaciones que están entre nosotros desde hace tiempo. Pero ¿cómo es posible incluir esas funcionalidades en nuestros programas? En este artículo, nos interesará ver tres cuestiones: cómo se debe implementar un editor de textos sencillo, según la nueva metodología dictada por la biblioteca ObjectWindows 2, cómo programarlo para usar menús emergentes y cómo dotarlo de la posibilidad de abrir archivos arrastrándolos y soltándolos sobre él. Así, por tanto, trataremos de diseñar algo semejante al Bloc de notas de Windows y de ir un poco más allá en algunos aspectos.

Un editor con ObjectWindows 2.0

La biblioteca ObjectWindows, en su versión 2.0, ha cambiado el método mediante el cual se implementan editores (bien sean como ventanas principales o como controles de edición en una caja de diálogo). En la versión 1.0 se usaban las clases TEditWindow y TFileWindow; actualmente, se deberán emplear las clases TEditSearch y TEditFile, que derivan de la clase TEdit, usada para crear controles de edición de textos.

De todas formas, se proporciona una vía de migración temporal, de manera que aún pueden utilizarse las viejas clases de ObjectWindows 1.0, incluyendo en nuestro código un par de archivos (EDITWND.CPP/EDITWND.H o FILEWND.CPP/FILEWND.H) en el código antiguo que deseemos aprovechar.

La clase base TEdit conformará los controles de edición comunes en cajas de diálogo. Sus prestaciones se refieren a entradas de textos por parte de los usuarios, seleccionar, cortar, copiar y pegar desde y hacia el Portapapeles de Windows, y operaciones de borrado y deshacer cambios de contenidos anteriores.

La clase TEditSearch nos proporciona lo básico para implementar un control de edición con búsquedas y sustitución de textos. Al aprovechar, por herencia, las capacidades de que está dotada TEdit, servirá para completar el manejo de textos en pantalla.

La clase TEditFile, por contra, extiende su ámbito a la gestión de archivos de texto en disco, de forma que (además de los heredado de TEditSearch y, por ende, de TEdit), nos facilita las operaciones de abrir y guardar en archivos y la creación de archivos de texto nuevos en disco. En la tabla de la figura 1, observamos las funciones miembro que implementa (y hereda) cada una de las clases, en lo referente a respuestas a selección de opciones de menú. Todas ellas son de la familia Cm..., del inglés Command Message.

En nuestro ejemplo, partiremos de un objeto derivado de TEditFile, con lo que aprovecharemos al máximo las capacidades de edición que nos da la biblioteca ObjectWindows 2.0.

Por otra parte, cabe que la ventana marco de la aplicación trabaje en conjunción con una sola ventana de edición (SDI, Single Document Interface) o con varias simultáneamente (MDI, Multiple Document Interface). En cualquier caso, la ventana de edición, que será una ventana hija que ocupa todo o parte del área cliente de la ventana marco, no contendría un menú propio. Será la ventana marco, típicamente derivada de la clase TFrameWindow, la que contenga el menú y remita los mensajes a la(s) ventana(s) hija(s).

El armazón de un editor simple

Entendemos por un editor simple aquél que permite trabajar con un archivo de texto, sin más. Para ello, crearemos una ventana principal y le asociaremos un control derivado de TEditFile, cómo su ventana hija que abarque toda el área cliente de la ventana marco.

Si nos fijamos en el listado de la figura 2, la ventana cliente se define derivándola de la clase Teditfile, con un constructor por defecto, sin más. Se declaran un handle para la inclusión del menú principal; la mayor parte de sus opciones están predeterminadas en ObjectWindows, otras las adicionaremos nosotros, para dotarlo de mayor funcionalidad. A modo de ejemplo, obsérvese la función miembro Create(), que redefinimos para incluir la entrada de menú "Sustitución...".

(NOTA: En el código fuente que puede obtener en el Disquete PC World de este mes, encontrará un código con prestaciones más completas, como una entrada en el menú principal que permite seleccionar entre fuentes de conjuntos de caracteres ASCII-ANSI de Windows y ASCII-OEM, propio del DOS; nuevos atajos del teclado; traducción completa de los nombres de opciones de menú, etc. Por razones obvias de espacio, aquí trabajamos sobre esta aplicación más reducida).

Para la implementación de un editor de archivos simple, sólo nos quedaría declarar y definir la tabla de respuestas a mensajes (DECLARE_RESPONSE_TABLE y DEFINE_RESPONSE_TABLE1). En nuestro ejemplo, la función miembro de respuesta a la opción de menú Archivo\Nuevo, denominada CmFileNew(), simplemente llamará a la función miembro NewFile(). Por contra, la función de respuesta a Archivo\Abrir, denominada CmFileOpen(), contiene una caja de mensajes que nos pide confirmación y, si la respuesta es aceptar, llamará a la función miembro Open().

Por último, se redefine la función miembro CanClose(), que se llama automáticamente al salir del programa.

Allí implementamos una nueva caja de mensajes de confirmación del abandono del programa y la biblioteca ObjectWindows llamará al diálogo de si deseamos guardar cambios, si es que ha habido modificaciones en el texto de la ventana del editor.

Una última llamada de atención, el constructor de la ventana marco, se hace tal cual se observa en el listado de la figura 2 porque es una SDI. De lo contrario, se crearían las ventanas hijas por selección de opciones de menú. No lo hemos hecho así por simplificar el ejemplo, pero tiempo habrá de tratar este y otros temas de programación con ObjectWindows 2.0 y sus importantes novedades (TDecorateFrame, TDocument, TGadgetWindow, validación de entradas y mucho más).

Incluir 'arrastrar y soltar'

La capacidad de ser un receptor de arrastrar y soltar, se lleva a cabo en dos pasos, muy sencillos por otra parte. Primero, en la función miembro Create() del objeto TVentanaCliente, que es la ventana de edición asociada a la ventana marco, se incluye el código:

DragAcceptFiles(TRUE);

Segundo, se redefine la función miembro EvDropFiles, que toma como parámetro un objeto de la clase TDropInfo. Esta clase dispone de cinco funciones miembro (véase figura 3). Nos interesan dos de ellas, que son las empleadas en TVentanaCliente::EvDropFiles.

Mediante DragQueryFile tomamos el nombre del primer archivo que se arrastra y suelta. Es posible que se realicen arrastres múltiples, pero sólo se tomará en cuenta el primer archivo (índice cero). Bueno sería crear un código que detecte arr

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información