Часть 1
96
// выведем текст еще раз
e.Graphics.DrawString(header, hFont,
System.Drawing.Brushes.DarkGreen, x, y + h);
}
// изменился размер окна
private void Form1_Resize(object sender, EventArgs e)
{
// сообщить системе о необходимости
// перерисовать окно. В результате будет
// сгенерировано событие Paint.
this.Refresh();
}
}
}
Диаграмма
В окне программы Диаграмма (рис. 1.22) отображается диа-
грамма изменения курса доллара. Данные загружаются из тексто-
вого файла usd.dat, где каждое число в отдельной строке.
Рис. 1.22. Окно программы Диаграмма
Примеры и задачи
97
Программа (листинг 1.20) демонстрирует использование методов
DrawString
,
DrawRectangle
,
FillRectangle
, а также работу с
массивами и чтение данных из файла.
Листинг 1.20. Модуль формы программы Диаграмма
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Diagram
{
public partial class Form1 : Form
{
// данные
private double[] d;
// строит график
private void drawDiagram(object sender,
PaintEventArgs e)
{
// графическая поверхность
Graphics g = e.Graphics;
// шрифт подписей данных
Font dFont = new Font("Tahoma", 9);
// ** заголовок **
// шрифт заголовка
Часть 1
98
Font hFont = new Font("Tahoma", 14,
FontStyle.Regular);
string header = "Изменение курса доллара";
// ширина области отображения текста
int wh =(int)g.MeasureString(header,
hFont).Width;
int x = (this.ClientSize.Width - wh) / 2;
g.DrawString(header,
hFont, System.Drawing.Brushes.DarkGreen,
x, 5);
/*
* область построения диаграммы:
* - отступ сверху - 100;
* - отступ снизу - 20;
* - отступ слева - 20;
* - отступ справа - 20.
*
* ClientSize - размер внутренней области окна
*
* график строим в отклонениях от минимального
* значения ряда данных, так, чтобы он занимал
* всю область построения
*/
double max = d[0]; // максимальный эл-т массива
double min = d[0]; // минимальный эл-т массива
for (int i = 1; i < d.Length; i++)
{
if (d[i] > max) max = d[i];
Примеры и задачи
99
if (d[i] < min) min = d[i];
}
// рисуем диаграмму
int x1, y1; // координаты левого верхнего
// угла столбика
int w, h; // размер столбца
// ширина столбиков диаграммы
// 5 - расстояние между столбиками
// d.Length - кол-во рядов данных (столбиков)
w = (ClientSize.Width - 40 - 5 * (d.Length - 1))
/ d.Length;
x1 = 20;
for (int i = 0; i < d.Length; i++)
{
y1 = this.ClientSize.Height - 20 -
(int)((this.ClientSize.Height - 100) *
(d[i] - min) / (max - min));
// подпись численного значения первой точки
g.DrawString(Convert.ToString(d[i]),
dFont, System.Drawing.Brushes.Black,
x1, y1 - 20);
// рисуем столбик
h = ClientSize.Height - y1 - 20 + 1;
// зеленый прямоугольник
g.FillRectangle(Brushes.ForestGreen,
x1, y1, w, h);
// контур прямоугольника
g.DrawRectangle(System.Drawing.Pens.Black,
x1, y1, w, h);
Do'stlaringiz bilan baham: |