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();
}
}
}