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