我的表单上有一个CheckListBox,但我想让滚动条更宽,因为用户使用的是触摸屏而不是鼠标。
如何更改滚动条宽度?
编辑:我说的是垂直滚动条的宽度
答案 0 :(得分:3)
以下代码使用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);
答案 1 :(得分:3)
要更改滚动条的物理尺寸,请参阅this。
这来自以下页面:Horizontal Scrollbar in 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);
}
}
}
答案 2 :(得分:0)
您只能通过创建自定义CLB控件并覆盖OnPaint事件来实现。
编辑:好的,仍然非常基础,但是有关CodeProject的这篇文章可能对您有所帮助:http://www.codeproject.com/KB/miscctrl/cutebutton.aspx
编辑2:您可能会喜欢以下自定义滚动条示例:http://www.codeproject.com/KB/miscctrl/MotifScrollBars.aspx