Winforms – Regolare la larghezza della barra di scorrimento verticale sul CheckedListBox

Ho un CheckListBox sul mio stato di forma, ma voglio fare la barra di scorrimento più utenti utilizzano il touch screen non è un mouse.

Come posso modificare la barra di scorrimento larghezza?

EDIT: sto parlando della larghezza della barra di scorrimento verticale

OriginaleL’autore Jon | 2009-11-30

3 Replies
  1. 3

    Per modificare la dimensione fisica della barra di scorrimento, vedere questo.

    Questo è venuto dalla seguente pagina: La barra di Scorrimento orizzontale nella ListBox. L’ho modificata 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);
          }
       }
    }

    OriginaleL’autore SwDevMan81

  2. 3

    Il seguente codice fa uso di SPI_SETNONCLIENTMETRICS per modificare l’impostazione di sistema per la barra di scorrimento larghezza. NOTA che cambierà tutte le applicazioni del sistema, non una sola. Probabilmente si dovrebbe fare di questo un elemento di configurazione in modo che è possibile modificare la larghezza di default, 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 barra di scorrimento larghezza

    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 la dimensione 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);
    Si blocca su Windows 10

    OriginaleL’autore Michael Prewecki

  3. 0

    Si può fare solo con la creazione di un custom CLB controllo e ignorando l’evento OnPaint.

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

    Edit 2: Si potrebbe, come il seguente esempio di un personalizzato barra di scorrimento: http://www.codeproject.com/KB/miscctrl/MotifScrollBars.aspx

    Potreste darmi una guida?
    Questo è difficile, perché non sono un esperto in creazione di controlli personalizzati. Per iniziare, ecco alcuni di codice di base. Cercherò di trovare qualche esempio con più profondità. public class MyCheckedListBox : CheckedListBox { protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); } }
    Grazie di aver visto quelle di me stesso, ma purtroppo nessuna barra di scorrimento larghezza di proprietà ecc
    Era quello che temevo. Ancora, penso che la creatività di te con OnPaint e OnMouseDown gestori di eventi è l’unica soluzione.

    OriginaleL’autore Webleeuw

Lascia un commento