Quiero que el programa responda al mensaje de arrastre del control deslizante, pero acabo de aprender a programar y no sé cómo programar una función.
Mensajes de la barra de desplazamiento: mensajes WM_VSCROLL (barra de desplazamiento hacia arriba y hacia abajo) y WM_HSCROLL (izquierda y derecha)
Para los mensajes de las barras de desplazamiento creadas como parte de una ventana, se ignora lParam; solo se usa para barras de desplazamiento creadas como ventanas secundarias (generalmente dentro de cuadros de diálogo).
Los parámetros del mensaje wParam se dividen en un grupo de palabras bajas y un grupo de palabras altas.
El grupo de palabras bajas de wParam es un valor numérico que indica la operación del mouse en la barra de desplazamiento. Este valor se considera un "código de notificación".
El valor del código de notificación se define mediante un identificador que comienza con SB (barra de desplazamiento). Los siguientes son códigos de notificación definidos en WINUSER.H:
#define SB_LINEUP 0 #define SB_LINELEFT 0
#define SB_LINEDOWN 1 #define SB_LINERIGHT 1
# SB_PAGEUP 2#definir SB_PAGELEFT 2
#definir SB_PAGEDOWN 3
#definir SB_PAGERIGHT 3
#definir SB_THUMBPOSITION 4
#definir SB_THUMBTRACK definir 5
#definir SB_TOP 6
#definir SB_LEFT 6
#definir SB_BOTTOM 7
#definir SB_RIGHT 7
#define SB_ENDSCROLL 8
Los identificadores que contienen IZQUIERDA y DERECHA se utilizan para las barras de desplazamiento horizontales, y los identificadores que contienen ARRIBA, ABAJO, ARRIBA y ABAJO se utilizan para las barras de desplazamiento verticales.
Hay un PULGAR dentro del control deslizante, una LÍNEA dentro de la flecha y una PÁGINA en el área en blanco de la barra de desplazamiento.
Los códigos de notificación SB_TOP, SB_BOTTOM, SB_LEFT y SB_RIGHT indican el desplazamiento. La barra se ha movido a su posición mínima o máxima.
Las barras de desplazamiento creadas como parte de la ventana de la aplicación no recibirán SB_TOP, SB_BOTTOM, SB_LEFT y SB_RIGHT a menos que se envíen con SendMessage.
Si mantiene presionado el botón del mouse en varias partes de la barra de desplazamiento, el programa puede recibir múltiples mensajes de la barra de desplazamiento.
Cuando se suelta el botón del mouse, el programa recibirá un mensaje con el código de notificación SB_ENDSCROLL. Este mensaje es de poca utilidad. Windows no cambiará la posición del cuadro de desplazamiento.
Cuando la palabra baja de wParam es SB_THUMBTRACK, la palabra alta de wParam es la posición actual del usuario al arrastrar el cuadro de desplazamiento.
Cuando la palabra baja de wParam es SB_THUMBPOSITION, la palabra alta de wParam es la posición final del cuadro de desplazamiento después de que el usuario suelta el botón del mouse.
SetScrollInfo/GetScrollInfo establece/obtiene información de la barra de desplazamiento
typedef struct tagSCROLLINFO
{
UINT cbSize ;// establecido en sizeof ( SCROLLINFO)
UINT fMask ; // valores para establecer u obtener
int nMin ; // valor de rango mínimo
int nMax ; valor
UINT nPage ; // tamaño de página
int nPos ; // posición actual
int nTrackPos ;// posición de seguimiento actual
} SCROLLINFO
fCampo de máscara:
Indicador SIF_RANGE: rango de la barra de desplazamiento, campos operativos nMin y nMax.
Indicador SIF_POS: posición actual, campo nPos.
Indicador SIF_PAGE: tamaño de página, campo nPage. Si no desea barras de desplazamiento proporcionales, no utilice esta bandera.
Indicador SIF_TRACKPOS: usado solo, campo nTrackPos, posición del cuadro de desplazamiento.
Indicador SIF_DISABLENOSCROLL: si se especifica este indicador y los nuevos parámetros de la barra de desplazamiento hacen que la barra de desplazamiento desaparezca, la barra de desplazamiento no se puede utilizar (más explicación a continuación).
El indicador SIF_ALL es una combinación de SIF_RANGE, SIF_POS, SIF_PAGE y SIF_TRACKPOS.
Esto es conveniente al configurar los parámetros de la barra de desplazamiento durante el procesamiento de mensajes WM_SIZE (se ignora después de especificar SIF_TRACKPOS en la función SetScrollInfo). Esto también resulta útil cuando se manejan mensajes de la barra de desplazamiento.
//Proporcionarle un programa completo
//Escribir un programa que muestre información que se puede obtener de la llamada GetSystemMetrics
//Crear una estructura Matriz de cuerpo, que hace coincidir el valor de índice admitido por la función con el identificador y la descripción de la función
// Genera esta matriz de estructura, una línea para cada componente visual.
#include
#include
#include
typedef estructura
{
int index;
TCHAR *defmacro;
TCHAR *functiontip;
}MÉTRICAS ;
METRICS metrics[]=
{
SM_CXSCREEN, TEXT ("SM_CXSCREEN"),
TEXT ("Ancho de pantalla, Unidad de píxel"),
SM_CYSCREEN, TEXT ("SM_CYSCREEN"),
TEXT ("Altura de pantalla, unidad de píxel"),
SM_CXVSCROLL, TEXT ( "SM_CXVSCROLL"),
TEXT ("Ancho de la barra de desplazamiento vertical"),
SM_CYHSCROLL, TEXT ("SM_CYHSCROLL"),
TEXT ("Desplazamiento horizontal ancho de barra") alto de barra"),
SM_CYCAPTION, TEXT ("SM_CYCAPTION"),
TEXT ("alto de barra de título"),
SM_CXBORDER, TEXT ("SM_CXBORDER"),
TEXT ("Ancho del borde de la ventana"),
SM_CYBORDER, TEXT ("SM_CYBORDER"),
TEXT ("Ventana altura del borde") ,
SM_CXFIXEDFRAME,TEXT ("SM_CXFIXEDFRAME"),
TEXT ("Ancho del marco de la ventana de diálogo"),
SM_CYFIXEDFRAME,TEXT (" SM_CYFIXEDFRAME") ,
TEXT ("Altura del marco de la ventana de diálogo"),
SM_CYVTHUMB, TEXT ("SM_CYVTHUMB"),
TEXT ("Barra de desplazamiento vertical control deslizante" Altura"),
SM_CXHTHUMB, TEXT ("SM_CXHTHUMB"),
TEXT ("Ancho del control deslizante de la barra de desplazamiento horizontal y vertical"),
SM_CXICON , TEXTO ("SM_CXICON"),
TEXTO ("ancho del icono"),
SM_CYICON, TEXTO ("SM_CYICON"),
TEXTO ("alto del icono"),
SM_CXCURSOR, TEXTO ("SM_CXCURSOR"),
TEXTO ("ancho del mouse"),
SM_CYCURSOR, TEXTO ("SM_CYCURSOR"),
TEXT ("Altura del mouse"),
SM_CYMENU, TEXT ("SM_CYMENU"),
TEXT ("Altura de la barra de menú"),
SM_CXFULLSCREEN,TEXT ("SM_CXFULLSCREEN"),
TEXT ("Ancho del área de cliente de pantalla completa"),
SM_CYFULLSCREEN,TEXT ("SM_CYFULLSCREEN"),
TEXT (" La altura de toda el área del cliente de la pantalla, excluyendo la barra de tareas"),
SM_CYKANJIWINDOW,TEXT ("SM_CYKANJIWINDOW"),
TEXT ("Altura de la ventana Kanji"),
TEXT ("altura de la flecha de la barra de desplazamiento vertical"),
SM_CXHSCROLL,TEXT ("SM_CXHSCROLL"),
TEXT ("barra de desplazamiento horizontal ancho de flecha") ,
SM_DEBUG, TEXT ("SM_DEBUG"),
TEXT ("Indicador de versión de depuración"),
SM_SWAPBUTTON,TEXT ("SM_SWAPBUTTON "),
TEXT ("El indicador de intercambio 0 de los botones izquierdo y derecho del mouse no tiene intercambio distinto de cero"),
SM_CXMIN, TEXT ("SM_CXMIN"),
TEXT ("Ancho y alto mínimo de ventana"),
SM_CYMIN, TEXT ("SM_CYMIN"),
TEXT ("Alto mínimo de ventana"),
SM_CXSIZE, TEXT ("SM_CXSIZE"),
TEXT ("El ancho del botón en la barra de título"),
SM_CYSIZE, TEXT ("SM_CYSIZE"),
TEXT ("Altura del botón en la barra de título"),
SM_CXSIZEFRAME,TEXT ("SM_CXSIZEFRAME"),
TEXT ("Ancho del marco de tamaño de ventana "),
SM_CYSIZEFRAME,TEXT ("SM_CYSIZEFRAME"),
TEXT ("Tamaño de la ventana, altura del marco"),
SM_CXMINTRACK,TEXT ("SM_CXMINTRACK" ),
TEXT ("Ancho mínimo de ventana de tamaño variable"),
SM_CYMINTRACK,TEXT ("SM_CYMINTRACK"),
TEXT ("Ancho mínimo de ventana de tamaño variable" ),
SM_CXDOUBLECLK,TEXT ("SM_CXDOUBLECLK"),
TEXT ("El ancho del rango rectangular que se puede considerar como un doble clic del mouse "),
SM_CYDOUBLECLK,TEXT ("SM_CYDOUBLECLK"),
TEXT ("La altura del rango rectangular que puede considerarse como un doble clic del mouse"),
SM_CXICONSPACING,TEXT ("SM_CXICONSPACING"),
TEXT ("Cuando los elementos de un cuadro de lista, etc. son iconos, el ancho asignado a ellos >= SM_CXICON"),
SM_CYICONSPACING,TEXT ("SM_CYICONSPACING"),
TEXT ("Cuando los elementos de los cuadros de lista, etc. son iconos, la altura asignada a ellos es >=SM_CYICON"),
SM_MENUDROPALIGNMENT,TEXT ("SM_MENUDROPALIGNMENT"),
TEXT ("Menú desplegable izquierda o derecha"),
p>
SM_PENWINDOWS, TEXT ("SM_PENWINDOWS"),
TEXT ("Extensiones de lápiz instaladas"),
SM_DBCSENABLED, TEXT ("SM_DBCSENABLED"),
TEXT ("Conjunto de caracteres de doble byte habilitado"),
SM_CMOUSEBUTTONS, TEXT ("SM_CMOUSEBUTTONS"),
TEXT ("Número de botones del mouse"),
SM_SECURE, TEXT ("SM_SECURE"),
TEXT ("El indicador 0 del mecanismo de seguridad del sistema no tiene un valor distinto de cero"),
SM_CXEDGE, TEXT ("SM_CXEDGE "),
TEXT ("Ancho del borde inferior de la ventana 3-D"),
SM_CYEDGE, TEXT ("SM_CYEDGE"),
TEXT ("Altura del borde de la ventana 3 -D"),
SM_CXMINSPACING, TEXT ("SM_CXMINSPACING"),
TEXT ("El ancho asignado a la ventana minimizada en la barra de tareas>=SM_CXMINMIZED ") ,
SM_CYMINSPACING, TEXT ("SM_CYMINSPACING"),
TEXT ("El ancho asignado a la ventana minimizada en la barra de tareas>=SM_CYMINMIZED"),
SM_CXSMICON, TEXT ("SM_CXSMICON"),
TEXT ("ancho del icono pequeño"),
SM_CYSMICON, TEXT ("SM_CYSMICON"),
TEXT ("Altura del icono pequeño"),
SM_CYSMCAPTION, TEXT ("SM_CYSMCAPTION"),
TEXT ("Altura del título pequeño"),
SM_CXSMSIZ
E, TEXTO ("SM_CXSMSIZE"),
TEXTO ("ancho del botón de título pequeño"),
SM_CYSMSIZE, TEXTO ("SM_CYSMSIZE"),
TEXT ("Altura del botón de subtítulos"),
SM_CXMENUSIZE, TEXT ("SM_CXMENUSIZE"),
TEXT ("Ancho del botón de la barra de menú"),
SM_CYMENUSIZE, TEXT ("SM_CYMENUSIZE"),
TEXT ("Altura del botón de la barra de menú"),
SM_ARRANGE, TEXT ("SM_ARRANGE"),
TEXT ("La forma en que el sistema organiza las ventanas minimizadas"),
SM_CXMINIMIZED, TEXT ("SM_CXMINIMIZED"),
TEXT ("El ancho de la ventana minimizada"),
SM_CYMINIMIZED, TEXT ("SM_CYMINIMIZED"),
TEXT ("Minimizar altura de ventana"),
SM_CXMAXTRACK, TEXT ("SM_CXMAXTRACK"),
TEXT ("El ancho máximo de la ventana de tamaño variable"),
SM_CYMAXTRACK, TEXT ("SM_CYMAXTRACK"),
TEXT ("El ancho máximo de la ventana de tamaño variable") Altura máxima"),
SM_CXMAXIMIZED, TEXT ("SM_CXMAXIMIZED"),
TEXT ("Maximizar el ancho de la ventana"),
SM_CYMAXIMIZED, TEXT ( "SM_CYMAXIMIZED"),
TEXT ("Maximizar la altura de la ventana"),
SM_NETWORK, TEXT ("SM_NETWORK"),
TEXTO ("Indicador de presencia de red"),
SM_CLEANBOOT, TEXT ("SM_CLEANBOOT"),
TEXT ("Modo de inicio del sistema 0 normal 1 seguro 2 modo seguro con función de red"),
SM_CXDRAG, TEXT ("SM_CXDRAG ") ,
TEXT ("Evitar el ancho del rectángulo al arrastrar no válido"),
SM_CYDRAG, TEXT ("SM_CYDRAG"),
TEXT ("Evitar el rectángulo arrastrado no válido height"),
SM_SHOWSOUNDS, TEXT ("SM_SHOWSOUNDS"),
TEXT ("Presentar sonidos visualmente"),
SM_CXMENUCHECK, TEXT ("SM_CXMENUCHECK" ),
TEXT ("ancho del elemento de menú seleccionado"),
SM_CYMENUCHECK, TEXT ("SM_CYMENUCHECK"),
TEXT ( "Alto del elemento de menú seleccionado "),
SM_SLOWMACHINE, TEXT ("SM_SLOWMACHINE"),
TEXT ("Si hay instalado un procesador de gama baja TRUE"),
p>SM_MIDEATENABLED, TEXT ("SM_MIDEATENABLED"),
TEXT ("Bandera habilitada para hebreo y árabe")
} ;
/*
SM_MOUSEWHEELPRESENT,TEXT ("SM_MOUSEWHEELPRESENT"),
TEXT ("Indicador de presencia de rueda del mouse"),
SM_XVIRTUALSCREEN, TEXT ("SM_XVIRTUALSCREEN"),
p>
TEXT ("Pantalla virtual x origen"),
SM_YVIRTUALSCREEN, TEXT ("SM_YVIRTUALSCREEN"),
TEXT ("Pantalla virtual y o
rigin"),
SM_CXVIRTUALSCREEN, TEXT ("SM_CXVIRTUALSCREEN"),
TEXT ("Ancho de pantalla virtual"),
SM_CYVIRTUALSCREEN, TEXT ("SM_CYVIRTUALSCREEN" ),
TEXT ("Altura de pantalla virtual"),
SM_CMONITORS, TEXT ("SM_CMONITORS"),
TEXT ("Especificado en número NT5.0 de monitores"),
SM_SAMEDISPLAYFORMAT,TEXT ("SM_SAMEDISPLAYFORMAT"),
TEXT ("Indicador de formato del mismo color")
*/ p>
#define NUMLINES (sizeof(metrics)/sizeof(METRICS))
CALLBACK mywindowproc(HWND hwnd,UINT message,UINT wParam,UINT lParam);
HINSTANCE hInst;
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX wndclassex;
Mensaje MSG;
HWND hwnd;
hInst=hInstance;
wndclassex.cbSize=sizeof(WNDCLASSEX);
wndclassex.cbClsExtra=0;
wndclassex.cbWndExtra=0;
wndclassex.hbrBackground=(HBRUSH )GetStockObject (WHITE_BRUSH);
wndclassex.hCursor=LoadCursor(NULL,IDC_CROSS);
wndclassex.hIcon= LoadIcon (NULL, IDI_APPLICATION);
wndclassex .hIconSm =NULL;
wndclassex.hInstance=hInst;
wndclassex.lpfnWndProc=(WNDPROC)mywindowproc;
wndclassex.lpszClassName=TEXT("métricas del sistema") ;
wndclassex.l
pszMenuName=NULL;
wndclassex.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClassEx(&wndclassex))
{
Cuadro de mensaje (NULL,TEXT("¡este programa debe ejecutarse en el sistema WIN NT!"),TEXT("error"),MB_OK);
devuelve 0;
}
hwnd=CreateWindowEx(WS_EX_RTLREADING,TEXT("métricas del sistema"),TEXT("FEEEEE"),WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL);
ShowWindow(hwnd,SW_NORMAL);
UpdateWindow(hwnd);
while(GetMessage(&msg,0,NULL,NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
devuelve 0;
}
int CALLBACK mywindowproc(HWND hwnd,UINT message,UINT wParam,UINT lParam)
{
TEXTMETRIC tm;
HDC hdc;
PAINTSTRUCT ps;
static int cxChar,cyChar,cxCaps;
static int cxClient,cyClient;
int i;
int ipos;
SCROLLINFO scrollinfo;
int wmId,wmEvent;
TCHAR strbuffer[256];
MÉTRICAS *p;
RECT rt;
int comienzo, fin;
cambiar(mensaje)
{
caso WM_CREATE:
hdc=GetDC(hwnd);
GetTextMetrics(hdc,&tm);
cxChar=tm.tmAveCharWidth; p> p>
cxCaps=(tm.tmPitchAndFamily&1?3:2)*cxChar/2;
cyChar=tm.tmHeight+tm.tmExternalLeading;
ReleaseDC(hwnd ,hdc );
descanso;
caso WM_COMMAND:
wmId=LOWORD(wParam);
wmEvent=HIWORD(wParam) ;
cambiar(wmId)
{
caso 0:
descanso;
predeterminado:
descanso;
}
descanso;
caso WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
scrollinfo.cbSize=sizeof(SCROLLINFO);
scrollinfo.fMask=SIF_POS;
GetScrollInfo(hwnd,SB_VERT,&scrollinfo);
ipos=scrollinfo.nPos;//ipos representa el número de líneas de todo el texto en la primera línea que se muestra en el área del cliente p>
p>
comenzar=ipos+ps.rcPaint.top/cyChar-1;
end=min(ps.rcPaint.bottom/cyChar+ipos,NUMLINES)-1;
TextOut(hdc,0,-ipos*cyChar,TEXT("INDEX"),_tcslen(TEXT("INDEX")));
TextOut(hdc,5*cxCaps ,-ipos*cyChar ,TEXT("identificador"),_tcslen(TEXT("identificador")));
TextOut(hdc,25*cxCaps,-ipos*cyChar,TEXT("función") ,_tcslen( TEXT("función")));
TextOut(hdc,65*cxCaps,-ipos*cyChar,TEXT("Valor de retorno de GetSysystemMetrics"),_tcslen(TEXT("Valor de retorno de GetSysystemMetrics" ))) ;
si(comenzar<0)
{
comenzar=0;
}
for( i=begin;i<=end;i++)
{
//index
TextOut(hdc,0,(i-ipos+ 1)* cyChar,strbuffer,_stprintf(strbuffer,TEXT("%d"),metrics[i].index));
TextOut(hdc,5*cxCaps,(i-ipos+1) *cyChar, métricas[i].defmacro,_tcslen(métricas[i].defmacro));
TextOut(hdc,25*cxCaps,(i-ipos+1)*cyChar,métricas[i] .functiontip, _tcslen(metrics[i].functiontip));
TextOut(hdc,65*cxCaps,(i-ipos+1)*cyChar,strbuffer,_stprintf(strbuffer,TEXT("%d "), GetSystemMetrics(metrics[i].index)));
}
EndPaint(hwnd,&ps);
break;
caso WM_VSCROLL:
scrollinfo.cbSize=sizeof(SCROLLINFO);
scrollinfo.fMask=SIF_ALL;
GetScrollInfo(hw
nd,SB_VERT,&scrollinfo);
ipos=scrollinfo.nPos;
switch(LOWORD(wParam))//Código de notificación
{
caso SB_LINEUP:
scrollinfo.nPos--;
descanso;
caso SB_LINEDOWN:
scrollinfo.nPos++;
ruptura;
caso SB_PAGEUP:
scrollinfo.nPos-=scrollinfo.nPage;
ruptura;
caso SB_PAGEDOWN:
scrollinfo.nPos+=scrollinfo.nPage;
ruptura;
caso SB_ENDSCROLL:
ruptura;
caso SB_TOP:
scrollinfo.nPos=scrollinfo.nMin;
descanso;
caso SB_BOTTOM:
scrollinfo.nPos =scrollinfo.nMax;
ruptura;
caso SB_THUMBTRACK:
ruptura;
caso SB_THUMBPOSITION:
scrollinfo.nPos=scrollinfo.nTrackPos;
break;
}
scrollinfo.fMask=SIF_POS;
SetScrollInfo(hwnd,SB_VERT ,&scrollinfo,TRUE);
GetScrollInfo (hwnd, SB_VERT, &scrollinfo) ;
if (scrollinfo.nPos != ipos)
{
ScrollWindow (hwnd, 0, cyChar * (ipos - scrollinfo.nPos),NULL, NULL);
//Desplaza toda el área de visualización, un valor negativo de ipos - scrollinfo.nPos significa desplazamiento up
//Y establece el área no cubierta por la operación de desplazamiento como un rectángulo no válido
UpdateWindow (hwnd);
}
break;
case WM_SIZE:
cxClient=LOWORD(lParam);//El ancho del área del cliente
cyClient=HIWORD(lParam);/ /La altura del área del cliente
scrollinfo.cbSize=sizeof(SCROLLINFO);
scrollinfo.fMask=SIF_RANGE|SIF_PAGE;
scrollinfo.nMax=NUMLINES -1;
scrollinfo.nMin=0;
scrollinfo.nPage=cyClient/cyChar;
SetScrollInfo(
hwnd,SB_VERT,&scrollinfo,TRUE);
descanso;
caso WM_DESTROY:
PostQuitMessage(0);
descanso;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}