///height - Высота
///startAngle - Значение начального угла
///endAngle - Значение конечного угла
///</summary>
private void DrawPie(Graphics g, Pen pen, int x, int y,
int width, int height, double startAngle, double endAngle) {
double[] xAngle = new double[12];
double[] yAngle = new double[12];
double angleIncrement = (endAngle - startAngle) / 10;
double angle = startAngle;
for (int i = 0; i <= 10; i++) {
xAngle[i] = x + (Math.Cos(angle * (Math.PI / 180)) * (width /2));
yAngle[i] = y + (Math.Sin(angle * (Math.PI / 180)) * (height / 2));
angle += angleIncrement;
}
xAngle[11] = x + (Math.Cos(endAngle * (Math.PI / 180)) * (width / 2));
yAngle[11] = y + (Math.Sin(endAngle * (Math.PI / 180)) * (height /2));
Point[] anglePoints = {
new Point(x, y),
new Point((int)xAngle[0], (int)yAngle[0]),
new Point((int)xAngle[1], (int)yAngle[1]),
new Point((int)xAngle[2], (int)yAngle[2]),
new Point((int)xAngle[3], (int)yAngle[3]),
new Point((int)xAngle[4], (int)yAngle[4]),
new Point((int)xAngle[5], (int)yAngle[5]),
new Point((int)xAngle[6], (int)yAngle[6]),
new Point((int)xAngle[7], (int)yAngle[7]),
new Point((int)xAngle[8], (int)yAngle[8]),
new Point((int)xAngle[9], (int)yAngle[9]),
new Point((int)xAngle[10], (int)yAngle[10]),
new Point((int)xAngle[11], (int)yAngle[11])
};
g.DrawPolygon(pen, anglePoints);
}
private void Form1_Paint(object sender, PaintEventArgs e) {
// Выводим несколько секторов на экран
DrawPie(e.Graphics, new Pen(Color.Red), 130, 165, 100, 100, 0, 45);
FillPie(e.Graphics, new SolidBrush(Color.Green),
120, 160, 100, 100, 46, 90);
FillPie(e.Graphics, new SolidBrush(Color.Yellow),
120, 160, 100, 100, 91, 120);
FillPie(e.Graphics, new SolidBrush(Color.Blue),
120, 160, 100, 100, 121, 260);
FillPie(e.Graphics, new SolidBrush(Color.Red),
120, 160, 100, 100, 261, 360);
}
Результат работы этой программы показан на рис. 6.2.
Рис. 6.2. Создание секторов
Создание фонового рисунка для формы
К сожалению, .NET Compact Framework не поддерживает свойство BackgroundImage
, которое создает фоновый рисунок для формы. Но каждый программист может восполнить данный пробел, переопределяя метод OnPaint
.
Нужно создать новый проект и разместить на форме какой-нибудь элемент управления, например кнопку. Кнопка не будет выполнять никаких функций. Она потребуется лишь для демонстрации технологии. Также надо добавить в проект изображение, которое будет использоваться в качестве фона для формы. В нашем примере картинка будет внедрена в программу как ресурс, хотя можно загрузить ее из обычного графического файла. Чтобы все работало так, как запланировано, необходимо переопределить метод OnPaint()
. Новый код метода приведен в листинге 6.16.
protected override void OnPaint(PaintEventArgs e) {
// получим картинку из ресурсов Bitmap
backgroundImage = new Bitmap(Assembly.GetExecutingAssembly().
GetManifestResourceStream('BackgroundImageCS.sochicat.jpg'));
e.Graphics.DrawImage(backgroundImage, this.ClientRectangle,
new Rectangle(0, 0, backgroundImage.Width, backgroundImage.Height),
GraphicsUnit.Pixel);
}
После запуска программы можно будет увидеть, что форма имеет фоновый рисунок, а кнопка расположена поверх фона (рис. 6.3).
Рис. 6.3. Заполнение фона формы своим рисунком
Копирование рисунка
Библиотека .NET Compact Framework 1.0 не поддерживает метод System.Drawing.Image.Clone
, позволяющий создать точную копию картинки. Это ограничение легко обходится с помощью создания собственных методов. Кроме того, можно расширить возможности метода и добавить функциональность, позволяющую копировать часть картинки. Соответствующий код приведен в листинге 6.17.
// Копируем всю картинку
protected Bitmap CopyBitmap(Bitmap source) {
return new Bitmap(source);
}
// Копируем часть картинки
protected Bitmap CopyBitmap(Bitmap source, Rectangle part) {