gpt4 book ai didi

c# - 如何在详细信息模式下隐藏 .NET ListView 控件中的垂直滚动条

转载 作者:太空狗 更新时间:2023-10-29 18:17:14 25 4
gpt4 key购买 nike

我有一个在详细信息模式下只有一个列的 ListView 控件。它位于一种只能与键盘一起使用的表单上,主要使用向上/向下箭头进行滚动和输入以进行选择。所以我真的不需要滚动条,只是希望它们不显示出来以获得更简洁的外观。但是,当我将 ListView.Scrollable 属性设置为 false 时,我仍然可以上下移动所选项目,但是一旦它移动到当前不在 View 中的项目,列表就不会移动以显示该项目。我试过使用 EnsureVisible 以编程方式滚动列表,但在此模式下它什么都不做。

有什么方法可以手动上下移动列表来滚动,但没有滚动条?

最佳答案

这并不容易,但可以做到。如果您尝试通过 ShowScrollBar 隐藏滚动条,ListView 将简单地将其再次放回去。所以你必须做一些更狡猾的事情。

您必须拦截 WM_NCCALCSIZE 消息,并在其中关闭垂直滚动样式。每当 ListView 试图再次打开它时,您将在此处理程序中再次将其关闭。

public class ListViewWithoutScrollBar : ListView
{
protected override void WndProc(ref Message m) {
switch (m.Msg) {
case 0x83: // WM_NCCALCSIZE
int style = (int)GetWindowLong(this.Handle, GWL_STYLE);
if ((style & WS_VSCROLL) == WS_VSCROLL)
SetWindowLong(this.Handle, GWL_STYLE, style & ~WS_VSCROLL);
base.WndProc(ref m);
break;
default:
base.WndProc(ref m);
break;
}
}
const int GWL_STYLE = -16;
const int WS_VSCROLL = 0x00200000;

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

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

这将为您提供一个没有滚动条的 ListView,当您使用箭头键更改选择时,它仍然会滚动。

关于c# - 如何在详细信息模式下隐藏 .NET ListView 控件中的垂直滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2488622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com