Domanda

Ho un CheckListBox nel mio modulo ma voglio allargare la barra di scorrimento poiché gli utenti utilizzano touchscreen e non un mouse.

Come posso modificare la larghezza della barra di scorrimento?

EDIT: sto parlando della larghezza della barra di scorrimento verticale

È stato utile?

Soluzione

Per modificare le dimensioni fisiche della barra di scorrimento, vedere this .

Questo è venuto dalla seguente pagina: Barra di scorrimento orizzontale in ListBox . L'ho modificato per Winforms e ha funzionato per me:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace CheckedListBoxScrollBarsWidth
{
   public partial class Form1 : Form
   {
      const int LB_GETHORIZONTALEXTENT = 0x0193;
      const int LB_SETHORIZONTALEXTENT = 0x0194;

      const long WS_HSCROLL = 0x00100000L;

      const int SWP_FRAMECHANGED = 0x0020;
      const int SWP_NOMOVE = 0x0002;
      const int SWP_NOSIZE = 0x0001;
      const int SWP_NOZORDER = 0x0004;

      const int GWL_STYLE = (-16);    

      public Form1()
      {
         InitializeComponent();
         checkedListBox1.HorizontalScrollbar = true;
         AddStyle(checkedListBox1.Handle, (uint)WS_HSCROLL);
         SendMessage(checkedListBox1.Handle, LB_SETHORIZONTALEXTENT, 1000, 0);
      }

      [DllImport("user32.dll")]
      static extern int SendMessage(IntPtr hwnd, int msg, int wParam, int lParam);

      [DllImport("user32.dll")]
      static extern uint GetWindowLong(IntPtr hwnd, int index);

      [DllImport("user32.dll")]
      static extern void SetWindowLong(IntPtr hwnd, int index, uint value);

      [DllImport("user32.dll")]
      static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X,
            int Y, int cx, int cy, uint uFlags);


      private void AddStyle(IntPtr handle, uint addStyle)
      {
         // Get current window style
         uint windowStyle = GetWindowLong(handle, GWL_STYLE);

         // Modify style
         SetWindowLong(handle, GWL_STYLE, windowStyle | addStyle);

         // Let the window know of the changes
         SetWindowPos(handle, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOZORDER | SWP_NOSIZE | SWP_FRAMECHANGED);
      }
   }
}

Altri suggerimenti

Il codice seguente utilizza SPI_SETNONCLIENTMETRICS per modificare l'impostazione a livello di sistema per la larghezza della barra di scorrimento. NOTA che cambierà tutte le applicazioni sul sistema non solo una singola. Probabilmente dovresti rendere questo un elemento di configurazione in modo da poter ripristinare la larghezza su un valore predefinito se necessario.

 [DllImport("user32", CharSet = CharSet.Auto)]
    private static extern int SystemParametersInfo(int uAction, int uParam, ref NONCLIENTMETRICS lpvParam, int fuWinIni);

    private const int LF_FACESIZE = 32;

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    private struct LOGFONT
    {
        public int lfHeight;
        public int lfWidth;
        public int lfEscapement;
        public int lfOrientation;
        public int lfWeight;
        public byte lfItalic;
        public byte lfUnderline;
        public byte lfStrikeOut;
        public byte lfCharSet;
        public byte lfOutPrecision;
        public byte lfClipPrecision;
        public byte lfQuality;
        public byte lfPitchAndFamily;

        /// <summary>
        /// <see cref="UnmanagedType.ByValTStr"/> means that the string
        /// should be marshalled as an array of TCHAR embedded in the
        /// structure.  This implies that the font names can be no larger
        /// than <see cref="LF_FACESIZE"/> including the terminating '\0'.
        /// That works out to 31 characters.
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = LF_FACESIZE)]
        public string lfFaceName;

        // to shut it up about the warnings
        public LOGFONT(string lfFaceName)
        {
            this.lfFaceName = lfFaceName;
            lfHeight = lfWidth = lfEscapement = lfOrientation = lfWeight = 0;
            lfItalic = lfUnderline = lfStrikeOut = lfCharSet = lfOutPrecision
            = lfClipPrecision = lfQuality = lfPitchAndFamily = 0;
        }
    }

    private struct NONCLIENTMETRICS
    {
        public int cbSize;
        public int iBorderWidth;
        public int iScrollWidth;
        public int iScrollHeight;
        public int iCaptionWidth;
        public int iCaptionHeight;
        /// <summary>
        /// Since <see cref="LOGFONT"/> is a struct instead of a class,
        /// we don't have to do any special marshalling here.  Much
        /// simpler this way.
        /// </summary>
        public LOGFONT lfCaptionFont;
        public int iSMCaptionWidth;
        public int iSMCaptionHeight;
        public LOGFONT lfSMCaptionFont;
        public int iMenuWidth;
        public int iMenuHeight;
        public LOGFONT lfMenuFont;
        public LOGFONT lfStatusFont;
        public LOGFONT lfMessageFont;
    }

    private const int SPI_GETNONCLIENTMETRICS = 41;
    private const int SPI_SETNONCLIENTMETRICS = 42;
    private const int SPIF_SENDCHANGE = 2;

È quindi possibile utilizzare questo codice per visualizzare il valore corrente per la larghezza della barra di scorrimento

NONCLIENTMETRICS metrics = new NONCLIENTMETRICS();
metrics.cbSize = Marshal.SizeOf(metrics);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, ref metrics, 0);

MessageBox.Show(metrics.iScrollWidth.ToString());

È quindi possibile utilizzare questo codice per modificare le dimensioni della barra di scorrimento ...

NONCLIENTMETRICS metrics = new NONCLIENTMETRICS();
metrics.cbSize = Marshal.SizeOf(metrics);

metrics.iScrollWidth = 17;

SystemParametersInfo(SPI_SETNONCLIENTMETRICS, metrics.cbSize, ref metrics, SPIF_SENDCHANGE);

Puoi farlo solo creando un controllo CLB personalizzato e sovrascrivendo l'evento OnPaint.

Modifica: Ok, ancora molto semplice, ma questo articolo su CodeProject potrebbe aiutarti: http://www.codeproject.com/KB/miscctrl/cutebutton.aspx

Modifica 2: potrebbe piacerti il ??seguente esempio di barra di scorrimento personalizzata: http: / /www.codeproject.com/KB/miscctrl/MotifScrollBars.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top