Winforms - adjust vertical scrollbar width on CheckedListBox

I have a CheckListBox in my form, but I want to make the scrollbar wider as users use touch screens rather than a mouse.

How to change scrollbar width?

EDIT: I am talking about the width of the vertical scrollbar

+2
source share
3 answers

To change the physical size of the scroll bar, see this .

This happened on the following page: Horizontal scrollbar in ListBox . I changed it for Winforms and it worked for 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); } } } 
+3
source

The following code uses SPI_SETNONCLIENTMETRICS to change the system width of the scroll bar. Please note that it will change all applications in the system not only by one. You should probably make this a configuration item so that you can change the width to the default if you need to.

  [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; 

Then you can use this code to see the current value of the scrollbar width

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

Then you can use this code to resize the scrollbar ...

 NONCLIENTMETRICS metrics = new NONCLIENTMETRICS(); metrics.cbSize = Marshal.SizeOf(metrics); metrics.iScrollWidth = 17; SystemParametersInfo(SPI_SETNONCLIENTMETRICS, metrics.cbSize, ref metrics, SPIF_SENDCHANGE); 
+3
source

You can only do this by creating a custom CLB control and overriding the OnPaint event.

Edit: Ok, still very simple, but this article on CodeProject can help you: http://www.codeproject.com/KB/miscctrl/cutebutton.aspx

Edit 2: you might like the following example of a custom scrollbar: http://www.codeproject.com/KB/miscctrl/MotifScrollBars.aspx

0
source

Source: https://habr.com/ru/post/1334201/


All Articles