Опубликован: 13.07.2010 | Уровень: специалист | Доступ: платный
Самостоятельная работа 27:

Разработка комбинированного компонента

Динамическое создание панели представления текста

Теперь нужно создать класс DisplayPanel расширения класса панели Panel, который будет рисовать заданный текст по установленному в матрице преобразования алгоритму. Заготовка этого класса у нас уже создана.

  • Добавьте в заготовку класса DisplayPanel контсруктор по умолчанию, в котором разместите код включения свойства перерисовки панели при изменении ее размеров
// Панель отображения текста
    class DisplayPanel : Panel
    {
        // Конструктор класса
        public DisplayPanel()
        {
            // Перерисовываться самостоятельно при изменении размеров
            this.ResizeRedraw = true;
        }
    }
Листинг 19.36. Конструктор класса DisplayPanel с включенным свойством перерисовки панели
  • Добавьте к классу DisplayPanel поле ссылки на объект матрицы преобразования и переопределите унаследованную функцию OnPaint() рисования содержимого свойства Text панели, начав ввод с ключевого слова override
// Создание экземпляра матрицы преобразования текста 
        // и инициализация ее единичной матрицей 
        System.Drawing.Drawing2D.Matrix matrix =
            new System.Drawing.Drawing2D.Matrix();  // Единичная матрица
    
        // Переопределение функции прорисовки панели
        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics gr = e.Graphics;   // Извлекаем контекст устройства
            Brush brush = new SolidBrush(this.ForeColor);
    
            // Защищенно отображаем трансформированный текст
            try
            {
                gr.Transform = matrix;
                gr.DrawString(this.Text, this.Font, brush, Point.Empty);
            }
            catch (Exception ext)
            {
                gr.Transform = new Matrix();  // Сбрасываем искажения
                StringFormat strfrm = new StringFormat();
                strfrm.Alignment = strfrm.LineAlignment = StringAlignment.Center;
                gr.DrawString(ext.Message, Font, brush, ClientRectangle, strfrm);
            }
    
            //Освободили ограниченный ресурс  
            //gr.Dispose();
            brush.Dispose();
    
            base.OnPaint(e);    // Спустили предкам
        }
Листинг 19.37. Добавление в класс DisplayPanel поля ссылки на Matrix и функции прорисовки текста
  • Оберните в классе DisplayPanel поле matrix свойством доступа с именем Matrix
// Свойство доступа к матрице преобразования
        public System.Drawing.Drawing2D.Matrix Matrix
        {
            set
            {
                matrix = value;
                this.Invalidate();  // Перерисовать
            }
            // Аксессор get нам не нужен
        }
Листинг 19.38. Свойство доступа к матрице преобразования

На этом создание элемента панели отображения текста мы закончили.

Тестирование панелей управления текстом

Начнем с заготовки тестирующей формы и обеспечения механизма ее корректного вызова.

  • В панели Solution Explorer вызовите для узла Test контекстное меню и командой Add/Windows Form добавьте к проекту файл Form4.cs
  • В панели Solution Explorer переместите мышью файл Form4.cs в подпапку ChildrenForms
  • Откройте файл Start.cs в режиме View Designer и поместите на форму компонент LinkLabel с именем по умолчанию linkLabel4
  • Подпишите событие LinkClicked ссылки linkLabel4 на общий обработчик OnLinkClicked()
  • В панели Properties задайте для linkLabel4 свойство Tag=Form4 для различения связанной формы в стартовом окне Start


  • Откройте файл Start.cs в режиме View Code и откорректируйте код для запуска формы, предотвращения повторного запуска и отображения всплывающей подсказки, как мы это сделали для трех предыдущих упражнений

Заготовка формы Form4 готова для тестирования классов отображения искаженного текста.

  • Откройте файл Form4.cs в режиме View Code и заполните конструктор класса следующим кодом
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
    
namespace MyCompany.StudName
{
    public partial class Form4 : Form
    {
        // Поля для видимости в методах класса
        MatrixPanel matrixPanel;
        DisplayPanel displayPanel;
    
        // Конструктор класса
        public Form4()
        {
            InitializeComponent();
    
            TableLayoutPanel panel = new TableLayoutPanel();
            panel.Parent = this;
            panel.Dock = DockStyle.Fill;
            panel.ColumnCount = 2;
    
            matrixPanel = new MatrixPanel();
            matrixPanel.Parent = panel;
            matrixPanel.Anchor = AnchorStyles.Left | AnchorStyles.Right;
            matrixPanel.Changed += new EventHandler(matrixPanel_Changed);
    
            displayPanel = new DisplayPanel();
            displayPanel.Parent = panel;
            displayPanel.Dock = DockStyle.Fill;
            displayPanel.BackColor = Color.White;
            displayPanel.ForeColor = Color.Black;
            displayPanel.Text = "Некоторый текст";
            displayPanel.Font = new Font(FontFamily.GenericSerif, 24);
    
            this.Width = 3 * matrixPanel.Width;
            this.Height = 3 * matrixPanel.Height / 2;
        }
    
        void matrixPanel_Changed(object sender, EventArgs e)
        {
            displayPanel.Matrix = matrixPanel.Matrix;
        }
    }
}
Листинг 19.39. Код конструктора класса формы в файле Form4.cs
  • Запустите приложение и испытайте работу "Упражнения 1", его окно в запущенном состоянии имеет, примерно, такой вид


  • Продемонстрируйте преподавателю все упражнения выполненной работы


Иван Циферблат
Иван Циферблат
Россия, Таганрог, 36, 2000