Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 15:

Стандартные элементы управления

Полосы прокрутки и абстрактный класс ScrollBar

Некоторые элементы управления, которые наследуют класс ScrollableControl, имеют встроенные полосы прокрутки. В одних полосы прокрутки появляются автоматически в случае, когда содержимое элемента выходит за рамки отображаемой области. В других полосы прокрутки включаются в режим постоянного отображения установкой свойства AutoScroll=true.

Полосы прокрутки можно задавать элементам управления и вручную, присоединяя к ним экземпляры классов HScrollBar и VScrollBar, производных от абстрактного класса ScrollBar. Этот абстрактный класс содержит все необходимое для горизонтальной и вертикальной полос прокрутки.

Визуальное представление полосы прокрутки соответствует ее внутреннему состоянию, определяемому некоторой последовательностью целых чисел и позиционированием внутри этой последовательности. Основные характеристики этого ряда целых чисел задаются свойствами

  • Minimum - содержит нижнюю границу целых чисел скролируемого диапазона (по умолчанию равно 0)
  • Maximum - содержит верхнюю границу ряда целых чисел, определяющих скролируемый диапазон (по умолчанию равно 100)
  • SmallChange - определяет шаг изменение свойства Value (или перемещения бегунка, ползунка, указателя полосы прокрутки ) относительно внутреннего числового диапазона, когда пользователь щелкает на стрелках, расположенных по краям полосы прокрутки (по умолчанию равен 1)
  • LargeChange - определяет большой шаг перемещения бегунка (изменение свойства Value ) при щелчке пользователем в области между стрелкой и указателем (по умолчанию равен 10) . Эта величина соответствует доле отображаемой области относительно всего числового ряда и определяет размер бегунка на полосе прокрутки, тем самым отражая пропорцию видимой части ко всему документу
  • Value - отображает числовое значение внутри скролируемого диапазона, которое представляет текущую позицию бегунка на полосе прокрутки. Оно соответствует верхней границе бегунка при вертикальном расположении, которая, в свою очередь, связана с верхней границей отображаемой области. Фактически Value всегда находится в диапазоне от Minimum до Maximum - LargeChange + 1.

Обычно LargeChange приравнивают к соответствующему размеру отображаемой области документа. Если размер клиентской области меняется в свободно плавающем окне, то величину LargeChange пересчитывают так, чтобы она соответствовала новому размеру видимой области документа. При прокрутке документа операционная система копирует содержимое экрана из одного положения клиентской области в другое, используя при этом упакованные в классы ScrollableControl и ScrollBar системные функции Win32 API: ScrollWindow, ScrollWindowEx, ScrollDC. Каждый раз для прорисовки нового состояния клиентской области при прокрутке автоматически вызывается метод OnPaint().

В классе ScrollBar имеются всего два события: ValueChanged и Scroll. Событие ValueChanged генерируется при изменении значения Value либо программно, либо действиями пользователя. Однако, если значение Value достигло границы числового диапазона, генерация события ValueChanged прекращается. Ниже приведен пример, в котором иллюстрируется обработка события ValueChanged

using System;
using System.Drawing;
using System.Windows.Forms;
    
namespace Test
{
    // Класс приложения
    class MyClass : Form
    {
        // Создаем вертикальную полосу прокрутки, которую
        // потом настроим и будем отслеживать
        VScrollBar vScroll = new VScrollBar();
    
        public MyClass()    // Конструктор
        {
            // Текст заголовка окна
            this.Text = "Полоса прокрутки";
            // Привязываем к родителю-форме
            vScroll.Parent = this;
            // Устанавливаем параметры привязки полосы прокрутки
            vScroll.Height = this.ClientSize.Height;
            vScroll.Location = new Point(this.ClientSize.Width - 
					vScroll.Width, 0);
            // Регистрируем событие
            vScroll.ValueChanged += new EventHandler(vScroll_ValueChanged);
        }
    
        // На случай изменения размеров формы
        protected override void OnSizeChanged(EventArgs e)
        {
            // Пересчитываем параметры привязки полосы прокрутки
            vScroll.Height = this.ClientSize.Height;
            vScroll.Location = new Point(this.ClientSize.Width - 
					vScroll.Width, 0);
            // Инициируем перерисовку
            this.Invalidate();
        }
    
        // Отслеживает действия с полосой прокрутки
        void vScroll_ValueChanged(object sender, EventArgs e)
        {
            // Инициируем перерисовку
            this.Invalidate();
        }
    
        // Перегружаем метод OnPaint(), унаследованный от класса Control
        protected override void OnPaint(PaintEventArgs e)
        {
            // Создаем и настраиваем точку привязки текстового блока
            StringFormat strfrm = new StringFormat();
            strfrm.Alignment = StringAlignment.Center;// Центр по горизонтали
            strfrm.LineAlignment = StringAlignment.Near;
    
            // Точка привязки на форме
            PointF point = new PointF(this.ClientSize.Width / 2,
                vScroll.Value * this.ClientSize.Height / vScroll.Maximum);
    
            // Рисуем текст
            Graphics gr = e.Graphics;// Контекст экрана
            gr.DrawString("Value=" + 
		vScroll.Value.ToString(),  // Выводимый текст
                new Font("Arial", 14, FontStyle.Bold),  
		// Устанавливаем шрифт
                new SolidBrush(Color.Red),  // Цвет шрифта
                point, // Точка привязки на форме
                strfrm); // Передаем точку привязки текстового блока
        }
    }
    
    // Запуск
    class Program
    {
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new MyClass());
        }
    }
}
Листинг 15.2 . Применение вертикальной полосы прокрутки
Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?

Денис Пашков
Денис Пашков
Россия
Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974