Descargar Solución de la galería de códigos de msdn aquí
Este es un ejemplo de software con fines de aprendizaje de heramientas graficas en .NET C# usando Windows Forms. Posee una herramienta lápiz y una goma de borrar, también se puede dibujar sobre una imagen.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Imaging; using System.Text; using System.Windows.Forms; using System.IO; namespace Dibujar { public partial class Form1 : Form { private bool cursorDown; private Point[] puntos; private Pen lapiz; private Pen goma; private Bitmap bmp; private string accion; public Form1() { InitializeComponent(); } private void Inicializar() { accion = "dibujar"; puntos = new Point[0]; //Creo el lapiz y la goma y defino el tipo de linea lapiz = new Pen(Color.Black, 1); lapiz.StartCap = System.Drawing.Drawing2D.LineCap.Round; lapiz.EndCap = System.Drawing.Drawing2D.LineCap.Round; lapiz.LineJoin = System.Drawing.Drawing2D.LineJoin.Round; goma = new Pen(Color.White, 10); goma.StartCap = System.Drawing.Drawing2D.LineCap.Round; goma.EndCap = System.Drawing.Drawing2D.LineCap.Round; goma.LineJoin = System.Drawing.Drawing2D.LineJoin.Round; bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height); //creo el cursor del lapiz a partir de una imagen que tengo como recurso IntPtr intprCursor = Dibujar.Properties.Resources.LapizC.GetHicon(); pictureBox1.Cursor = new Cursor(intprCursor); } private void agregarPunto(Point punto) { //agrega los puntos obtenidos al arreglo Point[] temp = new Point[puntos.Length + 1]; puntos.CopyTo(temp, 0); puntos = temp; puntos[puntos.Length - 1] = punto; } private void MDibujar() { //Dibuja if (puntos.Length > 1) { //Aqui usamos dos Graphics, uno que dibuja directamente en el pictureBox y //otro que dibuja en la imagen. //Esto ayuda a que el dibujo sea rapido ya que si dibujamos solo la imagen //y la vamos colocando en el pictureBox puede ser mas lento. Graphics g1 = pictureBox1.CreateGraphics(); Graphics g2 = Graphics.FromImage(bmp); g1.DrawLines(lapiz, puntos); g2.DrawLines(lapiz, puntos); g1.Dispose(); g2.Dispose(); } } private void MBorrar() { //Borra, es lo mismo que dibujar solo que el objeto Pen es otro if (puntos.Length > 1) { Graphics g1 = pictureBox1.CreateGraphics(); Graphics g2 = Graphics.FromImage(bmp); g1.DrawLines(goma, puntos); g2.DrawLines(goma, puntos); g1.Dispose(); g2.Dispose(); } } private void CrearGoma() { //en realidad este metodo lo que hace es crear un cursor para la goma a partir de dos //elipses, de esta manera el cursor queda como un circulo int diametroG = Convert.ToInt32(goma.Width); Bitmap Goma = new Bitmap(diametroG, diametroG); Graphics gGoma = Graphics.FromImage(Goma); gGoma.FillRectangle(Brushes.Magenta, 0, 0, diametroG, diametroG); gGoma.FillEllipse(Brushes.White, 0, 0, diametroG - 1, diametroG - 1); gGoma.DrawEllipse(new Pen(Color.Black, 1), 0, 0, diametroG- 1, diametroG - 1); Goma.MakeTransparent(Color.Magenta); gGoma.Dispose(); IntPtr intprCursorGoma = Goma.GetHicon(); pictureBox1.Cursor = new Cursor(intprCursorGoma); } private void Unir(Bitmap fondo) { //Este metodo une un fondo con lo que se ha dibujado. //esto es necesario ya que lo que dibujamos se dibuja sobre un fondo transparente //y si no lo unimos puede traer problemas al salvar la imagen o al cambiarle el tamaño //al area de dibujo. Graphics g = Graphics.FromImage(fondo); g.DrawImage(bmp, 0, 0); bmp = new Bitmap(fondo); g.Dispose(); fondo.Dispose(); } private void Form1_Load(object sender, EventArgs e) { //llamamos al metodo Inicializar() que inicializa los elementos Inicializar(); } private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { cursorDown = true; } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { toolStripStatusLabel4.Text = "X: " + e.X.ToString() + " Y: " + e.Y.ToString(); if (cursorDown) { agregarPunto(new Point(e.X, e.Y)); if (accion == "dibujar") { MDibujar(); } if (accion == "borrar") { MBorrar(); } } } private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { cursorDown = false; //Aqui reinicializamos a puntos para que no se unan las lineas //al volver a dibujar puntos = new Point[0]; //Marcamos como transparente en la imagen donde estamos dibujando todo aquello que sea //del color de fondo, esto es necesario para que al cambiar de fondo no se vea lo que borramos bmp.MakeTransparent(pictureBox1.BackColor); //ponemos la imagen dibujada como fondo //esto lo hago aqui y no mientras se dibuja para que el trabajo de dibujar sea mas rapido. pictureBox1.Image = bmp; } private void salvarDibujoToolStripMenuItem_Click(object sender, EventArgs e) { if (saveFileDialog1.ShowDialog() == DialogResult.OK) { Bitmap fondo = new Bitmap(bmp.Width, bmp.Height); Graphics g = Graphics.FromImage(fondo); g.FillRectangle(new SolidBrush(pictureBox1.BackColor), 0, 0, bmp.Width, bmp.Height); g.Dispose(); Unir(fondo); bmp.Save(saveFileDialog1.FileName, ImageFormat.Bmp); } } private void tamañoDelDibujoToolStripMenuItem_Click(object sender, EventArgs e) { Form2 f2 = new Form2(); f2.ancho = pictureBox1.Width; f2.alto = pictureBox1.Height; if (f2.ShowDialog() == DialogResult.OK) { pictureBox1.Width = f2.ancho; pictureBox1.Height = f2.alto; Bitmap fondo = new Bitmap(pictureBox1.Width, pictureBox1.Height); Unir(fondo); } } private void toolStripButton2_Click(object sender, EventArgs e) { toolStripButton3.Checked = false; toolStripButton2.Checked = true; IntPtr intprCursor = Dibujar.Properties.Resources.LapizC.GetHicon(); pictureBox1.Cursor = new Cursor(intprCursor); accion = "dibujar"; } private void toolStripButton3_Click(object sender, EventArgs e) { toolStripButton2.Checked = false; toolStripButton3.Checked = true; CrearGoma(); accion = "borrar"; } private void toolStripButton4_Click(object sender, EventArgs e) { if (colorDialog1.ShowDialog() == DialogResult.OK) { Bitmap btemp = new Bitmap(15, 15); Graphics gtemp = Graphics.FromImage(btemp); gtemp.FillRectangle(new SolidBrush(colorDialog1.Color), 0, 0, 16, 16); toolStripButton4.Image = new Bitmap(btemp); gtemp.Dispose(); btemp.Dispose(); lapiz.Color = colorDialog1.Color; } } private void toolStripButton5_Click(object sender, EventArgs e) { if (colorDialog1.ShowDialog() == DialogResult.OK) { Bitmap btemp = new Bitmap(15, 15); Graphics gtemp = Graphics.FromImage(btemp); gtemp.FillRectangle(new SolidBrush(colorDialog1.Color), 0, 0, 16, 16); toolStripButton5.Image = new Bitmap(btemp); gtemp.Dispose(); btemp.Dispose(); pictureBox1.BackColor = colorDialog1.Color; goma.Color = colorDialog1.Color; } } private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Add) { if (accion == "dibujar") { if (lapiz.Width < 100) { lapiz.Width++; } } if (accion == "borrar") { if (goma.Width < 100) { goma.Width++; CrearGoma(); } } } if (e.KeyCode == Keys.Subtract) { if (accion == "dibujar") { if (lapiz.Width > 1) { lapiz.Width--; } } if (accion == "borrar") { if (goma.Width > 10) { goma.Width--; CrearGoma(); } } } toolStripStatusLabel2.Text = "Grosor Linea: " + lapiz.Width.ToString(); toolStripStatusLabel3.Text = "Grosor Goma: " + goma.Width.ToString(); } private void salirToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit(); } } }Captura de pantalla:using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Dibujar { public partial class Form2 : Form { public int ancho; public int alto; public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { textBox1.Text = ancho.ToString(); textBox2.Text = alto.ToString(); } private void button1_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.OK; ancho = int.Parse(textBox1.Text); alto = int.Parse(textBox2.Text); this.Close(); } private void button2_Click(object sender, EventArgs e) { this.Close(); } } }Descargar Solución de la galería de códigos de msdn aquí
Captura de pantalla:
No hay comentarios:
Publicar un comentario