- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - Эндрю Троелсен
Шрифт:
Интервал:
Закладка:
Для примера рассмотрите следующий обработчик события Paint, выводящий на печать ряд характеристик семейства шрифтов Verdana.
private void MainForm_Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;
FontFamily myFamily = new FontFamily("Verdana");
Font myFont = new Font(myFamily, 12);
int у = 0;
int fontHeight = myFont.Height;
// Отображение единицы измерения для членов FontFamily.
this.Text = "Единица измерения: GraphicsUnit." + myFont.Unit;
g.DrawString("Семейство Verdana.", myFont, Brushes.Blue, 10, y);
у += 20;
// Характеристики связей нашего семейства.…
g.DrawString("Надстрочные для Verdana Bold: " + myFamily.GetCellAscent(FontStyle.Bold), myFont, Brushes.Black, 10, у + fontHeight);
у += 20;
g.DrawString("Подстрочные для Verdana Bold: " + myFamily.GetCellDescent(FontStyle.Bold), myFont, Brushes.Black, 10, у + fontHeight);
у += 20;
g.DrawString("Интерлиньяж для Verdana Bold: " + myFamily.GetLineSpacing(FontStyle.Bold), myFont, Brushes.Black, 10, у + fontHeight);
у += 20;
g.DrawString("Высота для Verdana Bold: " + myFamily.GetEmHeight(FontStyle.Bold), myFont, Brushes.Black, 10, у + fontHeight);
у += 20;
}
На рис. 20.8 показан результат.
Рис. 20.8. Сбор статистики для семейства шрифтов Verdana
Заметьте, что указанные члены типа Font Family возвращают значения с использованием в качестве единицы измерения GraphicsUnit.Point (а не Pixel), что соответствует 1/72 дюйма. Вы можете преобразовать эти значения в те единицы, которые вам подходят лучше всего.
Исходный код. Проект FontFamilyApp размещен в подкаталоге, соответствующем главе 20.
Работа с гарнитурами и размерами шрифтов
Давайте теперь построим более сложное приложение. Позволяющее пользователю манипулировать объектом Font, поддерживаемым формой. Это приложение предоставит пользователю возможность указать гарнитуру шрифта, используя встроенный набор гарнитур, доступный путем выбора Сервис→Гарнитура из меню. Пользователю также будет позволено косвенно управлять размером объекта Font с помощью объекта Timer Windows Forms. Если пользователь активизирует Timer, выбрав из меню Сервис→Рост?, то размер объекта Font начнет увеличиваться (до максимального верхнего предела) через регулярные интервалы времени. При этом отображаемый текст будет постепенно увеличиваться, что обеспечит анимационный эффект "живого текста". Наконец, третий элемент меню Сервис будет называтъся Список шрифтов и показывать список всех шрифтов, установленных на машине конечного пользователя. На рис. 20.9 демонстрируется логика меню, о котором идет речь.
Рис. 20.9. Меню проекта FontApp
Чтобы начать реализацию приложения, добавьте в форму член Timer (с именем swellTimer), строку (strFontFace) для представления текущего названия гарнитуры шрифта и целое число (swellValue) для представления величины корректировки для размера шрифта. В окне проектирования формы сконфигурируйте Timer так, чтобы он генерировал событие Tick каждые 100 миллисекунд.
public partial class MainForm: Form {
private Timer swellTimer = new Timer();
private int swellValue;
private string strFontFace = "WingDings";
public MainForm() {
InitializeComponent();
BackColor = Color.Honeydew;
CenterToScreen();
// Конфигурация таймера.
swellTimer.Enabled = true;
swellTimer.Interval = 100;
swellTimer.Tick += new EventHandler(swellTimerTick);
}
}
В обработчике события Tick увеличьте значение члена swellValue на 5. Напомним, что целое число swellValue будет добавляться к текущему размеру шрифта, чтобы обеспечивался простой эффект анимации (предполагается, что swellValue будет ограничено сверху максимальным значением 50). Чтобы не допустить мерцания, которое может происходить при перерисовке всей области клиента, при вызове Invalidate() будет обновляться только верхняя прямоугольная область формы.
private void swellTimer Tick(object sender, EventArgs e) {
// Увеличение текущего значения swellValue на 5.
swellValue += 5;
// Если значение больше или равно 50, сбросить его в ноль.
if (swellValue ›= 50) swellValue = 0;
// Обновление минимальной области для уменьшения мерцания.
Invalidate(new Rectangle(0, 0, ClientRectangle.Width, 100));
}
Теперь, когда с каждым циклом Timer обновляются верхние 100 пикселей области клиента, нужно найти что-нибудь подходящее для визуализации. В обработчике Paint формы создайте объект Font на основе выбранной пользователем гарнитуры шрифта (она выбирается с помощью соответствующего пункта меню) и текущего значения swellValue (оно задается таймером Timer), Настроив объект Font, поместите сообщение в центр соответствующего прямоугольника.
private void MainForm Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;
// Размер шрифта должен находиться в диапазоне от 12 до 62,
// в зависимости от swellValue.
Font theFont = new Font(strFontFace, 12 + swellValue);
string message = "Привет GDI+";
// Вывод сообщения в центре прямоугольника.
float windowCenter = this.DisplayRectangle.Width/2;
SizeF stringSize = g.Measure.String(message, theFont);
float startPos = windowCenter – (stringSize.Width/2);
g.Drawstring(message, theFont, new SolidBrush(Color.Blue), startPos, 10);
}
Легко догадаться, что при выборе пользователем конкретной гарнитуры шрифта обработчик Clicked для соответствующего варианта выбора из меню должен обновить строковую переменную fontFace и перерисовать область клиента, например:
private void arialToolStripMenuItem_Click(object sender, EventArgs e) {
strFontFace = "Arial";
Invalidate();
}
Обработчик Click для пункта меню Рост? будет использоваться для запуска и остановки процесса увеличения текста (т.е. для разрешения и отключения анимаций). Здесь используйте свойство Enabled объекта Timer так, как показано ниже.
private void swellToolStripMenuItem_Click(object sender, EventArgs e) {
swellTimer.Enabled = !swellTimer.Enabled;
}
Список установленных шрифтов
Давайте расширим программу так, чтобы она отображала множество установленных на машине шрифтов с помощью типов из пространства имен System.Drawing.Text. Это пространство имен содержит набор типов, которые можно использовать для получения списка шрифтов, установленных на целевой машине, и для работы с ними. Дня наших целей достаточно рассмотреть только класс InstalledFontCollection.
Когда пользователь выбирает из меню Сервис→Список шрифтов, соответствующий обработчик Clicked создает экземпляр класса InstalledFormCollection. Этот класс содержит массив FontFamily, представляющий набор всех шрифтов, установленных на целевой машине, и этот массив можно получить, используя свойство InstalledFontCollection.Families. С помощью свойства FontFamily.Name вы можете извлечь название гарнитуры шрифта (например, Times New Roman, Arial и т.п.).
Добавьте в форму приватный член-строку с именем installedFonts для хранения названия гарнитур. Программная логика обработки пункта меню Список Шрифтов создает экземпляр типа InstalledFontCollection, читает имя каждого элемента и добавляет новую гарнитуру в приватный член installedFonts.
public partial class MainForm: Form {
// Содержит список шрифтов.
private string installedFonts;
// Обработчик меню для получения списка шрифтов.
private void mnuConfigShowFonts_Clicked(object sender, EventArgs e) {
InstalledFontCollection fonts = new InstalledFontCollection();
for (int i = 0; i ‹ fonts.Families.Length; i++) installedFonts += fonts.Families[i].Name + " ";
// На этот раз нужно обновить всю область клиента,
// поскольку обновляется строка installedFonts в нижней части
// области клиента.
Invalidate();
}
}
Заключительной нашей задачей будет отображение строки installedFonts в области клиента, расположенной сразу же под той частью экрана, которая исполь-зуетcя для движущегося текста.
private void MainForm_Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;
Font theFont = new Font(strFontFace, 12 + swellValue);
string message = "Привет GDI+";
// Отображение сообщения в центре окна.
float windowCenter = this.DisplayRectangle.Width/2;
SizeF.stringSize = e.Graphics.MeasureString(message, theFont);
float startPos = windowCenter – (stringSize.Width/2);
g.DrawString(message, theFont, Brushes.Blue, startPos, 10);
// Показ списка установленных шрифтов в прямоугольнике
// под движущимся текстом.
Rectangle myRect = new Rectangle(0, 100, ClientRectangle.Width, ClientRectangle.Height);
// Закрашивание данной области формы черным цветом.
g.FillRectangle(new SolidBrush(Color.Black), myRect);
g.DrawString(installedFonts, new Font("Arial", 12), Brushes.White, myRect);
}
Напомним, что размеры "грязного прямоугольника" проецировались в верхние 100 пикселей области клиента. Поскольку обработчик Tick обновляет только часть формы, остальная ее часть при посылке события Tick не перерисовывается (чтобы оптимизировать задачу визуализации в области клиента).