Winforms – 调整CheckedListBox上垂直滚动条的宽度

我的表单上有一个CheckListBox但是我想让滚动条更宽,因为用户使用的是触摸屏而不是鼠标。

如何更改滚动条宽度?

编辑:我说的是垂直滚动条的宽度

要更改滚动条的物理大小,请参阅此 。

这来自以下页面: ListBox中的水平滚动条 。 我为Winforms修改了它,它对我有用:

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); } } } 

以下代码使用SPI_SETNONCLIENTMETRICS更改滚动条宽度的系统范围设置。 请注意,它将更改系统上的所有应用程序而不仅仅是一个应用程序。 您应该将其设置为配置项,以便在需要时可以将宽度更改回默认值。

  [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; ///  ///  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  including the terminating '\0'. /// That works out to 31 characters. ///  [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; ///  /// Since  is a struct instead of a class, /// we don't have to do any special marshalling here. Much /// simpler this way. ///  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; 

然后,您可以使用此代码查看滚动条宽度的当前值

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

然后,您可以使用此代码更改滚动条的大小…

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

您只能通过创建自定义CLB控件并覆盖OnPaint事件来实现。

编辑:好的,仍然非常基础,但CodeProject上的这篇文章可能会帮助你: http : //www.codeproject.com/KB/miscctrl/cutebutton.aspx

编辑2:您可能会喜欢以下自定义滚动条示例: http : //www.codeproject.com/KB/miscctrl/MotifScrollBars.aspx