【问题标题】:Move Horizental ScrollBar or a ListBox with a button in winforms在winforms中使用按钮移动水平滚动条或列表框
【发布时间】:2018-11-16 06:24:44
【问题描述】:

我正在 Visual Studio 2017 中创建一个 winforms 应用程序,我正在使用列表填充列表框。

我将多列属性设置为 true。由于我的列表中有很多字符串,因此框的底部会出现一个水平滚动条。

我正在创建的应用程序应该在平板电脑上运行,因此滚动条不容易用手指导航。

我的问题是,有没有办法可以使用按钮来控制这个滚动条?

【问题讨论】:

  • 您尝试设置Topindex - 要查找最后一个可见索引,您可以使用IndexFromPoint(lb.Width - w, lb.Height - h)wh 大到不会碰到滚动条.. int h = SystemInformation.HorizontalScrollBarHeight - 18;
  • 在“lb.Width - w”中,我应该将 w 分配给什么?
  • 只是一个很小的数字,足以比边界大;试试 10 个!

标签: c# winforms listbox horizontal-scrolling


【解决方案1】:

是的,可以在Buttons 的帮助下控制您期望的行为。

从右向左移动 -

private void btnLeft_Click(object sender, EventArgs e)
{
    int visibleItemsInColumn = listBox1.ClientSize.Height / listBox1.ItemHeight; //No of items in each column. In this case - 5
    listBox1.TopIndex = listBox1.TopIndex - visibleItemsInColumn;

}

从左到右移动 -

private void btnRight_Click(object sender, EventArgs e)
{
    int visibleItemsInColumn = listBox1.ClientSize.Height / listBox1.ItemHeight;
    listBox1.TopIndex = listBox1.TopIndex + visibleItemsInColumn;
}

它实际上做的是每次你点击按钮,它 通过每列的总元素增加/减少 TopIndex。所以 每次点击时,您都会向左或向右移动一列。

【讨论】:

  • @OmarAlMadani 不幸的是,您只能选择一个答案作为接受。但是,一旦您获得足够的声誉 (15),您就可以对有用的帖子进行投票,包括已接受的答案。
【解决方案2】:

您可以发送WM_HSCROLL 消息到ListBox 以滚动它。为此,您应该首先通过调用GetScrollInfo 方法获取滚动位置。

以下代码,将ListBox,向右滚动1列:

var info = new SCROLLINFO() { fMask = ScrollInfoMask.SIF_ALL };
GetScrollInfo(listBox1.Handle, SBOrientation.SB_HORZ, ref info);
var wparam = ((uint)(info.nPos + 1) << 16) | (SB_THUMBPOSITION & 0xffff);
SendMessage(listBox1.Handle, WM_HSCROLL, wparam, 0);

要向左滚动一列,请使用info.nPos - 1

这里是你需要的声明:

[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg,
    uint wParam, uint lParam);

[StructLayout(LayoutKind.Sequential)]
struct SCROLLINFO {
    public uint cbSize;
    public ScrollInfoMask fMask;
    public int nMin;
    public int nMax;
    public uint nPage;
    public int nPos;
    public int nTrackPos;
}

public enum ScrollInfoMask : uint {
    SIF_RANGE = 0x1,
    SIF_PAGE = 0x2,
    SIF_POS = 0x4,
    SIF_DISABLENOSCROLL = 0x8,
    SIF_TRACKPOS = 0x10,
    SIF_ALL = (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS),
}

[DllImport("user32.dll")]
private static extern bool GetScrollInfo(IntPtr hwnd, 
    SBOrientation fnBar, ref SCROLLINFO lpsi);

public enum SBOrientation : int {
    SB_HORZ = 0x0,
    SB_VERT = 0x1,
}

const uint WM_HSCROLL = 0x0114;
const uint SB_THUMBPOSITION = 4;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    相关资源
    最近更新 更多