winforms C# ListView禁用水平滚动条

inb24sb2  于 2023-06-24  发布在  C#
关注(0)|答案(6)|浏览(253)

有没有一种方法可以阻止水平滚动条在列表视图中出现?我希望垂直滚动条在需要时显示,但我希望水平滚动条永远不会显示。
我想这和Wndproc有关系吧?
谢谢

deikduxw

deikduxw1#

有一个简单得多的方法来消除较低的滚动条,并有垂直显示。它包括确保标题,如果没有标题,则行的宽度为listview.Width - 4,如果显示垂直滚动条,则显示listview.Width - Scrollbar.Width - 4;
下面的代码演示了如何:

lv.Columns[0].Width = lv.Width - 4 - SystemInformation.VerticalScrollBarWidth;
ycl3bljg

ycl3bljg2#

最好的解决方案是这里给出的公认答案:How to hide the vertical scroll bar in a .NET ListView Control in Details mode
它工作完美,你不需要一些技巧,如列宽调整。此外,您可以在创建控件时禁用滚动条。
缺点是您必须创建自己的列表视图类,该类派生自System.Windows.Forms.ListView以覆盖WndProc。但这是唯一的办法。
要禁用水平滚动条,请记住使用WS_HSCROLL而不是WS_VSCROLL(在链接的答案中使用)。WS_HSCROLL的值是0x00100000

6ss1mwsb

6ss1mwsb3#

currently accepted answer是不安全的,因为它使堆栈不平衡。对于DllImport,您应该使用以下代码:

[System.Runtime.InteropServices.DllImport("user32", CallingConvention=System.Runtime.InteropServices.CallingConvention.Winapi)]
[return: System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)]

private static extern bool ShowScrollBar(IntPtr hwnd, int wBar, [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)] bool bShow);

Andreas雷夫在他的评论中再次查看后涵盖了这一点,所以我想这里的所有格式都很好。
要使用它:

# Use one of these valued for hwnd
long SB_HORZ = 0;
long SB_VERT = 1;
long SB_BOTH = 3;

# Use the actual name of the ListView control in your code here
# Hides the specified ListView scroll bar
ShowScrollBar(listView1.Handle.ToInt64(), SB_BOTH, 0);

要强制它 * 显示 * 而不是 * 隐藏 *,只需将bShow0更改为1,因为0等于false1等于true

lskq00tm

lskq00tm4#

你可以尝试这样的东西,我曾经在一个项目中使用过,它很有效:

[DllImport ("user32")]
private static extern long ShowScrollBar (long hwnd , long wBar, long bShow);
long SB_HORZ = 0;
long SB_VERT = 1;
long SB_BOTH = 3;

private void HideHorizontalScrollBar ()
{
    ShowScrollBar(listView1.Handle.ToInt64(), SB_HORZ, 0);
}

希望能帮上忙。

n9vozmp4

n9vozmp45#

如果你想要一个列表视图,显示图标或值为水平只需要设置***对齐左***

92dk7w1h

92dk7w1h6#

我个人正在寻找非常相似的东西,但无法找到如何删除滚动条,但仍然得到鼠标滚轮的工作列表视图。我知道这并不完全涉及到最初的问题,但是如果有人偶然发现这个页面,希望删除两个滚动条,但仍然有垂直滚动功能,这里是这样做的代码!我在网上搜索了一下,找不到答案,这里问的问题非常非常相似,所以请不要恨我在这里张贴这个。不要害怕我的while(1==1)循环哈哈!此外,这是补丁工作代码从许多来源,包括我自己的,所以我不能采取充分的信贷,也不知道它的一些原始来源。只需使用此代码创建一个新的自定义控件(将命名空间更改为您想要的)。你可以改变你的design.cs文件的形式,它的和引用这个控件,而不是原来的ListView(2行代码)。确保Scrollable设置为true,但也要将ScrollOverride设置为true,否则它将作为普通的ListView。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace LancourWestbrook.Controls
{
    public partial class TPListView : ListView
    {
        [DllImport("user32.dll", EntryPoint = "GetWindowLong", CharSet = CharSet.Auto)]
        public static extern IntPtr GetWindowLong32(IntPtr hWnd, int nIndex);

        [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr", CharSet = CharSet.Auto)]
        public static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, int nIndex);

        [DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)]
        public static extern IntPtr SetWindowLongPtr32(IntPtr hWnd, int nIndex, int dwNewLong);

        [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", CharSet = CharSet.Auto)]
        public static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, int nIndex, int dwNewLong);

        const int GWL_STYLE = -16;
        const int WS_VSCROLL = 0x00200000;
        const int WS_HSCROLL = 0x00100000;
        const int WM_MOUSEWHEEL = 0x20a;
        const int WM_NCCALCSIZE = 0x83;

        public TPListView()
        {
            InitializeComponent();
        }

        public TPListView(IContainer container)
        {
            container.Add(this);
            InitializeComponent();
        }

        private int? LastItemIndexInView
        {
            get
            {
                if (this.Items == null || this.Items.Count <= 0)
                {
                    return null;
                }
                List<int> items = new List<int>();

                int topIndex = this.TopItem.Index;
                int currentIndex = topIndex;
                items.Add(topIndex);
                while (1 == 1)
                {
                    currentIndex++;
                    if (this.Items.Count - 1 < currentIndex)
                    {
                        break;
                    }
                    if (this.Items[currentIndex].Bounds.IntersectsWith(this.ClientRectangle))
                    {
                        items.Add(currentIndex);
                    }
                    else
                    {
                        break;
                    }
                }
                return currentIndex;
            }
        }

        public bool ScrollOverride { get; set; }

        protected override void WndProc(ref Message m)
        {            
            if (ScrollOverride == false)
            {
                base.WndProc(ref m);
                return;
            }
            switch (m.Msg)
            {
                case WM_MOUSEWHEEL:
                    if (this.Items == null || this.Items.Count <= 0)
                    {
                        break;
                    }
                    var zDelta = (short)HIWORD(m.WParam);
                    if (zDelta < 0)
                    {
                        //Scroll Downwards
                        int? lastItemInView = LastItemIndexInView;
                        if (lastItemInView.HasValue && this.Items.Count > lastItemInView.Value + 1)
                        {
                            this.Items[lastItemInView.Value + 1].EnsureVisible();
                        }
                        else if (this.Items.Count > 0)
                        {
                            this.Items[this.Items.Count - 1].EnsureVisible();
                        }
                    }
                    else if (zDelta > 0)
                    {
                        //Scroll Upwards
                        int topItemInView = this.TopItem.Index;
                        if (topItemInView > 0)
                        {
                            this.Items[topItemInView - 1].EnsureVisible();
                        }
                    }
                    break;
                case WM_NCCALCSIZE:
                    int style = (int)GetWindowLong(this.Handle, GWL_STYLE);
                    if ((style & WS_VSCROLL) == WS_VSCROLL)
                        SetWindowLong(this.Handle, GWL_STYLE, style & ~WS_VSCROLL);
                    if ((style & WS_HSCROLL) == WS_HSCROLL)
                        SetWindowLong(this.Handle, GWL_STYLE, style & ~WS_HSCROLL);                    
                    base.WndProc(ref m);
                    break;
                default:
                    base.WndProc(ref m);
                    break;
            }
        }

        public static int GetWindowLong(IntPtr hWnd, int nIndex)
        {
            if (IntPtr.Size == 4)
                return (int)GetWindowLong32(hWnd, nIndex);
            else
                return (int)(long)GetWindowLongPtr64(hWnd, nIndex);
        }

        public static int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong)
        {
            if (IntPtr.Size == 4)
                return (int)SetWindowLongPtr32(hWnd, nIndex, dwNewLong);
            else
                return (int)(long)SetWindowLongPtr64(hWnd, nIndex, dwNewLong);
        }

        internal static ushort HIWORD(IntPtr dwValue)
        {
            return (ushort)((((long)dwValue) >> 0x10) & 0xffff);
        }
    }
}

也许有人也可以添加代码,鼠标滚轮点击并保持水平滚动!

相关问题