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; using System.Drawing.Drawing2D; namespace gdi_ { /// /// GDI-demo, joka esittelee sekalaisia GDI+-kirjaston ominaisuuksia /// public partial class FormGDI : Form { Image kuva; List bars; List koords = new List(); int max = 300; int bar_height = 50; int bar_margin = 5; int bar_koord = 0; int angle = 0; Bitmap uusikuva; Pen kyna; Brush pensseli; Font kirjasin; public FormGDI() { InitializeComponent(); bars = new List(); // tarvitaan, että saadaan koko piirros mahtumaan this.AutoScrollMinSize = new Size(250, 400); kuva = Image.FromFile("bike.png"); // virheenkäsittely puuttuu... // kuva pitää hävittää kutsumalla kuva.dispose() sitten kun kuvaa ei enää tarvita for (int i = 0; i < 16; i++) { Rasterbar.rasterbar bar = new Rasterbar.rasterbar(); bar.Left = 0; // bar.Top = 1*i*(bar_height+bar_margin); bar.Height = bar_height; bar.AutoSize = true; bar.loppuvari = Color.FromArgb(255, 255, 0); bar.alkuvari = Color.FromArgb(50, 50, 0); Controls.Add(bar); bars.Add(bar); } FormGDI_Resize(this, null); kyna = new Pen(Color.FromArgb(255, 128, 128)); pensseli = new System.Drawing.Drawing2D.LinearGradientBrush(new Point(0, 0), new Point(0, 200), Color.FromArgb(0, 0, 0), Color.FromArgb(255, 0, 0)); kirjasin = new Font("Verdana", bar_koord + 10, FontStyle.Bold | FontStyle.Underline); timerAnim_Tick(this, null); timerAnim.Enabled = true; } protected override void OnPaint(PaintEventArgs e) { // tarkistetaan osuuko oma piirtely päivitettävälle alueelle. Jos osuu niin piirretään uusiksi if (e.ClipRectangle.Top < 400 || e.ClipRectangle.Left < 200) { Graphics canvas = e.Graphics; // korjataan scrollbarien aiheuttama koordinaattiongelma canvas.TranslateTransform(this.AutoScrollPosition.X, this.AutoScrollPosition.Y); canvas.DrawEllipse(kyna, 0, 0, 200, 200); // canvas.DrawEllipse(System.Drawing.Pens.Bisque, 0, 0, 200, 200); // Brush pensseli = new System.Drawing.Drawing2D.HatchBrush(System.Drawing.Drawing2D.HatchStyle.OutlinedDiamond, // Color.Chocolate, Color.DarkKhaki); canvas.FillEllipse(pensseli, 0, 200, 200, 200); canvas.DrawImageUnscaled(uusikuva, 0,100); kirjasin = new Font("Verdana", bar_koord + 10, FontStyle.Bold | FontStyle.Underline); canvas.DrawString("Malliteksti GDIn drawstring-metodista", kirjasin, System.Drawing.Brushes.AntiqueWhite, new Point(0, 50)); // canvas.FillEllipse(System.Drawing.Brushes.Beige, 0, 200, 200, 200); kirjasin.Dispose(); } // base.OnPaint(e); } private void timerAnim_Tick(object sender, EventArgs e) { if (++bar_koord > max) bar_koord = 0; int p = bar_koord; foreach (Rasterbar.rasterbar bar in bars) { // if (p >= max) p = 0; bar.Top = koords[p]; p += bar_margin; if (p >= max) { p = p-max; } } uusikuva = new Bitmap(kuva.Width, kuva.Height); Graphics k = Graphics.FromImage(uusikuva); // asetetaan keskipiste käännöspisteeksi k.TranslateTransform((float)kuva.Width / 2, (float)kuva.Height / 2); // käännetään kuvaa k.RotateTransform(angle); if (++angle > 360) angle = 0; // palautetaan kuva keskelle k.TranslateTransform(-(float)kuva.Width / 2, -(float)kuva.Height / 2); // piirretään edellisillä asetuksilla kuva k.DrawImage(kuva, new Point(0, 0)); Invalidate(); } private void FormGDI_Resize(object sender, EventArgs e) { koords.Clear(); max = 300; for (int i = 0; i < max || koords[0] != koords[koords.Count - 1]; i++) { koords.Add((int)(Math.Sin(1.0 * i / 20.0) * (this.ClientRectangle.Height / 2) + this.ClientSize.Height / 2 - bar_height)); } max = koords.Count - 1; Invalidate(); } } }