Ventanas Personalizadas
Escrito por TeMpEsT

Publicado:12/02/1999
  Actualizado:12/02/1999
   

 

Introducción 

El mIRC nos permite la creación de ventanas personalizadas que no son más que "ventanas" con diferentes atributos (que aprenderemos a asignar y modificar) y que pueden ser usadas para cualquier tipo de acción, generalmente para mostrar informacion al usuario, ya que se hace de una manera más limpia y ordenada que mostrando toda la información en la ventana de Status
 
Después veremos que tambien pueden ser usadas para la creación de GUI's (Interfaces Graficas de Usuario) mediante las picture Windows o ventanas de imagen. 
 
Este documento está pensado para que el lector y aprendiz de scriptter tenga un primer contacto con las ventanas personalizadas y sea capaz de crearlas y manipularlas a su gusto. Se han suprimido algunas funciones del comando window bien por el escaso uso de estas o porque suponen alguna dificultad añadida que solo la experiencia con el scripting nos ayudaria a superar. De cualquier forma una vez el lector ya domine todos los comandos y eventos expuestos en este tutorial, le remito a la ayuda del mIRC en ella encontrara informacion (de una forma mas resumida, eso sí) de todas las funciones del comando window
 
En el presente texto se utilizarán las sigientes convenciones para presentar la sintaxis de instrucciones y comandos: los argumentos entre < y > representarán valores que es necesario introducir para la correcta ejecucion del comando, mientras que los argumentos entre [ y ] son opcionales, y pueden ser omitidos a la hora de ejecutar el comando. 
 
La manera de seguir el documento, y aprender con él, es leerlo de arriba a abajo, siguiendo todos los ejemplos y probandolos todos antes de seguir. Tambien es conveniente que el lector modifique a su gusto los ejemplos que aquí encontrará para que vaya experimentando con los comandos de creacion/modificacion de ventanas personalizadas. 
 
En este tutorial aparecen mucho las palabras "editbox" y "listbox", se refieren, respectivamente, al campo de texto que tienen en la parte inferior ciertas ventanas (como las ventanas de los canales), y a las listas de 'objetos' seleccionables que tienen tambien ciertas ventanas (como la lista de nicks en los canales). 
 
Y, por último, antes de empezar, en este tutorial se presupone que el lector ya es medianamente experto en el uso de Aliases, Popups y Eventos Remotos 
 
 
Creación de ventanas 

Para crear una ventana personalizada usaremos el comando window con la siguente sintaxis: 
  /window [-acdeEhkl[N]noprswx] [+bdelLmnstx] <@nombre> [x y [w h]] [popup]  
Por ejemplo: 
  /window –ad @miventana 10 10 200 100   
Introduzca esta orden en mIRC y descubrirá que ha creado una nueva ventana de windows, verá que su nombre es "miventana" (el símbolo @ debe de especificarse siempre al principio del nombre, esto corresponde al argunento <@nombre> en la sintaxis general). Hemos utilizado dos parámetros en esta orden: -a y -d, esto ha supuesto que se ha mostrado como ventana activa de windows y su icono ha aparecido en la barra de tareas de la parte inferior de la pantalla. Observe que al utilizar dos parámetros segidos solo hemos necesitado un símbolo "-" delante de ellos. Los números 10 10 200 100 especifican la ubicación y dimensiones de la ventana (corresponden respectivamente a los parámetros x, y, w, h); los dos prineros deterninan la posición dentro de la pantalla, los dos últimos sus dimensiones (alto y ancho). 
 
La posición de la ventana se basa en un sistema de coordenadas que toma como origen la esquina superior izquierda de nuestra pantalla, y sitúa la esquina superior izquierda de la ventana en el punto indicado, en este caso coordenadas 10,10. 
 
Volvamos a la sintaxis general del comando window para analizarla más despacio, resulta un poco imponente pero veremos como examinando cada una de sus partes es bastante más asequible de lo que parece :-). 
 
Existen dos grupos de parámetros que podemos emplear, por un lado [-acdeEhkl[N]noprswx] y por otro [+bdelLmnstx]. De inmediato veremos la utilidad de cada elemento de estos grupos. Una vez escritos los parámetros deseados especificaremos el nombre que queremos dar la la ventana (siempre con @ delante). A continuación no queda sino concretar ubicación y tamaño de la ventana, no es necesario especificar ninguno de los dos, en ambos casos se asumen unos valores por defecto. También tenemos la posibilidad de incluir al final del comando el nombre de un fichero de popup's si deseamos que la ventana cuente con sus propios menús emergentes, es decir, aquellos que aparecen pulsando sobre ella con el botón derecho del ratón. 
 
A continuacion puede ver una descripcion de para que sirve la primera tanda de parametros del comando window que definiran el estado de la ventana: 

  • -a : Activa la ventana. 
    -c : Cierra la ventana. 
    -d : Abre la ventana como ventana de escritorio ( se puede acceder a ella desde la barra de ventanas de Windows). 
    -e : Añade a la ventana un editbox o línea de escritura (como la que tienen en la parte inferior los canales). 
    -E : Añade a la ventana un editbox de múltiples lineas líneas. 
    -h : Esconde la ventana. 
    -k : Esconde el prefijo '@' del nombre de la ventana. 
    -w : Devuelve el prefijo '@' al nombre de la ventana. 
    -l[N] : Añade una listbox (lista de elementos) a la ventana. Si se especifica N (opcional) se crea una listbox con N caracteres de largo. 
    -n : Minimiza la ventana. 
    -o : Si la ventana es una ventana de escritorio, este parametro la pone y mantiene siempre encima de todas las ventanas (on top). 
    -u : Desactiva el poner la ventana encima de todas (on top). 
    -p : Crea una ventana de imagen o "picture window" (esta opción será analizada en un capitulo aparte). 
    -r : Restaura una ventana despues de minimizarla. 
    -s : Organiza por orden alfabético la ventana. 
    -S : Organiza por orden alfabético la listbox de una ventana. 
    -x : Maximiza la ventana.

Hasta aqui hemos visto la primera tanda de argumentos del comando window , no se asuste, la inmensa mayoria de las veces solo usará uno o dos de estos argumentos, pero esta bien que los conozca por si los necesitara para alguna ocasión en especial. 
 
Ahora vamos con la segunda tanda de argumentos del comando, estos definirán la apariencia de la ventana: 

+b : Dibuja un pequeño borde alrededor de la ventana. 
+d : Ventana sin borde. 
+e : Dibuja un borde un poco mas ancho y redondeado. 
+l : Ventana de utilidades. 
+n : Boton de minimizar. 
+s : Se puede cambiar de tamaño. 
+t : Con barra de titulo. 
+x : Con boton de maximizar.

Después tenemos que indicar el nombre de la ventana a crear/modificar : 
 
<@nombre> : Por ejemplo, @mi_ventana 
 
Por último indicamos (opcionalmente) las coordinadas de la posición inicial de la ventana ( x y ) así como su longiud y altura (en pixels). w (longitud) h (altura) 
 
[ x y [ w h ] ] : por ejemplo, 100 100 300 100 
 
Las coordinadas x y significan la distancia en pixels desde el extremo izquierdo de la pantalla, y desde el extremo superior de la ventana principal del mIRC (¡ojo, que no es lo mismo que el extremo superior del monitor!). 
 
Por ultimo el parámetro [popup] sirve para especificar un archivo que contenga el menú popup de la ventana (que aparecera al hacer click con boton derecho sobre la misma). Se puede especificar un archivo (cuya extension NO sea .ini) o bien el mismo nombre de la ventana (Ej: @mi_ventana) si se quiere implementar el popup dentro de los remotes del script. 
 
 
Edición/Modificación de ventanas 
 
Ahora que el lector ya sabe las posibilidades del comando window, veremos, ya creada la ventana, que comandos podemos usar para modificar la informacion que se muestre en ella. 
 
El parámetro [c] esta presente en todos estos comandos, e indica el color principal de la linea que añadirá, borrará, o modificará . En cualquier caso también se peden especificar controles de color (ctrl + k + color), negrita (ctrl + b) y subrayado (ctrl + u) en el parámetro <texto>. 
 
Estos comandos se refieren siempre a actuar sobre la ventana principal, en caso de que queramos actuar sobre una listbox a un lado de la ventana, incluiremos el parametro -l entre el nombre del comando y el parametro [c], por ejemplo /aline -l @mi_ventana lo ke sea... :). 
 
/aline [c] <@nombre> <texto> 
 
Añade la línea <texto> a la ventana <@nombre> 
Ejemplo: /aline 4 @mi_ventana Hola mundo!! 
 
/cline [c] <@nombre> <N> 
  
Cambia el color de la línea número <N> al color número [c] 
Ejemplo: /cline 4 #ayuda_irc 3 
 
/dline [c] <@nombre> <N> 
 
Borra la línea (o el rango de lineas) numero <N> 
Ejemplo: /dline @nombre 1-10 
 
/iline [c] <@nombre> <N> <texto> 
 
Inserta una línea (<texto>) en la posicion <N> 
Ejemplo: /iline @mi_ventana 2 Insertando una linea... 
 
/rline [c] <@nombre> <N> <texto> 
 
Sustituye la línea <N> por <texto> 
Ejemplo: /rline @mi_ventana 1 Hasta luegoorr!! 
 
/sline [c] <@nombre> <N> 
 
Selecciona la línea numero <N> 
Ejemplo: /sline @mi_ventana 3 
 
/renwin <@nombre> <@nuevo_nombre> [topic] 
 
Cambia de nombre la ventana <@nombre> y (opcionalmente) cambia su topic o descripción 
Ejemplo: /renwin @mi_ventana @tu_ventana Nuevo_topic 
 
Ahora que el lector ya conoce todos los comandos que se usan para la creacion/modificacion de ventanas, y antes de entrar en los eventos remotos asociados a las mismas, vamos a hacer un par de ejemplos de crear ventanas, para que se vaya familiarizando con estos comandos y compruebe por usted mismo que no es tan complicado como quizás parece en un principio: 
 
Ejemplo 1: Crear una ventana para dialogar con el usuario 

Vamos a crear una ventana que mostrará una informacion al usuario y esperara que éste le responda escribiendo en la editbox de la ventana: 
Para ello escribimos en la sección "Aliases" del Editor del mIRC: 
 
/vent { 
  window -ae @dialogo 50 50 200 100 @dialogo 
  aline 12 @dialogo Hola, ¿Cómo te llamas? 
} 
 
Si prueba ese ejemplo (escribiendo el alias "/vent" ), verá que se crea una ventana de nombre @dialogo con un editbox abajo y nos aparece en ella el texto "Hola, ¿Cómo te llamas?". En este momento nos tendremos que detener aqui, más adelante veremos como puede hacer que al teclear algo en la editbox y pulsar 'Enter' , el script le responda adecuadamente. 
 
Ejemplo 2: Ver un listado de archivos y mostrar informacion de los mismos 
 
En este ejemplo crearemos una ventana con una listbox, en la que apareceran los archivos mp3 de nuestro directorio de mp3 (se supondrá que es c:\mp3), y al hacer doble click sobre uno de los archivos se nos mostrara informacion de ese archivo en la ventana principal. Escribiremos el siguiente código en la seccion de "Aliases" en el Editor del mIRC: 
 
/mp3 { 

window -l20 @mp3 50 50 600 200 @mp3 
%i = 0 
: comienzo 
inc %i 1 
if (%i > $findfile(c:\mp3,*.mp3,0)) { goto fin } 
else { 

aline -l @mp3 $nopath($findfile(c:\mp3,*.mp3,%i)) 
goto comienzo

} 
: fin  
unset %i

} 
 
En el alias /mp3 hemos hecho lo siguiente: Primero creamos la ventana @mp3 con una listbox (de tamaño 20 caracteres) y en la posicion x (50), y (50) y con un tamaño de 400 pixels de largo por 200 de alto. 
Despues creamos una variable temporal %i y le damos el valor '0'. Iniciamos un bucle cuya explicacion no forma parte de esta sección así que se explicará solamente en lineas generales lo que hace: incrementa %i en 1 y comprueba si el valor de %i es mayor que la cantidad de mp3s en el directorio c:\mp3, en caso de que %i sea mayor (querrá decir que ya no hay mas mp3) vamos al indicador ": fin" que dejara libre la variable temporal %i , y en caso de que el valor de %i sea menos que la cantidad de archivos mp3 en c:\mp3 (quiere decir que aun hay al menos un mp3 más), se añade una línea a la listbox de la ventana con el nombre del archivo (sin la ruta, de ahi el $nopath()
El resto de funcionabilidad de la ventana, el mostrar informacion del archivo al hacer doble click sobre una de las lineas, la veremos más adelante cuando hayamos visto los eventos remotos. 
 
 
Identificadores de Ventanas Personalizadas 
 
Estos identificadores pueden ser usados en cualquier Alias, Popup o Evento Remoto para recoger informacion sobre una determinada ventana: 
 
$line(@nombre,N,[T]) 
 
Devuelve el contenido de la linea N de una ventana. Si N es '0' devuelve el numero total de lineas en la ventana. El parámetro [T] es opcional, y se usa solo cuando nos referimos a una listbox en un lado de la ventana, para ello le daremos el valor '0' a T . Si nos referimos a una ventana sin listbox el parámetro [T] se omite, y si nos referimos a una ventana con listbox, pero queremos información de la ventana principal y no de la listbox, pondremos en lugar de [T] un 1. 
 
Ejemplo: //echo -s $line(@mp3,2,0) 
Devolverá el contenido de la segunda linea en la listbox de la ventana @mp3 
 
$sline(@nombre,N) 
 
Devuelve el contenido de la linea seleccionada numero N (solo funciona en una listbox). Si le damos el valor '0' a N, devuelve el numero total de lineas seleccionadas en la listbox. 
 
$sline(@nombre,N).ln 
 
Devuelve el numero de la línea seleccionada numero N (N normalmente se pone '1') 

$window(@nombre).<propiedad> 
 
Devuelve las propiedades de una ventana. Los valores posibles de <propiedad> son: 
 
$window(@nombre).x : Devuelve la coordinada x de la posicion de la ventana. 
$window(@nombre).y : Devuelve la coordinada y de la posicion de la ventana. 
$window(@nombre).w : Devuelve la longitud en pixels de la ventana. 
$window(@nombre).h : Devuelve la altura en pixels de la ventana. 
$window(@nombre).dx : Devuelve la coordinada x de la ventana con respecto al escritorio (no a la ventana del mIRC). 
$window(@nombre).dy : Devuelve la coordinada y de la ventana con respecto al escritorio (no a la ventana del mIRC). 
$window(@nombre).state : Devuelve el estado de la ventana (minimized, maximized, normal o hidden). 
$window(@nombre).title : Devuelve el texto en la barra de titulo de la ventana. 
$window(@nombre).font : Devuelve el nombre del tipo de letra actual en la ventana. 
$window(@nombre).fontsize : Devuelve el tamaño del tipo de letra actual en la ventana. 
$window(@nombre).fontbold : Devuelve $true si el tipo de letra esta en negrita, o $false si no lo esta. 
 
 
Definición de popup's de ventanas en la sercción de Remotes 
 
Para definir el popup de una ventana personalizada sin necesidad de crearlos en un fichero aparte podemos editarlos dentro de la sección Remotes del editor del mIRC, la forma de hacerlo es la habitual de los popup's. Tan solo es necesario encerrarlos entre corchetes encabezar todo con la clausula MENU <@nombre_ventana>. 
 
MENU @nombre { 

Popup1 
.Sub-popup: /accion1 
.Sub-popup2: /accion2 
- 
Popup2: /accion3 
.....

} 

Eso sí, previamente tendremos que haber especificado en la definición de la ventana que queremos definir en popup en los remotes escribiendo el nombre de la ventana como el parámetro [popup]: 
 
Ejemplo: /window –a @nombre 10 10 100 100 @nombre 
 
También podemos definir el popup de varias ventanas a la vez poniendo: 
 
MENU @nombre1,@nombre2,@nombre3 { 

... popup ...

} 

Donde he puesto "...popup..." se ha de poner una secuencia de lineas con el formato normal de un Popup. Para que se entienda mejor el uso de esta técnica aquí va un ejemplo que debe ser copiado en la sección “Remotes” del editor del mIRC: 

alias miventana { 

window -a @mi_ventana 10 10 200 200 @mi_ventana

} 
  
  
menu @mi_ventana { 

Decir Hola 
.En rojo : /aline 4 @mi_ventana Hola! 
.En negro: /aline 1 @mi_ventana Hola! 
Decir Adios 
.En Azul: /aline 12 @mi_ventana Adios! 
.En Verde: /aline 3 @mi_ventana Adios! 
- 
Cerrar Ventana: /window -c @mi_ventana

} 
 
El resultado de crear este codigo es que al teclear /miventana nos aparecerá una ventana personalizada en blanco y que, como le hemos especificado, usará como popup el menú @mi_ventana . Asi pues en el remote hemos declarado el "menu @mi_ventana" y le hemos escrito unos popups de la manera habitual. Si pulsamos el boton derecho sobre la ventana que hemos creado, veremos como aparece ese popup que hemos creado. 
 
 
Eventos más comunes en el uso de ventanas personalizadas 
 
on 1:INPUT:@nombre:{ 

comandos

} 
 
Este evento solo sirve para las ventanas que creemos que dispongan de una editbox, ya que el evento INPUT "salta" cuando introducimos texto en una editbox y pulsamos 'Enter'. 
 
También podemos usar el evento ON CLOSE: 

on 1:CLOSE:@nombre:{ 

comandos

} 

Los comandos que especifiquemos se ejecutaran cuando el usuario cierre la ventana, ya sea mediante un popup, o mediante el boton de cerrar (la 'X') de toda ventana de Windows. 
 
Y análogamente tambien disponemos del evento: 
 
on 1:OPEN:@nombre:{ 

comandos

} 
 
Estos comandos se ejecutarán cuando se abra la ventana indicada. 
 
Con lo que hemos visto hasta ahora, y un poco de práctica, el lector debe ser ya capaz de crear sofisticadas ventanas personalizadas, modificar sus atributos, añadirles menús emergentes, y ejecutar comandos cuando suceda algun evento en las mismas (como abrir o cerrar la ventana). A continuacion vamos a repetir, y esta vez a acabar, los dos ejemplos que se expusieron anteriormente, ya que ya se está en condiciones de poder darles toda su funcionabilidad con lo que sabemos hasta ahora: 

Ejemplo 1: Crear una ventana para dialogar con el usuario 

Primero copiamos el codigo que ya habiamos hecho antes en los Aliases: 

/ventana { 

window -ae @dialogo 50 50 200 100 @dialogo 
aline 12 @dialogo Hola, ¿Cómo te llamas?

} 

Ahora nos vamos a la seccion "Remotes" y copiamos el siguiente codigo: 

menu @dialogo { 

Salir: window -c @dialogo

} 

on 1:INPUT:@dialogo:{ 

%vari01 = me llamo 
%vari02 = como estás? 
if ( %vari01 isin $1- ) { /aline 12 @dialogo Hola $3 !! } 
elseif ( %vari02 isin $1- ) { /aline 4 @dialogo Estoy bien gracias, y tu? } 
elseif ( estoy isin $1- ) { /aline 3 @dialogo Pues me alegro... } 
elseif ( idiota isin $1- ) { /aline 10 @dialogo Idiota tu !!!! } 
elseif ( adios isin $1- ) { /aline 5 @dialogo Nos vemos! | window -c @dialogo } 
else { /aline 6 @dialogo Lo ke tu digas... } 
halt

} 
 
Primero hemos creado la ventana @dialogo con el comando /ventana, a esta ventana le hemos indicado que ha de tener una editbox (-e) y por lo tanto nosotros podremos escribir en ella. Dependiendo de lo que escribamos, el script nos responderá de una forma u otra gracias al evento ON INPUT que controla el texto que escribamos en la ventana especificada. Creo que el código esta bastante claro asi que al lector solo le queda copiarlo en el editor del mIRC, probarlo y modificarlo a su gusto. 
 
Ejemplo 2: Ver un listado de archivos y mostrar informacion de los mismos 
 
Primero copiamos el código que ya teniamos en los "Aliases" : 
 
/mp3 { 

window -l20 @mp3 50 50 600 200 @mp3 
%i = 0 
: comienzo 
inc %i 1 
if (%i > $findfile(c:\mp3,*.mp3,0)) { goto fin } 
else { 

aline -l @mp3 $nopath($findfile(c:\mp3,*.mp3,%i)) 
goto comienzo

} 
: fin  
unset %i

} 

Ahora vamos a los "Remotes" y copiamos: 

MENU @mp3 { 

dclick: { 

aline 4 @mp3 $findfile(c:\mp3,*.mp3,$sline(@mp3,1).ln) 
aline 4 @mp3 $lof($findfile(c:\mp3,*.mp3,$sline(@mp3,1).ln)) bytes 
aline 4 @mp3 $duration($calc($lof($findfile(c:\mp3,*.mp3,$sline(@mp3,1).ln)) / 16000))

} 
Recargar mp3: window -c @mp3 | /mp3 
- 
Salir: window -c @mp3

} 

Supongo que la principal pregunta al leer este codigo es: ¿Que es "dclick"?. Eso se explicará más adelante, cuando veamos las ventanas de imagen (picture windows), de momento ha de saber que el contenido de "dclick" se ejecuta cuando hacemos doble click sobre una ventana de imagen o (como en este caso) sobre una listbox. Es decir que cuando hagamos doble click sobre alguno de los objetos de la listbox (que seran nombres de los mp3 que tengamos en el directorio c:\mp3) nos aparecerá en la ventana principal la ruta completa del archivo en la primera línea, el tamaño de ese archivo (usando el identificador $lof ) en la segunda línea y la duración aproximada del mp3, que se consigue dividiendo el tamaño del mismo por 16.000, en la tercera. Despues hemos añadido dos opciones al menú popup de la ventana, la primera “Recargar Mp3” consiste en cerrar la ventana, y volverla a abrir (usando el comando que habiamos creado anteriormente de nombre /mp3 ) 

Bien, vistos estos dos ejemplos, usted ya sabe lo suficiente como para hacer ventanas personalizadas muy complejas y útiles, aunque si este es su primer contacto con las ventanas personalizadas quizas sea una buena idea que antes de ponerse a hacerlas, vea mas ejemplos de como se hacen en algún script.