Можно ли программно запускать «фальшивую» прокрутку в WinForms? - PullRequest
3 голосов
/ 04 мая 2009

Можно ли программно запускать «фальшивую» прокрутку в WinForms?

Сценарий:
Форма с различными рисунками сделана с помощью System.Drawing (и без полос прокрутки).

Что бы я хотел:

  1. Прогрессивно сообщать форму, которую пользователь прокрутил на 10 пикселей влево.
  2. Форма перемещает существующий чертеж на 10 пикселей влево.
  3. Форма генерирует событие рисования с помощью ClipRectangle, содержащего только 10 правых пикселей, которые теперь пусты.

Возможно ли это, или мне нужно справиться с этим самостоятельно?

Ответы [ 4 ]

3 голосов
/ 04 мая 2009

Вы можете добавить панель к форме, которая больше, чем форма. Оставьте полосу прокрутки выключенной и прокрутите панель вручную, установив свойства значений свойств панели VerticalScroll и HorizontalScroll.

Затем добавьте свой рисунок на панель вместо формы.

 this.panel1.VerticalScroll.Value = 50;
this.panel1.HorizontalScroll.Value = 100;
1 голос
/ 04 мая 2009

Вы можете попробовать поместить чертеж в отдельный контейнер, а затем просто переместить местоположение контейнера в другое место вне основной формы. .location = -10,0 например. Это создаст иллюзию, что оно сдвинуло определенное количество пикселей с экрана. Вы также всегда можете запустить собственное событие перерисовки, если изменение местоположения не удастся сделать это. Кроме этого, вы всегда можете нарисовать все.

1 голос
/ 04 мая 2009

Поскольку вы используете System.Drawing, вам нужно указать методам рисования (OnPaint () или где бы вы ни рисовали), чтобы начать рисование со смещением x на -10 пикселей. Все, что вы рисуете, будет компенсировано этой суммой.

Смещение всего рисунка влево на 10 пикселей может привести к аннулированию всей области экрана, а не только 10 пикселей в правой части экрана. Есть несколько способов сделать это:

1) Установите смещение на - = 10 пикселей. Сделайте недействительным весь экран, вызвав Invalidate (). Это приведет к перерисовке всего экрана и, если вы правильно закодировали свои смещения, будет перерисовывать все на 10 пикселей больше. 2) Возьмите в память дамп того, что на экране, и сделайте из него изображение. Затем перерисуйте это изображение на 10 пикселей влево от экрана. После этого просто аннулируйте самые правые 10 пикселей.

Метод # 2, на самом деле, намного медленнее, чем метод # 1. Перерисовка экрана происходит довольно быстро, если у вас нет миллионов вещей, которые нужно рисовать.

1 голос
/ 04 мая 2009

Честно говоря, я понятия не имею, сработает ли это, но я предполагаю, что если в форме отсутствует полоса прокрутки, ее не будет.

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

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