| Китай |
Опубликован: 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 и функции прорисовки текста
// Свойство доступа к матрице преобразования
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 готова для тестирования классов отображения искаженного текста.
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", его окно в
запущенном состоянии имеет, примерно, такой вид
-
Продемонстрируйте
преподавателю все упражнения выполненной работы



