Revistas en papel
 Amiga World Nº20 - Abril 1991
Anterior
Menú
Logotipo

El Amiga Me Encanta ha conseguido el permiso por escrito de IDG Comunications España
para ofrecer los artículos de la revista Amiga World España.

Añadiendo Gadgets en "C" Amiga World

Por David T. McClellan

El Intuition proporciona Gadgets estándar, como el de cerrar ventana, prioridad de campo, y gadgets de redimensionamiento en las esquinas de la ventana; pero igualmente, y de una forma sencilla, usted puede añadir sus propios gadgets en la ventana o en los bordes de la misma. Con simples estructuras de datos en "C" y unas cuantas llamadas, su programa podrá informar al Intuition de qué es lo que sus gadgets deberán realizar. De esta forma cuando un usuario seleccione uno de sus gadgets, el Intuition informará a su programa de los sucesos ocurridos, incluyendo la identificación de dicho gadget.

Para demostrar esto, a continuación se encuentra el código que proporciona un nuevo gadget (Quick-Zoom), similar al usado en los ordenadores Macintosh y en los Amigas con el sistema operativo 2.0. Este, situado en la parte superior de la ventana, amplía la ventana al máximo tamaño cuando se selecciona. Si este se selecciona de nuevo, reajustará el tamaño de la ventana al mínimo definido por el usuario. El gadget realiza esta operación a mayor velocidad que si se realizase con los gadgets de redimensionamiento, y las rutinas que a continuación se encuentran como introducir un nuevo gadget en el borde superior de la ventana.

Primero usted debe definir la imagen de su gadget e información acerca de su estructura. Las siguientes rutinas hacen esta operación en la creación de nuestro gadget Quick-Zoom.

   #define HEIGHT 100 /*max, min, alto y ancho iniciables */
   #define WIDTH 300
   #define MINWIDTH 100
   #define MINHEIGHT 50
   #define MAXWIDTH 640
   #define MAXHEIGHT 150
   /*Gadget ID, informaci�n de la imagen */
   #define GID_ZOOM1
   #define GAD_HEIGHT 12
   #define GAD_WIDTH 16
   USHORT chip Zoom_Pict[GAD_HEIGHT] =
   { 0x0000, 0x3FFC, 0x318C, 0x318C, 0x318C, 0x3F8C,
     0x300C, 0x300C, 0x300C, 0x300C, 0x3FFC, 0x0000};
   struct image Zoom_Image=
   { 0,0, GAD_WIDTH, GAD_HEIGHT, 1,Zoom_pict,
     0x1,0x0, NULL};
   struct Gadget Zoom_Gadget={/* Gadget para Zoom*/ NULL,
   /* Next */
     -80,0, GAD_WIDTH,GAD_HEIGHT, /*Left, Top, Width, Heigh */
     GADGHCOMP | GRELRIGHT | GADGIMAGE, /*Flags*/
     TOPBORDER | RELVERIFY, /* activaci�n */
     (APTR) &Zoom;_image, /* Imagen del Gadget */
     NULL,NULL,0L,(APTR) NULL,
     GID_ZOOM
     NULL
   }

Advierta la instrucción 'chip' en Zoom_Pict. Esta es una adición de Lattice C, con la cual se mete la imagen en memoria CHIP, lo que es necesario para poder visualizarlo. Si usted utiliza AZTEC C, necesitará copiar los datos manualmente en memoria CHIP.

Para guardar la anterior posición y tamaño de la ventana se define a continuación la estructura WinSizeStorage, la cual asimila estos valores en el momento en el que se abra nuestra ventana.

   struct WinSizeStorage {
     SHORT left, top;
     SHORT width, height;
   };

Ahora, para instalar el Gadget encima de la barra de arrastre, se utilizará una llamada a la función de la ROM AddGadget() después de abrir la ventana. La razón de que se realice en este orden es para que primero se posicionen en la misma los gadget del sistema (situados en una lista), para a continuación añadir los gadgets del usuario. Si no se especifica AddGadget(), primero, un click en el gadget Quick-Zoom podría ser interpretado como una selección de la barra de arrastre.

Utilizando la función AddGadget() sobre una ventana ya abierta, se deberá introducir Quick-Zoom en primer lugar de la lista por arriba de la barra de arrastre. A continuación se muestra el código de inicialización:

   struct NewWindow newWin;
   struct Window *win;
   struct WinSizeStorage *wss;
   /* La inicializaci�n espec�fica del programa se encuentra aqu� */
     newwin.IDCMFlags=CLOSEWINDOW|NEWSIZE|GADGETUP;
     newwin.FirstGadget=NULL;
     win=(struct Window*) OpenWindow(&newwin;);
     wss=(struct WinSizeStorage),0;
   AllockMem{sizeof(structWinSizeStorage),0};
     win->UserData=(BYTE *) wss;
     AddGadget (win,&Zoom;_Gadget, 0);
     RefreshGadgets(&Zoom;_Gadget, win, NULL);
   switch (message->Class) {
   case GADGETUP
     msggad=(struct Gadget *) (message->|Address);
     switch (msggad->GadgetID) {
       case GID_ZOOM:
          wss=(struct WinSizeStorage *)
            win->UserData;
       if ((win->Width !=MAXWIDTH) ||
       (win->Height !=MAXHEIGHT))
            {
       wss->left=Win->LeftEdge;
       wss->top=win->TopEdge;
       wss->width=win->Width;
       wss->height=win->Height;
       MoveWindow (win,
         -(win->LeftEdge),
         -(win->TopEdge));
       SizeWindow (win,
         MAXWIDTH-win->Width,
         MAXHEIGHT-win->Height);
           }
           else
           {
       SizeWindow (win,
         wss->width-win->Width,
         wss->height-win->Height);
       MoveWindow (win,
         wss->left-win->LeftEdge,
         wss->top-win->TopEdge);
           }
       break;
     }
     break;
   }

Mediante esta simple rutina se añadirá un nuevo gadget a sus ventanas, con el cual puede redimensionarlas sin gran esfuerzo y con bastante velocidad. Para ello el programa guarda las antiguas posiciones de la ventana en un Buffer, del cual toma los valores para redimensionarla a su tamaño anterior.


Envía esta página web a un amigo:
Esta opción está desactivada temporalmente, rogamos disculpen las molestias

Volver a la página anterior

Al menú principal