Académique Documents
Professionnel Documents
Culture Documents
Esta guía se preparó como parte del apoyo didáctico que se ofrece a los estudiantes de
ingeniería de sistemas de la Fundación Universitaria Konrad Lorenz, dentro del curso de
Sistemas Basados en el Conocimiento I.
Los procedimientos básicos para la construcción de sistemas basados en el
conocimiento se hará alrededor de unos ejemplos que ilustran claramente cómo hacer
esta construcción para los casos en que el conocimiento esté representado o estructurado
como una tabla o como un árbol de decisión:
animal('LEON'):-clase(mamifero),alimentacion(carnivoro).
Quiere decir: Un animal es un tigre si es mamífero y carnívoro.
animal('MUSARAÑA'):-clase(mamifero),alimentacion(insectivoro).
animal('CABALLO'):-clase(mamifero),alimentacion(herbivoro).
animal('COCODRILO'):-clase(reptil),alimentacion(carnivoro).
animal('CAMALEON'):-clase(reptil),alimentacion(insectivoro).
animal('TORTUGA DE TIERRA'):-clase(reptil),alimentacion(herbivoro).
animal('AGUILA'):-clase(ave),alimentacion(carnivoro).
animal('GOLONDRINA'):-clase(ave),alimentacion(insectivoro).
animal('PERDIZ'):-clase(ave),alimentacion(herbivoro).
Paso 2: Construya las preguntas en donde solicitará al usuario las características del
animal que desea clasificar:
pregunta1:-
write(' El grupo al que pertenece el animal es:'),nl,nl,
write('1. Mamifero.'),nl,
write('2. Reptil.'),nl,
write('3. Ave.'),nl,
read(N),
clasificar1(N).
Construya predicados para proceder de acuerdo con la respuesta a la pregunta 1:
clasificar1(1):-assert(clase(mamifero)),!.
clasificar1(2):-assert(clase(reptil)),!.
clasificar1(3):-assert(clase(ave)),!.
clasificar1(_):-pregunta1,!.
pregunta2:-
clasificar:-
animal(M),
write('El animal puede ser : '),nl,
write(' '),write(M),nl,nl.
Ahora, que hacer si usted quiere proveer al usuario la posibilidad de hacer otra consulta:
Paso 1: Limpie todas las acciones del predicado assert, para esto puede definir un
predicado de nombre purgar
limpiar:-retract(clase(_)),
retract(alimentacion(_)),!.
pregunta:-nl,nl,
write('Desea continuar s/n : '),
read(X),
continue(X).
animal('LEON'):-clase(mamifero),alimentacion(carnivoro).
animal('MUSARAÑA'):-clase(mamifero),alimentacion(insectivoro).
animal('CABALLO'):-clase(mamifero),alimentacion(herbivoro).
animal('COCODRILO'):-clase(reptil),alimentacion(carnivoro).
animal('CAMALEON'):-clase(reptil),alimentacion(insectivoro).
animal('TORTUGA DE TIERRA'):-clase(reptil),alimentacion(herbivoro).
animal('AGUILA'):-clase(ave),alimentacion(carnivoro).
animal('GOLONDRINA'):-clase(ave),alimentacion(insectivoro).
animal('PERDIZ'):-clase(ave),alimentacion(herbivoro).
empezar:-
pregunta1,
pregunta2,
clasificar,!.
pregunta1:-
clasificar1(1):-assert(clase(mamifero)),!.
clasificar1(2):-assert(clase(reptil)),!.
clasificar1(3):-assert(clase(ave)),!.
clasificar1(_):-pregunta1,!.
pregunta2:-
clasificar2(1):-assert(alimentacion(carnivoro)),!.
clasificar2(2):-assert(alimentacion(insectivoro)),!.
clasificar2(3):-assert(alimentacion(herbivoro)),!.
clasificar2(_):-pregunta2,!.
continue('s'):-empezar,!.
continue('S'):-empezar,!.
continue('n'):-continue('N').
continue('N'):-write(' NOS AGRADÓ AYUDARTE '),nl,
write('............HASTA PRONTO............').
clasificar:-
animal(M),
write('El animal puede ser : '),nl,
write(' '),write(M),nl,nl,
limpiar,
pregunta.
pregunta:-nl,nl,
write('Desea continuar s/n : '),
read(X),
continue(X).
empezar:-
pregunta1,
pregunta2,
clasificar,!.
pregunta1:-
clasificar1(1):-assert(clase(mamifero)),!.
clasificar1(2):-assert(clase(reptil)),!.
clasificar1(3):-assert(clase(ave)),!.
clasificar1(_):-pregunta1,!.
pregunta2:-
clasificar2(1):-assert(alimentacion(carnivoro)),!.
clasificar2(2):-assert(alimentacion(insectivoro)),!.
clasificar2(3):-assert(alimentacion(herbivoro)),!.
clasificar2(_):-pregunta2,!.
limpiar:-retract(clase(_)),
retract(alimentacion(_)),!.
clasificar:-
animal(M),
write('El animal puede ser : '),nl,
write(' '),write(M),nl,nl,
limpiar,
pregunta.
pregunta:-nl,nl,
write('Desea continuar s/n : '),
read(X),
continue(X).
continue('s'):- continue('S').
continue('S'):-empezar,!.
continue('n'):-continue('N').
continue('N'):-write(' NOS AGRADÓ AYUDARTE'),nl,
write('............HASTA PRONTO............').
Funciones desconocida:
Añadiendo cláusulas
Eliminando cláusulas
animal('MUSARAÑA'):-clase(mamifero),
alimentacion(insectivoro),!.
animal('CABALLO'):-clase(mamifero),
alimentacion(herbivoro),!.
animal('COCODRILO'):-clase(reptil),
alimentacion(carnivoro),!.
animal('CAMALEÓN'):-clase(reptil),
alimentacion(insectivoro),!.
animal('AGUILA'):-clase(ave),
alimentacion(carnivoro),!.
animal('GOLONDRINA'):-clase(ave),
alimentacion(insectivoro),!.
animal('PERDIZ'):-clase(ave),
alimentacion(herbivoro),!.
inicio:-retractall(clase(_)),
retractall(alimentacion(_)),
consultar:- animal(M),
atom_string( M,Animal),
despliega_repuesta(Animal),
continuar.
despliega_repuesta(Animal) :-
_S1 = [dlg_ownedbydesktop,ws_sysmenu,ws_caption],
_S2 = [ws_child,ws_visible,ss_center],
_S3 = [ws_child,ws_visible,ws_tabstop,bs_pushbutton],
wdcreate( respuesta, `user_dialog`, 235, 43, 402, 160, _S1 ),
*****************************************************************
Si se hace clic en “sí”, el programa volverá a presentar las dos preguntas, si le da clic
en “no”, el programa se despedirá y saldrá al darle ok.
1
PRESBIOPIA
que significa dificultad para enfocar objetos que están cerca y es común en los ancianos.Alteración de la visión asociada a la vejez.
En este trastorno existe una mayor rigidez del cristalino que produce dificultad para ver los objetos cercanos.
2
http://www.c2i.ntu.edu.sg/Courses/AI/CIspace/Version4/dTree/index-2.html
T:;EDAD_DEL_PACIENTE;PRESCRIPCION;ASTIGMATISMO;TASA_DE_PRODUCCION_LAGRIMAS;LENTE_RECOMEN
DADO
A:;JOVEN;MIOPIA;SI;REDUCIDA;NO_LENTE_COTACTO
A:;JOVEN;MIOPIA;SI;NORMAL;LENTE_CONTACTO_SUAVE
A:;JOVEN;MIOPIA;NO;REDUCIDA;NO_LENTE_COTACTO
A:;JOVEN;MIOPIA;NO;NORMAL;LENTE_CONTACTO_DURO
A:;JOVEN;HIPERMETROPIA;SI;REDUCIDA;NO_LENTE_COTACTO
A:;JOVEN;HIPERMETROPIA;SI;NORMAL;LENTE_CONTACTO_SUAVE
A:;JOVEN;HIPERMETROPIA;NO;REDUCIDA;NO_LENTE_COTACTO
A:;JOVEN;HIPERMETROPIA;NO;NORMAL;LENTE_CONTACTO_DURO
A:;PRE_PRESBYOPIC;MIOPIA;SI;REDUCIDA;NO_LENTE_COTACTO
A:;PRE_PRESBYOPIC;MIOPIA;SI;NORMAL;LENTE_CONTACTO_SUAVE
A:;PRE_PRESBYOPIC;MIOPIA;NO;REDUCIDA;NO_LENTE_COTACTO
A:;PRE_PRESBYOPIC;MIOPIA;NO;NORMAL;LENTE_CONTACTO_DURO
A:;PRE_PRESBYOPIC;HIPERMETROPIA;SI;REDUCIDA;NO_LENTE_COTACTO
A:;PRE_PRESBYOPIC;HIPERMETROPIA;SI;NORMAL;LENTE_CONTACTO_SUAVE
A:;PRE_PRESBYOPIC;HIPERMETROPIA;NO;REDUCIDA;NO_LENTE_COTACTO
A:;PRE_PRESBYOPIC;HIPERMETROPIA;NO;NORMAL;NO_LENTE_COTACTO
A:;PRESBYOPIC;MIOPIA;SI;REDUCIDA;NO_LENTE_COTACTO
A:;PRESBYOPIC;MIOPIA;SI;NORMAL;NO_LENTE_COTACTO
A:;PRESBYOPIC;MIOPIA;NO;REDUCIDA;NO_LENTE_COTACTO
A:;PRESBYOPIC;MIOPIA;NO;NORMAL;LENTE_CONTACTO_DURO
A:;PRESBYOPIC;HIPERMETROPIA;SI;REDUCIDA;NO_LENTE_COTACTO
A:;PRESBYOPIC;HIPERMETROPIA;SI;NORMAL;LENTE_CONTACTO_SUAVE
A:;PRESBYOPIC;HIPERMETROPIA;NO;REDUCIDA;NO_LENTE_COTACTO
A:;PRESBYOPIC;HIPERMETROPIA;NO;NORMAL;NO_LENTE_COTACTO
Donde T indica los nombres de las variables, A indica los patrones de entrenamiento y
B(aunque no aparece en este ejemplo) indica los patrones de validación.
'
Cada hoja del árbol(las que se presentan con recuadro verde) representa una regla de
decisión sintetizada a partir de los datos. Como se puede observar que los 24 patrones
originales, se pueden expresar mediante 9 reglas, lo cual revela una compresión de
24:9= 2.7.
Una vez obtenido el árbol, se definen funciones para cada nodo del árbol. Para este
ejemplo se decidió la convención ilustrada en la siguiente gráfica, en la cual se observa
que el proceso 0, indaga por la tasa de producción de lágrimas; el proceso 1b, por el
astigmatismo; el proceso 2ba, por la edad del paciente; el proceso 2bb, por la
prescripción; el proceso 3bac, por prescripción, el cual es diferente al proceso 2bb, a
pesar de que ambos hacen la misma pregunta, las decisiones que se toman con la
respuesta son diferentes; el proceso 3bbb, por la edad del paciente, el cual es diferente
que el proceso 2ba, por las mismas razones esgrimidas antes.
empezar:-bienvenida,proceso0.
proceso0:- pregunta(1, Respuesta ),
(Respuesta=`REDUCIDA`-> proceso_final(3);
Respuesta=`NORMAL` -> proceso('1b');inicio).
proceso('1b'):-pregunta(2, Respuesta ),
(Respuesta= `SI` ->proceso('2ba');
Respuesta= `NO` -> proceso('2bb'); proceso('1b')).
proceso('2ba'):-pregunta(4, Respuesta),
(Respuesta=`JOVEN`-> proceso_final(1);
Respuesta=`PRE-PRESBIOPICO`-> proceso_final(1);
Respuesta=`PRESBIOPICO`->proceso('3bac');proceso('2ba')).
proceso('2bb'):-pregunta(3, Respuesta ),
(Respuesta=`MIOPIA`->proceso_final(2);
Respuesta=`HIPERMETROPIA`->proceso('3bbb');proceso('2bb')).
proceso('3bac'):-pregunta(3, Respuesta ),
(Respuesta=`MIOPIA`->proceso_final(3);
Respuesta=`HIPERMETROPIA`->proceso_final(1);proceso('3bac')).
proceso('3bbb'):- pregunta(4, Respuesta),
(Respuesta=`JOVEN`-> proceso_final(2);
Respuesta=`PRE-PRESBIOPICO`-> proceso_final(3);
Respuesta=`PRESBIOPICO`-> proceso_final(3);proceso('3bbb')).
despliega_repuesta(Lente) :-
_S1 = [dlg_ownedbydesktop,ws_sysmenu,ws_caption],
_S2 = [ws_child,ws_visible,ss_center],
_S3 = [ws_child,ws_visible,ws_tabstop,bs_pushbutton],
wdcreate( respuesta, `user_dialog`, 235, 43, 402, 180, _S1 ),
wccreate( (respuesta,10000), static, `LA RECOMENDACIÓN ES`, 20, 10, 370, 20, _S2 ),
wccreate( (respuesta,10001), static, Lente, 120, 40, 170, 50, _S2 ),
wccreate( (respuesta,1000), button, `ACEPTAR`, 130, 100, 150, 30, _S3 ),
wfcreate( foo1, arial, 18, 2 ),
wfont( (respuesta,10000), foo1 ),
wfont( (respuesta,10001), foo1 ),
A elegir la opción NO
3
Copyright (c) 1989-2001 Logic Programming Associates Ltda
Ejemplo:
La siguiente llamada establece un archivo de memoria denominado
“buffer”, con un tamaño de 1024 bytes, con el fin de usarlo para con
sndmsg/5:
?- fcreate( buffer, [], -1, 1024, 0 ). <enter>
yes
Una vez se crea este buffer, se puede usar como un parámetro en la
llamada a sndmsg/5. La siguiente llamada envía un mensaje a la
ventana principal de WIN-PROLOG(“0”), la cual copia el título de la
ventana en el buffer, retornando el número de caracteres en el
nombre:
?- sndmsg( 0, wm_gettext, 1024, buffer, R ). <enter>
R = 10
Se puede hacer una llamada a wintxt/4 para recuperar el texto
contenido en buffer, antes de cerrarlo con fclose/1:
?- wintxt( buffer, 0, 0, T ), fclose( buffer ). <enter>
T = `W `
Notas:
Muchas operaciones en el ambiente Windows (Win32 API) son
manejados mediante el paso de mensajes a windows. Los cuales
pueden ser enviados por el mismo sistema operativo o por
aplicaciones. En tiempo de corrida, los mensajes y sus parámetros
son simplemente números, aunque la mayoría de compiladores de
Windows los proveen con nombres significativos y tipos de datos de
parámetros en tiempo de compilación. Debido a que Prolog es un
lenguaje dinámico, podría ser restrictivo limitar la denominación de
los mensajes al tiempo de compilación.
• call_dialog/2
Llama a un diálogo modal y obtiene o verifica el resultado
call_dialog( Ventana, Resultado )
+Ventana <window_handle>
?Resultado <term>
Comentarios
Esto muestra la Ventana de diálogo dada, deshabilitando toas las
demás ventanas de nivel superior de WIN-PROLOG y espera a que el
usuario complete el diálogo: Resultado es unificado con cualquier
valor que haya sido retornado por el manejador de la ventana del
diálogo.
Ejemplo El siguiente predicado crea un diálogo muy simple con dos
botones,etiquetados con “Hola” y “Mundo”, respectivamente:
crear_dialogo :-
Dstyle = [ws_popup,ws_caption],
Bstyle = [ws_child,ws_visible,bs_pushbutton],
wdcreate( dialogo, `diálogo`, 100, 100, 170, 75, Dstyle ),
wccreate( (dialogo,1), button, `Hola`, 10, 10, 70, 30, Bstyle ),
wccreate( (dialogo,2), button, `Mundo`, 90, 10, 70, 30, Bstyle ).
X = finished_at(16,25,6)
Que indica la hora en que fue presionado el botón “Hola”. Si presiona
el botón “Mundo”, solo retornará R=mundo, ya que el nuevo
manejador(manejador_boton), no se definió para la ventana de ese
botón((dialogo,2)).
• window_handler/2
Obtiene o establece el manejador para una ventana dada
window_handler( Ventana, Manejador )
+Ventana<atom> o <integer> en el dominio {0,1}
?Manejador <atom> o <variable>
Comentarios
Obtiene o establece el nombre de un predicado de aridad 4 que sera
usado como el Manejador para la Ventana de nivel superior(de
diálogo, de texto o de usuario). Si Manejador es una variable no
acotada, retorna el nombre del manejador existente, de otra forma,
establece que el manajador Manejador asociándolo a la Ventana.
Ejemplo
El siguiente programa usa wdcreate/7 y wccreate/8 para crear un
pequeño diálogo que contiene un pequeño botón de presionar por
defecto:
dialogo_ejemplo:-
Dstyle = [ws_visible,ws_popup,ws_caption],
Bstyle = [ws_visible,ws_child,bs_defpushbutton],
wdcreate( dialogo, `diálogo`, 10, 10, 100, 60, Dstyle ),
wccreate( (dialogo,1), button, `clic`, 10, 10, 80, 20, Bstyle ).
Notas
El window_handler/2 simplemente mantiene una base de datos local
de los nombre de las ventana de nivel superior y los nombres de sus
respectivos predicados “manejadores de ventana”: cuando un
mensaje llega a una ventana dada, se verifica esta base de datos
para buscar una coincidencia. Si se halla la ventana de nivel superior,
entonces se llama el correspondiente manejador con cuatro
argumentos:
<handler>( Ventana, Mensaje, Datos, Resultado )
Los primeros tres argumentos son acotados como sigue:
Ventana contiene el manejador de la ventana que recibe el mensaje
(<window_handle>),
Mensaje contiene el nombre del mensaje(<atom> if known, otherwise
<integer>), y Data contiene información suplementaria (dependiendo
del mensaje).
El último argumento, Resultado, es una variable no acotada. Si el
manejador de ventana une esto a algún valor, causará la terminación
de la ventana de nivel superior(generalmente un diálogo): si la
ventana fue invocada por call_dialog/2, este valor es pasado hacia
atrás como el segundo argumento del último predicado. Considere la
siguiente variante del manejador de ventana mostrado
anteriormente:
Comentarios
Esto crea una “ventana de diálogo” con el manejador Ventana, el
título Texto, en la posición (Izquierda, Superior), con el tamaño
(Ancho, Profundidad) y el estilo tipo lista Estilo.
Ejemplo
El siguiente programa usa wdcreate/7 wccreate/8 para crear un
pequeño diálogo que contiene un solo botón "pulsación por defecto”:
ejemplo_wdcreate :-
Dstyle = [ws_visible,ws_popup,ws_caption],
Bstyle = [ws_visible,ws_child,bs_defpushbutton],
wdcreate( prueba, `foo`, 10, 10, 100, 60, Dstyle ),
wccreate( (prueba,1), button, `fukl`, 10, 10, 80, 20, Bstyle ).
Una vez compilado, la siguiente llamada desplegará el diálogo cerca
de la esquina superior izquierda de la pantalla(al hacer clic sobre el
botón, la ventana se ocultará, pero no se cerrará):
?- ejemplo_wdcreate. <enter>
yes
• wclose/1
cierra una ventana
wclose( Ventana )
+Ventana <window_handle>
Commentarios:
Esto cierra la ventana denominada Ventana, liberando sus recursos.
Ejemplo:
La siguiente llamada crea una pequeña ventana de usuario(MDI
child):
?- wcreate( ventana, user, ``, 100, 100, 300, 200, 0 ). <enter>
Yes
• wcreate/8
crea una ventana
wcreate( Ventana, Clase, Texto, Izquierda, Superior, Ancho,
Profundidad, Estilo )
+Ventana <window_handle>
+Clase <atom>
+Texto <string>
+Izquierda <integer>
+Superior <integer>
+Ancho <integer>
+Profundidad <integer>
+Estilo <integer>
Comentarios:
Esto crea una ventana con un Manejador, Clase y Texto dados, en la
posición (Izquierda, Superior), con el tamaño (Ancho, Profundidad) y
el Estilo entero. Las siguientes clases de ventanas estándar que se
pueden crear por medio de este predicado:
Clase Significado de la clase
Button control de botón
• wccreate/8
Crea una ventana de control
wccreate( Ventana, Clase, Texto, Izquierda, Superior, Ancho,
Profundidad, Estilo )
+Window <window_handle>
+Clase <atom>
+Texto <string>
+Izquierda <integer>
+Superior <integer>
+Ancho<integer>
+Profundidad <integer>
+Estilo <list>
Comentarios
Esto crea una ventana con un Manejador, Clase y Texto dados, en la
posición(Izquierda, Superior), con el tamaño (Ancho, Profundidad) y la
lista de Estilo. La lista de tipos de clases de estilo se describen en
wcreate/8.
Ejemplo
El siguiente programa usa wdcreate/7 y wccreate/8 para crear un
pequeño diálogo que contiene un pequeño diálogo con un botón.
ejemplo_dialogo :-
Dstyle = [ws_visible,ws_popup,ws_caption],
Bstyle = [ws_visible,ws_child,bs_defpushbutton],
wdcreate( ejemplo, `hola esta es una prueba`, 10, 10, 200,160,
Dstyle ),
wccreate( (ejemplo,1), button, `es es un ejemplo`, 30, 10, 120, 20,
Bstyle ).
• wfcreate/4
crea una fuente
wfcreate( Fuente, Apariencia, Tamaño, Estilo )
+Font <atom>
+Face <atom>
+Size <integer>
+Style <integer> in the range [0..3]
Comentarios
Esto crea la fuente llamada “Fuente”, usando la Apariencia dada, los
puntos Tamaño y estilo Estilo; cualquier fuente que existe con el
mismo nombre se cierra antes de que la nueva fuente sea creada. Los
Estilos son listados en la siguiente tabla:
Estilo Significado
0 normal
1 italic
2 bold
3 bolditalic
Ejemplo
La siguiente llamada creará una fuente llamada “fuente”,
especificando su apariencia como “Arial”, tamaño como 16 puntos y
estilo como normal ("0"), y asigna esta fuente a la ventana de
consola("(1,1)"):
• wfont/2
obtiene o establece la fuente usada por un control de ventana
wfont( Ventana, Fuente )
+Ventana <window_handle>
?Fuente <variable>, <atom>, <integer> o <tuple>
Comentarios
Esto obtiene o establece la Fuente usada actualmente para desplegar
el texto de una Ventana de control determinada: Si Fuente es una
variable no acotada, retorna la fuente de ventana existente; de otra
forma, se usa para establecer la nueva fuente de ventana.
Ejemplo
Ver wfcreate/4
Notas
Este predicado puede ser usado únicamente para establecer la fuente
a ser usada por la ventana de control: no tiene efecto sobre la barra
de títulos de la ventana de nivel superior. Igualmente para manipular
fuentes preestablecidas, se puede usar wfont/2 para obtener o fijar un
stock de seis fuentes numéricas especiales, predefinidas, así como
también cualquier handle de fuente entera, donde handle está
contenida en una tupla de la forma “font(integer)”. El stock de
fuentes se lista a continuación:
Número Significado
0 OEM fixed font
1 system font
2 system fixed font
3 ANSI var font
4 ANSI fixed font
5 device default font
ejemplo :-
Dstyle = [ws_visible,ws_popup,ws_caption],
Bstyle = [ws_visible,ws_child,bs_defpushbutton],
wdcreate( prueba, `prueba`, 10, 10, 100, 60, Dstyle ),
wccreate( (prueba,1), button, `bar`, 10, 10, 80, 20, Bstyle ).
Estilos de Edit
Estos son los estilos que pueden ser aplicados a los controles edit
Estilo Valor
es_left 16'00000000
es_center 16'00000001
es_right 16'00000002
es_multiline 16'00000004
es_uppercase 16'00000008
es_lowercase 16'00000010
es_password 16'00000020
es_autovscroll 16'00000040
es_autohscroll 16'00000080
es_nohidesel 16'00000100
es_oemconvert 16'00000400
es_readonly 16'00000800
es_wantreturn 16'00001000
Estilos de Combobox
Estos son los estilos que pueden aplicarse a los controles combobox:
Estilo Valor
cbs_simple 16'00000001
cbs_dropdown 16'00000002
cbs_dropdownlist 16'00000003
cbs_ownerdrawfixed 16'00000010
cbs_ownerdrawvariable 16'00000020
cbs_autohscroll 16'00000040
cbs_oemconvert 16'00000080
cbs_sort 16'00000100
cbs_hasstrings 16'00000200
cbs_nointegralheight 16'00000400
cbs_disablenoscroll 16'00000800
Estilos Estaticos
Estos son los estilos que pueden aplicarse a los controles estáticos
Estilo Valor
ss_left 16'00000000
ss_center 16'00000001
ss_right 16'00000002
ss_icon 16'00000003
ss_blackrect 16'00000004
ss_grayrect 16'00000005
ss_whiterect 16'00000006
ss_blackframe 16'00000007
ss_grayframe 16'00000008
ss_whiteframe 16'00000009
ss_simple 16'0000000B
Estilos de Scrollbar
Estos son los estilos que pueden aplicarse a los controles scrollbar:
Estilo Valor
sbs_horz 16'00000000
sbs_vert 16'00000001
sbs_topalign 16'00000002
sbs_leftalign 16'00000002
sbs_bottomalign 16'00000004
sbs_rightalign 16'00000004
sbs_sizebox 16'00000008