C# Change Control.Top с 16-битного на 32-битное Int (WinForms)

StackOverflow https://stackoverflow.com/questions/951335

  •  11-09-2019
  •  | 
  •  

Вопрос

Я работаю над программой, которая перемещает панель внутри формы.Я использую полосу прокрутки для изменения свойства панели .Top.Однако это свойство достигнет только -32768.В этом случае мне нужно, чтобы оно поднялось намного выше (или ниже o0).Могу ли я в любом случае изменить его на 32-битное целое число, чтобы оно могло достигать −2147483648?


редактировать, Возможно, если я поясню, что я пытаюсь сделать, вы не подумаете, что это повредит удобству использования.

Вчера я задал такой вопрос:Как использовать VScrollBar и HScrollBar вместе с RichTextBox?

Но поскольку я не смог найти ответ, и никто больше мне не ответил, мне пришлось подумать о другом способе прокрутки richtextbox.Поэтому моим решением было изменить размер высоты текстового поля до равного (высота шрифта текстового поля * общее количество строк).Это будет означать, что полосы прокрутки в текстовом поле отображаться не будут.Теперь я использую полосу прокрутки, чтобы переместить верхнюю позицию текстовых полей, чтобы создать эффект псевдопрокрутки.Он отлично работает, когда текстовое поле имеет около 2000 строк по высоте шрифта 13 пикселей.Но после этого он оказывается выше, чем 16-битный int.Вот почему мне нужно изменить его на 32-битный int.

Это было полезно?

Решение

Сами полосы прокрутки Windows привязаны к 16-битным значениям.Полосы прокрутки WinForm просто отражают этот предел.Вы не можете изменить его, не написав с нуля свой собственный элемент управления полосой прокрутки.

Но вам не нужно этого делать.Нет никакой физической причины иметь такое количество значений в полосе прокрутки, потому что вы не можете прокручивать ее более точно, чем количество пикселей на экране, а высота (или ширина) вашего монитора не превышает 30 000 пикселей.

Обычно стоимость вашего домена делится на соответствующее число.Обычно подойдет константа, но вы также можете использовать максимум.Затем вы используете это значение в качестве фактических индексов полосы прокрутки.

Например, предположим, что у вас есть значения в диапазоне от 0 до 1200355.Вы можете установить максимальное значение полосы прокрутки на 10000, а затем получить текущее выбранное значение как myScrollbar.Value*(10000/1200355) (или что-то подобное - у меня нет точного синтаксиса под рукой).

Да, это означает, что вы теряете некоторую точность — вы не сможете выбрать на полосе прокрутки значение, отличающееся всего на 3 единицы.Если вам действительно нужна такая точность, то полоса прокрутки — не тот инструмент.

Другие советы

В конечном счете, если у вас есть панель, размер которой должен превышать предел полосы прокрутки, вы можете умножить значение полосы прокрутки на определенный множитель.

 panel1.top = scrollbar1.value * 3;

Множитель может иметь любое значение, подходящее для ваших нужд.При этом экран размером более 30 000 пикселей довольно большой.

Кроме того, вы можете сделать значение полосы прокрутки пропорциональным максимальному диапазону необходимых значений.

areaHeight = 60000;
scrolldelta = areaHeight / scrollbar1.MaxValue;

panel1.Top = scrolldelta * scrollbar1.value; 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top