Переместите Horizental ScrollBar или ListBox с помощью кнопки в winforms - PullRequest
0 голосов
/ 06 июня 2018

Я создаю приложение winforms в Visual Studio 2017, я заполняю список со списком.

Я установил для свойства multicolumn значение true.Поскольку в моем списке много строк, в нижней части окна отображается горизонтальная полоса прокрутки.

Приложение, которое я создаю, должно работать на планшете, поэтому полосу прокрутки нелегкоперемещаться с помощью пальцев.

У меня вопрос, есть ли способ управлять этой полосой прокрутки с помощью кнопки?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Да, можно управлять ожидаемым поведением с помощью Buttons.

enter image description here

Для перемещения справа налево-

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 на общую сумму.элементов в столбцах.Поэтому при каждом нажатии вы перемещаете один столбец влево или вправо.

0 голосов
/ 06 июня 2018

Вы можете отправить 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.

enter image description here

Вот декларации, которые вам нужны:

[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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...