Saltar al contenido

Personalizar la barra de desplazamiento de Windows Form

Te sugerimos que revises esta resolución en un entorno controlado antes de pasarlo a producción, un saludo.

Solución:

No, no hay forma de cambiar el ancho de una barra de desplazamiento que se muestra en un solo control (aunque hay una configuración para todo el sistema que afectará todo barras de desplazamiento en todas las aplicaciones).

La fea verdad es que el control de la barra de desplazamiento es mucho más complicado de lo que parece. Básicamente, las barras de desplazamiento en el FlowLayoutPanel son dibujados por Windows mismo (en lugar de .NET Framework) debido a la WS_HSCROLL y / o WS_VSCROLL estilos de ventana que se establecen para el control detrás de escena. El FlowLayoutPanel no proporciona ninguna función para cambiar o modificar la forma en que se dibujan estas barras de desplazamiento integradas. A diferencia de otras modificaciones más avanzadas en WinForms, no existen tales mensajes que podamos enviar al procedimiento de ventana del control. Y para empeorar las cosas, las barras de desplazamiento se dibujan en el área no cliente del FlowLayoutPanel, lo que significa que no podemos simplemente anular su Paint evento y manejar el dibujo de las barras de desplazamiento nosotros mismos.

Desafortunadamente, si realmente desea personalizar sus barras de desplazamiento, tendrá que ocultar las barras de desplazamiento integradas y enrollar las suyas propias. Sin embargo, no es tan difícil como parece, si estás dispuesto a hacerlo. Este artículo sobre CodeProject proporciona un buen tutorial sobre cómo crear su propia barra de desplazamiento con máscara como control de usuario y usarla como reemplazo en el control de contenedor de su elección.

La respuesta de Cody Gray es 100% correcta, aunque quería agregar más material de referencia sobre el tema.

Fondo

La forma en que Windows Forms crea barras de desplazamiento es mediante el uso de estilos de ventana WS_HSCROLL y WS_VSCROLL. Respectivamente, estos estilos son responsables de habilitar las barras de desplazamiento horizontal y vertical para un determinado HWND. Un HWND es un identificador de recurso nativo para un “ventana”, que en la jerga de .NET corresponde a un Control.

Pensando desde la perspectiva de la API de Windows, debemos establecer estilos de ventana en el momento en que creamos el HWND. Esto se hace mediante una llamada a CreateWindow, CreateWindowEx, o SetWindowLong. Naturalmente, podemos comenzar a pensar en usar P / Invoke para ayudarnos, pero esto sería una gran carga, ya que significa que tendríamos que volver a implementar Windows Forms desde cero.

Afortunadamente, Windows Forms expone una propiedad, CreateParams, que se puede anular para especificar los estilos de ventana exactos, entre otros Control parámetros de creación. Esta propiedad, a su vez, es consumida por .NET Framework para que pueda crear la HWND con los estilos apropiados cuando el Control se instancia.

Personalizar la barra de desplazamiento

Reemplazar la funcionalidad de la API de Windows por una barra de desplazamiento es en realidad más simple de lo que parece; sin embargo, esto no es obvio (bueno para mí de todos modos, tuve que examinar la fuente .NET para encontrar la respuesta). Para hacer esto, debemos elegir el apropiado Control heredar para crear nuestra propia costumbre ScrollableControl. Si observamos el código fuente de System.Windows.Forms.ScrollableControl, vemos que se utilizan los siguientes estilos:

CreateParams cp = base.CreateParams;
 
if (HScroll || HorizontalScroll.Visible) 
    cp.Style 
else 
    cp.Style &= (~NativeMethods.WS_HSCROLL);

if (VScroll || VerticalScroll.Visible) 
    cp.Style 
else 
    cp.Style &= (~NativeMethods.WS_VSCROLL);

Entonces, en resumen, cuando nos extendemos de ScrollableControl, las barras de desplazamiento horizontal y vertical nativas se habilitan según su lógica interna. Podríamos acceder al ScrollableControlla manija de la ventana y luego llamar SetWindowLong para ocultar las barras de desplazamiento; sin embargo, tendríamos que realizar un seguimiento de todos los lugares que ScrollableControl interactúa con la API de Windows. De hecho, hay una función interna Control.UpdateStylesCore() que se llama en función de si se deben mostrar o no las barras de desplazamiento. Esta función vuelve a aplicar efectivamente los estilos de Windows anteriores, y probablemente sería mejor no luchar con ella. Sería un enfoque mucho más limpio alejarse de la API de Windows y extenderse directamente desde Control. Luego podemos proporcionar cualquier API que deseemos tener.

Esto significa que estaríamos buscando volver a implementar:

  1. Actualización de las barras de desplazamiento para los eventos de la rueda del mouse.
  2. Actualización de las barras de desplazamiento en función de hacer clic en los botones de la barra de desplazamiento personalizada y en las pistas / pulgares.
  3. Actualización de las barras de desplazamiento en función de agregar / eliminar / mover / cambiar el tamaño de los controles secundarios.
  4. Creación de márgenes de desplazamiento automático.
  5. Restricciones en el área del cliente que afectan cuando las barras de desplazamiento son visibles.
  6. Y así…

Alternativamente, un enfoque simple podría ser crear un nuevo UserControl. Esto nos permitiría usar el diseñador de Visual Studio para simplificar la configuración de nuestros botones y pistas de la barra de desplazamiento.

Cualquiera que sea el camino que se tome, será necesario ver cómo ScrollableControl funciona internamente para proporcionar una experiencia de usuario cómoda.

Comentarios y puntuaciones

Recuerda algo, que puedes optar por la opción de agregar una reseña si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *