using System; using Cairo; using Gdk; using Gtk; class Area : DrawingArea { // визначення найменшого елемента послідовності // (використано при заокругленні кутів) static double min(params double[] arr) { int minp = 0; for (int i = 1; i < arr.Length; i++) if (arr[i] < arr[minp]) minp = i; return arr[minp]; } // створення контура прямокутника із заокругленими кутами static void DrawRoundedRectangle(Cairo.Context gr, double x, double y, double w, double h, double r) { gr.Save(); if ((r > h / 2) || (r > w / 2)) r = min(h / 2, w / 2); gr.MoveTo(x, y + r); gr.Arc(x + r, y + r, r, Math.PI, -Math.PI / 2); gr.LineTo(x + w - r, y); gr.Arc(x + w - r, y + r, r, -Math.PI / 2, 0); gr.LineTo(x + w, y + h - r); gr.Arc(x + w - r, y + h - r, r, 0, Math.PI / 2); gr.LineTo(x + r, y + h); gr.Arc(x + r, y + h - r, r, Math.PI / 2, Math.PI); gr.ClosePath(); gr.Restore(); } // створення контура прямокутника із заокругленими кутами і сторонами // за допомогою кривих Безьє static void DrawCurvedRectangle(Cairo.Context gr, double x, double y, double w, double h) { gr.Save(); gr.MoveTo(x, y + h / 2); gr.CurveTo(x, y, x, y, x + w / 2, y); gr.CurveTo(x + w, y, x + w, y, x + w, y + h / 2); gr.CurveTo(x + w, y + h, x + w, y + h, x + w / 2, y + h); gr.CurveTo(x, y + h, x, y + h, x, y + h / 2); gr.Restore(); } protected override bool OnDrawn(Context g) // малювання { DrawRoundedRectangle(g, 10, 10, 100, 200, 40); DrawCurvedRectangle(g, 130, 20, 350, 190); g.SetSourceColor(new Cairo.Color(0, 1, 0, 1)); g.FillPreserve(); g.SetSourceColor(new Cairo.Color(0, 0, 1, 0.5)); g.LineWidth = 15; g.Stroke(); return true; } } class OwnWindow : Gtk.Window // клас вікна застосунку { public OwnWindow() : base("Заокруглення сторін і кутів прямокутника") { Resize(500, 230); Add(new Area()); // додавання області малювання } protected override bool OnDeleteEvent(Event e) { Application.Quit(); return true; } } class Example { static void Main() { Application.Init(); OwnWindow w = new OwnWindow(); w.ShowAll(); Application.Run(); } }