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

发布于 2024-08-12 09:55:20 字数 117 浏览 9 评论 0原文

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

如何更改滚动条宽度?

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

I have a CheckListBox on my form but I want to make the scrollbar wider as users are using touch screens not a mouse.

How can I change the scroll bar width?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

红玫瑰 2024-08-19 09:55:20

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

这来自以下页面: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);
      }
   }
}

To change the physical size of the scrollbar, see this.

This came from the following page: Horizontal Scrollbar in ListBox. I modified 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);
      }
   }
}
不一样的天空 2024-08-19 09:55:20

以下代码使用 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;

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

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

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

The following code makes use of SPI_SETNONCLIENTMETRICS to change the system wide setting for the scrollbar width. NOTE that it will change all applications on the system not just a single one. You should probably make this a configuration item so that you can change the width back to a 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;

You can then use this code to see the current value for the scrollbar width

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

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

You can then use this code to change the size of the scrollbar...

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

metrics.iScrollWidth = 17;

SystemParametersInfo(SPI_SETNONCLIENTMETRICS, metrics.cbSize, ref metrics, SPIF_SENDCHANGE);
不回头走下去 2024-08-19 09:55:20

您只能通过创建自定义 CLB 控件并重写 OnPaint 事件来做到这一点。

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

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

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文