Aprendiendo .NET sobre la marcha: Viejos Windows Forms (iv)
<< Aprendiendo .NET sobre la marcha: viejos Windows Forms (iii)
Aprendiendo .NET sobre la marcha: viejos Windows Forms (v) >>
Ya pueden descargar la aplicación del tutorial desde la siguiente dirección: http://sernasis.com/Home/Descargas
En esta parte haremos uso de nuestras clases para que la aplicación realice cálculos. Primero generamos una enumeración con todo lo que puede hacer la aplicación, una variable del tipo de la enumeración y una lista de elementos tipo Punto (una de las clases que generamos)
enum eOpcion {
PerimetroTriangulo,
SuperficieTriangulo,
PerimetroCuadrilatero,
SuperficieCuadrilatero,
SupLateralPrisma,
SupTotalPrisma,
VolPrisma,
SupLateralPiramide,
SupTotalPiramide,
VolPiramide,
fnSeno,
fnCoseno,
fnTangente,
fnCotangente,
fnSecante,
fnCosecante,
fnParabola,
fnElipse
};
eOpcion opcion;
List puntos = new List();
const int minX = -180;
const int maxX = 180;
A continuación generamos un método que nos ayude a inicializar los controles del formulario y lo invocamos en el método Load
private void Form1_Load(object sender, EventArgs e) {
InicializarControles();
}
private void InicializarControles() {
foreach (var item in tabPage1.Controls) {
if (item is Label)
(item as Label).Text = string.Empty;
else if (item is Button)
(item as Button).Enabled = false;
else if (item is TextBox) {
(item as TextBox).Text = string.Empty;
(item as TextBox).Enabled = false;
}
}
}
El siguiente método será compartido por todas las opciones de la barra de menús, y se encargará de cambiar rótulos a las etiqueta y visibilidad de cuadros de texto, además de asignar a la variable opcion un valor que indique la opción seleccionada.
private void perímetroToolStripMenuItem_Click(object sender, EventArgs e) {
InicializarControles();
switch ((sender as ToolStripMenuItem).Name)
{
case "perímetroToolStripMenuItem": // Triángulo
label1.Text = "Lado A";
label2.Text = "Lado B";
label3.Text = "Lado C";
textBox1.Visible = true;
textBox2.Visible = true;
textBox3.Visible = true;
opcion = eOpcion.PerimetroTriangulo;
break;
case "superficieToolStripMenuItem": // Triángulo
label1.Text = "Base";
label2.Text = "Altura";
textBox1.Visible = true;
textBox2.Visible = true;
opcion = eOpcion.SuperficieTriangulo;
break;
case "perímetroToolStripMenuItem1": // Cuadrilátero
label1.Text = "Lado A";
label2.Text = "Lado B";
label3.Text = "Lado C";
label4.Text = "Lado D";
textBox1.Visible = true;
textBox2.Visible = true;
textBox3.Visible = true;
textBox4.Visible = true;
opcion = eOpcion.PerimetroCuadrilatero;
break;
case "superficieToolStripMenuItem1": // Cuadrilátero
label1.Text = "Lado A";
label2.Text = "Lado B";
label3.Text = "Lado C";
label4.Text = "Lado D";
textBox1.Visible = true;
textBox2.Visible = true;
textBox3.Visible = true;
textBox4.Visible = true;
opcion = eOpcion.SuperficieCuadrilatero;
break;
}
button1.Enabled = true;
button2.Enabled = true;
}
Para el método que ejecuta el botón de calcular, el código será el siguiente, y aquí usaremos el valor almacenado en la variable opcion para saber el cálculo que hemos de realizar.
private void button1_Click(object sender, EventArgs e)
{
Triangulo triangulo;
Cuadrilatero cuadrilatero;
Prisma prisma;
Piramide piramide;
label5.Text = opcion.ToString() + ": ";
switch (opcion)
{
case eOpcion.PerimetroTriangulo:
triangulo = new Triangulo()
{
LadoA = float.Parse(textBox1.Text),
LadoB = float.Parse(textBox2.Text),
LadoC = float.Parse(textBox3.Text)
};
label5.Text += triangulo.Perimetro().ToString();
break;
case eOpcion.SuperficieTriangulo:
triangulo = new Triangulo()
{
LadoA = float.Parse(textBox1.Text),
LadoB = float.Parse(textBox2.Text)
};
label5.Text += triangulo.Superficie().ToString();
break;
case eOpcion.PerimetroCuadrilatero:
cuadrilatero = new Cuadrilatero()
{
LadoA = float.Parse(textBox1.Text),
LadoB = float.Parse(textBox2.Text),
LadoC = float.Parse(textBox3.Text),
LadoD = float.Parse(textBox4.Text)
};
label5.Text += cuadrilatero.Perimetro().ToString();
break;
case eOpcion.SuperficieCuadrilatero:
cuadrilatero = new Cuadrilatero()
{
LadoA = float.Parse(textBox1.Text),
LadoB = float.Parse(textBox2.Text),
LadoC = float.Parse(textBox3.Text),
LadoD = float.Parse(textBox4.Text)
};
label5.Text += cuadrilatero.Superficie().ToString();
break;
}
}
Ahora procedemos con las opciones de graficación, para lo cual seguimos una mecánica similar a como hicimos con el cálculo de superficies.
Damos doble clic en la opción Seno y luego que nos haya generado el método, en el formulario seleccionamos las opciones restantes de graficación y en el evento de clic asignamos el método nuevo. El código siguiente se encargará de calcular el centro del área de graficación, los puntos y realizará el dibujo.
private void senoToolStripMenuItem_Click(object sender, EventArgs e)
{
Punto centro = new Punto()
{
X = new Racional(pictureBox1.Width / 2),
Y = new Racional(pictureBox1.Height / 2)
};
puntos.Clear();
switch ((sender as ToolStripMenuItem).Name)
{
case "senoToolStripMenuItem":
for (int i = minX; i <= maxX; i++)
{
radian = (double)i * Math.PI / 180d;
puntos.Add(i, (float)Math.Sin(radian));
}
break;
case "cosenoToolStripMenuItem":
for (int i = minX; i <= maxX; i++)
{
radian = (double)i * Math.PI / 180d;
puntos.Add(i, (float)Math.Cos(radian));
}
break;
case "tangenteToolStripMenuItem":
for (int i = minX; i <= maxX; i++)
{
radian = (double)i * Math.PI / 180d;
puntos.Add(i, (float)Math.Tan(radian));
}
break;
case "cotangenteToolStripMenuItem":
for (int i = minX; i <= maxX; i++)
{
radian = (double)i * Math.PI / 180d;
puntos.Add(i, 1f / (float)Math.Tan(radian));
}
break;
case "secanteToolStripMenuItem":
for (int i = minX; i <= maxX; i++)
{
radian = (double)i * Math.PI / 180d;
puntos.Add(i, 1f / (float)Math.Cos(radian));
}
break;
case "cosecanteToolStripMenuItem":
for (int i = minX; i <= maxX; i++)
{
radian = (double)i * Math.PI / 180d;
puntos.Add(i, 1f / (float)Math.Sin(radian));
}
break;
case "parábolaToolStripMenuItem":
break;
case "elipseToolStripMenuItem":
break;
default:
break;
}
Graphics gp = pictureBox1.CreateGraphics();
gp.Clear(Color.White);
foreach (var punto in puntos)
{
try
{
gp.DrawRectangle(Pens.DarkSlateBlue, centro.Key - punto.Key, centro.Value - (punto.Value * 20f),
1f, 1f);
}
catch (Exception ex)
{
gp.DrawRectangle(Pens.Red,
(centro.Key - punto.Key), (centro.Value),
1, 1);
}
}
}
Bien, hasta aquí dejamos esta publicación. En la siguiente abordamos el historia que es muy sencillo para concluir nuestro proyecto. También incluiré un enlace para que puedan descargar la aplicación completa, porque aquí hay algunos fragmentos de código que no puse, aunque éstos no afectan al funcionamiento de la aplicación siguiendo el tutorial.
Agradezco los comentarios que puedan hacerme, así como el que se suscriban para recibir noticias y, si consideran útil, compartir mi blog.

Comentarios
Publicar un comentario