En esta lección:
La clase static -----
La clase scrollbar -----
Otras secciones:
Conceptos básicos -----
Programando en C -----
Programando en C++ -----
Programando Windows 9x. -----
Teoría electrónica -----
Circuitos electrónicos -----
Actividades adicionales -----
Hipervínculos -----
Contácteme:
Dudas y comentarios -----
|
Controles estándar II
En el artículo Controles estándar -La clase button- se trata con detalle la creación de controles, en particular los de la clase button, en este segundo artículo se analizan los detalles relacionados con los controles estándar de la clase static y scrollbar, al igual que los controles de clase button se utiliza la función CreateWindow() para la creación del control propiamente dicho, la diferencia está en la clase de control que se especifica como primer parámetro y los estilos particulares que se aplican para cada control.
La clase static
Creamos un control de tipo static especificando como primer parámetro en la llamada a la función CreateWindow() a la clase static. Este control define un simple campo de texto, o bien una caja para separar otros controles. Este tipo de control no acepta entrada de ratón o del teclado y tampoco envía mensajes a la ventana padre. Se trata en realidad de un control muy sencillo, cuyos estilos son los siguientes:
- SS_BLACKFRAME: Especifica una caja con el contorno color COLOR_3DDKSHADOW, que por defecto es negro.
- SS_BLACKRECT: Especifica un rectángulo relleno de color COLOR_3DDKSHADOW, que por defecto es negro.
- SS_CENTER: Especifica un rectángulo simple con texto justificado al centro.
- SS_GRAYFRAME: Una caja con el contorno de color COLOR_BTNSHADOW, por defecto este color es gris.
- SS_GRAYRECT: Un rectángulo relleno de color COLOR_BTNSHADOW.
- SS_ICON: Cuando el control se utiliza en un cuadro de diálogo especifica un ícono definido en el archivo de recursos.
- SS_LEFT: Un rectángulo simple con texto justificado a la izquierda.
- SS_RIGHT: Un rectángulo simple con texto justificado a la derecha.
- SS_LEFTNOWORDWRAP: Un rectángulo con texto justificado por la izquierda en una sola línea.
- SS_NOPREFIX: Evita el uso del carácter de ampersand (&) para especificar una tecla aceleradora.
- SS_SIMPLE: Un rectángulo con una sola línea de texto alineada por la izquierda.
- SS_WHITEFRAME: Una caja con el contorno de color COLOR_BTNHIGHLIGHT que por defecto es blanco.
- SS_WHITERECT: Un rectángulo relleno de color COLOR_BTNHIGHLIGHT.
Solo se debe especificar uno solo de los estilos anteriores en combinación, claro está, de los estilos comunes para todos los controles estándar. El control de clase static es muy sencillo, veremos cómo se programa en los ejemplos de este tutorial.
Volver al principio
La clase scrollbar
Las barras de desplazamiento son ventanas hija que se crean especificando la clase scrollbar como primer parámetro en la llamada a la función CreateWindow(). Los estilos principales son SB_VERT para barras verticales y SB_HORZ para barras horizontales. Existen otros estilos que se aplican cuando las barras de desplazamiento se encuentran dentro de un cuadro de diálogo, estos estilos serán analizados oportunamente. En este artículo nos interesa la barra de desplazamiento como medio para obtener una entrada por parte del usuario.
Las barras de desplazamiento no envían mensajes WM_COMMAND a la ventana padre, en cambio envían mensajes, según sea el caso, WM_VSCROLL para barras verticales y WM_HSCROLL para barras horizontales. Para cada barra de desplazamiento existe un rango y una posición asociadas, cuyos valores iniciales se pueden establecer mediante las siguientes funciones:
SetScrollRange(hwnd, SB_CTL, iMin, iMax, bDibujar);
SetScrollPos(hwnd, SB_CTL, iPos, bDibujar);
|
El programa control3.c demuestra cómo implementar una barra de desplazamiento horizontal, utiliza además un control de clase static para desplegar el valor actual de la posición de la barra de desplazamiento. Como ya se dijo, se utilizan con frecuencia las barras de desplazamiento para obtener un valor de entrada por parte del usuario dentro de un rango limitado de acuerdo a los requerimientos del programa. Veamos el procedimiento de ventana del programa control3.c, en la primera etapa creamos un control de clase static y uno de clase scrollbar como respuesta al mensaje WM_CREATE, la barra de desplazamiento la inicializamos con un rango mínimo de 0 y máximo de 100, mientras que su posición inicial será de 50:
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
static HWND hWndStatic, hWndScroll;
static int iPos;
switch (iMsg)
{
case WM_CREATE:
// Control static:
hWndStatic = CreateWindow("static", "50",
WS_CHILD | WS_VISIBLE | WS_BORDER | SS_CENTER,
95, 20, 160, 20,
hwnd, (HMENU) 1, hInst, NULL);
// Control de barra de desplazamiento
hWndScroll = CreateWindow("scrollbar", NULL,
WS_CHILD | WS_VISIBLE | SBS_HORZ,
10, 60, 330, 20,
hwnd, (HMENU) 2, hInst, NULL);
// Rango y posición iniciales
iPos = 50;
SetScrollRange(hWndScroll, SB_CTL, 0, 100, TRUE);
SetScrollPos(hWndScroll, SB_CTL, iPos, TRUE);
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
}
return DefWindowProc (hwnd, iMsg, wParam, lParam);
}
|
Al compilar y ejecutar el programa control3.c aparece una ventana con dos controles, sin embargo al tratar de manipular el control de barra de desplazamiento vemos que no se obtiene ningún resultado, esto es porque al programa le falta capturar y procesar una serie de valores relacionados con el mensaje WM_HSCROLL, capturando la palabra baja (LOWORD) de la variable wParam durante el proceso del mensaje WM_HSCROLL lograremos controlar la barra de desplazamiento, por lo tanto agregamos el código necesario al procedimiento de ventana:
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
static HWND hWndStatic, hWndScroll;
static int iPos;
static char valor[4];
switch (iMsg)
{
case WM_CREATE:
// Control static:
hWndStatic = CreateWindow("static", "50",
WS_CHILD | WS_VISIBLE | WS_BORDER | SS_CENTER,
95, 20, 160, 20,
hwnd, (HMENU) 1, hInst, NULL);
// Control de barra de desplazamiento
hWndScroll = CreateWindow("scrollbar", NULL,
WS_CHILD | WS_VISIBLE | SBS_HORZ,
10, 60, 330, 20,
hwnd, (HMENU) 2, hInst, NULL);
// Rango y posición iniciales
iPos = 50;
SetScrollRange(hWndScroll, SB_CTL, 0, 100, TRUE);
SetScrollPos(hWndScroll, SB_CTL, iPos, TRUE);
return 0;
case WM_SETFOCUS:
SetFocus(hWndScroll);
return 0;
case WM_HSCROLL:
switch(LOWORD(wParam))
{
case SB_PAGEDOWN:
iPos = min(100, iPos + 10);
break;
case SB_LINEDOWN:
iPos = min(100, iPos + 1);
break;
case SB_PAGEUP:
iPos = max(0, iPos - 10);
break;
case SB_LINEUP:
iPos = max(0, iPos - 1);
break;
case SB_TOP:
iPos = 0;
break;
case SB_BOTTOM:
iPos = 100;
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
iPos = HIWORD(wParam);
break;
default:
break;
}
SetScrollPos(hWndScroll, SB_CTL, iPos, TRUE);
// Convierte un entero en texto
itoa(iPos, valor, 10);
// Despliega el nuevo valor
SetWindowText(hWndStatic, valor);
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
}
return DefWindowProc (hwnd, iMsg, wParam, lParam);
}
|
Conviene hacer una breve descripción de los diferentes mensajes relacionados con las barras de desplazamiento, recuerde que éstos mensajes se aplican tanto a barras horizontales como verticales:
- SB_PAGEDOWN: Mensaje generado cuando el usuario hace clic con el ratón en la región comprendida entre el recuadro de desplazamiento y la flecha de desplazamiento inferior.
- SB_PAGEUP: Mensaje generado cuando el usuario hace clic con el ratón en la región comprendida entre el recuadro de desplazamiento y la flecha de desplazamiento superior.
- SB_LINEDOWN: Mensaje generado cuando el usuario hace clic en la flecha de desplazamiento inferior.
- SB_LINEUP: Mensaje generado cuando el usuario hace clic en la flecha de desplazamiento superior.
- SB_TOP: Mensaje generado cuando el recuadro de desplazamiento se encuentra en la parte superior de la barra de desplazamiento.
- SB_BOTTOM: Mensaje generado cuando el recuadro de desplazamiento se encuentra en la parte inferior de la barra de desplazamiento.
- SB_THUMBPOSITION: Mensaje generado después de que el usuario ha liberado el botón del ratón una vez que se haya hecho clic sobre cualquier parte de la barra.
- SB_THUMBTRACK: Mensaje de notificación generado cuando el usuario arrastra el recuadro de desplazamiento
Realmente, después de esta breve explicación resulta fácil entender y poner en práctica una barra de desplazamiento completamente funcional, se deja al estudiante diligente la implementación de una barra de desplazamiento vertical a manera de ejercicio. Observe en el código fuente el uso de las macros min y max.
Este artículo es en realidad breve, dejaré para otros artículos el tratamiento de los controles que faltan por cubrir pues éstos son un poco mas complicados y merecen una mejor atención, de esta manera se entenderán mejor los conceptos tratados, finalmente incluyo el código fuente completo del programa control3.c para que Usted lo estudie, lo compile y experimente con el mismo.
//*********************************************************
// control3.c
// Demuestra controles static y scrollbar
// (c)1999, Jaime Virgilio Gómez Negrete
//*********************************************************
#include <windows.h>
HINSTANCE hInst;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static char szAppName[] = "wTarea";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof (wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
RegisterClassEx (&wndclass);
hInst = hInstance; // hInstance disponible en WndProc
hwnd = CreateWindow (szAppName, "Controles estándar",
WS_DLGFRAME|WS_SYSMENU|WS_BORDER|WS_MINIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT, 360, 140,
NULL, NULL, hInstance, NULL);
ShowWindow (hwnd, iCmdShow);
UpdateWindow (hwnd);
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
static HWND hWndStatic, hWndScroll;
static int iPos;
static char valor[4];
switch (iMsg)
{
case WM_CREATE:
// Control static:
hWndStatic = CreateWindow("static", "50",
WS_CHILD | WS_VISIBLE | WS_BORDER | SS_CENTER,
95, 20, 160, 20,
hwnd, (HMENU) 1, hInst, NULL);
// Control de barra de desplazamiento
hWndScroll = CreateWindow("scrollbar", NULL,
WS_CHILD | WS_VISIBLE | SBS_HORZ,
10, 60, 330, 20,
hwnd, (HMENU) 2, hInst, NULL);
// Rango y posición iniciales
iPos = 50;
SetScrollRange(hWndScroll, SB_CTL, 0, 100, TRUE);
SetScrollPos(hWndScroll, SB_CTL, iPos, TRUE);
return 0;
case WM_SETFOCUS:
SetFocus(hWndScroll);
return 0;
case WM_HSCROLL:
switch(LOWORD(wParam))
{
case SB_PAGEDOWN:
iPos = min(100, iPos + 10);
break;
case SB_LINEDOWN:
iPos = min(100, iPos + 1);
break;
case SB_PAGEUP:
iPos = max(0, iPos - 10);
break;
case SB_LINEUP:
iPos = max(0, iPos - 1);
break;
case SB_TOP:
iPos = 0;
break;
case SB_BOTTOM:
iPos = 100;
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
iPos = HIWORD(wParam);
break;
default:
break;
}
SetScrollPos(hWndScroll, SB_CTL, iPos, TRUE);
// Convierte un entero en texto
itoa(iPos, valor, 10);
// Despliega el nuevo valor
SetWindowText(hWndStatic, valor);
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
}
return DefWindowProc (hwnd, iMsg, wParam, lParam);
}
|
Volver al principio
© 2000 Jaime Virgilio
Gómez Negrete, Derechos Reservados
|