http://kmlinux/~culik/wiki
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
namespace Drawing
{
public partial class MainWindow : Form
{
private Pen pen;
private Brush brush;
private Color basic1;
private Color basic2;
private int cnt = 1;
public MainWindow()
{
InitializeComponent();
pictureBox_SizeChanged(null, null);
comboBox.SelectedIndex = 0;
Panel p2 = newColorPanel(Color.Red);
Panel p3 = newColorPanel(Color.Green);
pen = new Pen (colorPanel.BackColor);
basic1 = p2.BackColor;
basic2 = basic1;
updateBrush ();
}
private Panel newColorPanel (Color c)
{
Panel p = new Panel();
// p.Parent = toolPanel;
toolPanel.Controls.Add (p);
cnt ++;
p.Left = colorPanel.Left + (cnt - 1) * (colorPanel.Width + colorPanel.Left);
p.Top = colorPanel.Top;
p.Width = colorPanel.Width;
p.Height = colorPanel.Height;
p.BackColor = c;
p.MouseDown += this.colorPanel_MouseDown;
return p;
}
private void newColorMenu_Click(object sender, EventArgs e)
{
newColorPanel (Color.Yellow);
}
private void xcoord_ValueChanged(object sender, EventArgs e)
{
updateBrush();
}
private void updateBrush()
{
int xc = (int) xcoord.Value;
int yc = (int) ycoord.Value;
// using System.Drawing.Drawing2D;
try
{
brush = new LinearGradientBrush
(new Point(0, 0),
new Point(xc, yc),
basic1,
basic2);
}
catch (Exception e)
{
brush = new SolidBrush (basic1);
}
}
private void colorPanel_MouseDown(object sender, MouseEventArgs e)
{
Panel panel = (Panel) sender;
Color color = panel.BackColor;
if (e.Button == MouseButtons.Left)
{
if (Control.ModifierKeys == Keys.Shift)
{
basic1 = color;
updateBrush();
}
else if (Control.ModifierKeys == Keys.Control)
{
basic2 = color;
updateBrush();
}
else
{
pen = new Pen(color);
}
}
else if (e.Button == MouseButtons.Right)
{
if (Control.ModifierKeys == Keys.Shift)
basic1 = color;
else if (Control.ModifierKeys == Keys.Control)
basic2 = color;
else
basic1 = basic2 = color;
updateBrush();
}
else if (e.Button == MouseButtons.Middle)
{
colorDialog.Color = color;
if (colorDialog.ShowDialog() == DialogResult.OK)
{
color = colorDialog.Color;
panel.BackColor = color;
pen = new Pen(color);
}
}
}
private void pictureBox_SizeChanged (object sender, EventArgs e)
{
int w = pictureBox.Width;
int h = pictureBox.Height;
if (pictureBox.Image != null)
{
if (w < pictureBox.Image.Width)
w = pictureBox.Image.Width;
if (h < pictureBox.Image.Height)
h = pictureBox.Image.Height;
}
Bitmap bitmap = new Bitmap (w, h);
Graphics g = Graphics.FromImage (bitmap);
Brush b = new SolidBrush (Color.White);
g.FillRectangle (b, 0, 0, w, h);
if (pictureBox.Image != null)
g.DrawImage (pictureBox.Image, 0, 0);
pictureBox.Image = bitmap;
}
private int X0, Y0;
private bool down = false;
private Bitmap save = null;
private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
X0 = e.X;
Y0 = e.Y;
down = true;
save = new Bitmap (pictureBox.Image);
}
private void pictureBox_MouseMove(object sender, MouseEventArgs e)
{
if (down)
{
Graphics g = Graphics.FromImage(pictureBox.Image);
g.DrawImage(save, 0, 0);
Pen p = pen;
p.Width = 1;
int X1 = X0;
int Y1 = Y0;
int X2 = e.X;
int Y2 = e.Y;
if (X1 > X2) { int t = X1; X1 = X2; X2 = t; }
if (Y1 > Y2) { int t = Y1; Y1 = Y2; Y2 = t; }
int inx = comboBox.SelectedIndex;
if (inx == 0)
g.DrawLine(p, X1, Y1, X2, Y2);
else if (inx == 1)
g.DrawRectangle (p, X1, Y1, X2-X1, Y2-Y1);
else if (inx == 2)
g.DrawEllipse (p, X1, Y1, X2-X1, Y2-Y1);
pictureBox.Invalidate();
}
}
private void pictureBox_MouseUp(object sender, MouseEventArgs e)
{
if (down)
{
down = false;
int inx = comboBox.SelectedIndex;
Graphics g = Graphics.FromImage(pictureBox.Image);
if (save != null)
g.DrawImage(save, 0, 0);
int X1 = X0;
int Y1 = Y0;
int X2 = e.X;
int Y2 = e.Y;
if (X1 > X2) { int t = X1; X1 = X2; X2 = t; }
if (Y1 > Y2) { int t = Y1; Y1 = Y2; Y2 = t; }
if (inx == 0)
g.DrawLine (pen, X1, Y1, X2, Y2);
else if (inx == 1)
{
g.FillRectangle (brush, X1, Y1, X2 - X1, Y2 - Y1);
g.DrawRectangle (pen, X1, Y1, X2 - X1, Y2 - Y1);
}
else if (inx == 2)
{
g.FillEllipse (brush, X1, Y1, X2 - X1, Y2 - Y1);
g.DrawEllipse (pen, X1, Y1, X2 - X1, Y2 - Y1);
}
pictureBox.Invalidate();
}
}
private void quitMenu_Click(object sender, EventArgs e)
{
Close ();
}
private void openMenu_Click(object sender, EventArgs e)
{
if (openDialog.ShowDialog() == DialogResult.OK)
{
pictureBox.Image = new Bitmap (openDialog.FileName);
pictureBox_SizeChanged (null, null);
}
}
private void saveMenu_Click(object sender, EventArgs e)
{
if (saveDialog.ShowDialog() == DialogResult.OK)
{
// using System.Drawing.Imaging;
// saveDialog.Filter : Bitmap|*.bmp|Jpeg|*.jpg
if (saveDialog.FilterIndex == 1)
pictureBox.Image.Save (saveDialog.FileName, ImageFormat.Bmp);
else if (saveDialog.FilterIndex == 2)
pictureBox.Image.Save (saveDialog.FileName, ImageFormat.Jpeg);
}
}
} // end of class
} // end of namespace