Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 158 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 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. Ввожу код на сайте, пишет:

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

 

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