|
101
|
Programación / .NET (C#, VB.NET, ASP) / Re: Dibujar medio círculo
|
en: 22 Enero 2023, 07:59 am
|
Hecho. using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Reflection; using System.Windows.Forms; using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace GDI_circulo_flecha_02 { public partial class Form1 : Form { // Variables. SemiCírculo sc; public int x2 = 0; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // Configuramos el o los controles como inicio. // trackBar1. trackBar1.Minimum = 0; // 0 grados. trackBar1.Maximum = 180; // 180 grados. trackBar1.Value = 90; // 90 grados. trackBar1.LargeChange = 0; // Precisión. x2 = 270; // 270º. // Form1. this.BackColor = Color.GreenYellow; // Fondo verde amarillo. // Crear brocha sólida color blaco. SolidBrush fondoBlanco = new SolidBrush (Color .White); // Crear localización y tamaño del eclipse. int anchura_x1 = 0; int altura_y1 = 0; int anchura_x2 = 100; int altura_y2 = 100; sc = new SemiCírculo (fondoBlanco, anchura_x1, altura_y1, anchura_x2, altura_y2 ); } private void panel1_Paint(object sender, PaintEventArgs e) { typeof(Panel ).InvokeMember("DoubleBuffered", BindingFlags.SetProperty | BindingFlags.Instance | BindingFlags.NonPublic, null, (Panel )sender, new object[] { true }); // e.Graphics.TranslateTransform(75, 75); // Algún margen. // Dibujamos un círculo blanco. sc.Dibujar(e.Graphics); // Fleccha que se mueve de 0 a 180 grados. Pen pen = new Pen (Color .Black, 8) // Color negro y el 8 es el grosor de la flecha. { StartCap = LineCap.RoundAnchor, // Anclar en el inicio. EndCap = LineCap.ArrowAnchor // Flecha en el final. }; e.Graphics.TranslateTransform(50, 50); // Origen de coordenadas. e.Graphics.RotateTransform(x2); // Rotación. e.Graphics.DrawLine(pen, 0, 0, 50, 0); // Dibujar línea. } private void trackBar1_Scroll(object sender, EventArgs e) { // Quita el declarador del tipo, si no ocultas la variable que querías usar. x2 = 180 + trackBar1.Value; // 0 grado = trackbar maximun. panel1.Invalidate(); // Redibujar. label_grados.Text = x2.ToString(); } } class SemiCírculo { GraphicsPath gp; SolidBrush fondo; Pen trazo; public SemiCírculo(SolidBrush fondo, int x, int y, int ancho, int alto) { gp.AddArc(x, y, ancho, alto, 180, 180); gp.CloseFigure(); this.fondo = fondo; trazo = new Pen (fondo, 2) { Alignment = PenAlignment.Inset }; } // Dibujar trazo y fondo. public void Dibujar(Graphics g) { g.DrawPath(trazo, gp); g.FillPath(fondo, gp); } } }
|
|
|
104
|
Programación / .NET (C#, VB.NET, ASP) / Dibujar medio círculo
|
en: 21 Enero 2023, 17:12 pm
|
Buenas: Como se puede ver en la imagen, hay un círculo blanco y dentro una flecha negra. La flecha puedes moverla desde los 90º pasando por 0º hasta los -90º. La mitad del círculo hacia abajo no quiero que aparezca, solo medio círculo. Lo he trabajado con GDI+ .net 4.8. ¿Es posible conseguirlo hacer como pido? Código C# hecho hasta ahora. using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Reflection; using System.Windows.Forms; namespace GDI_circulo_flecha_02 { public partial class Form1 : Form { public int x2 = 0; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // Configuramos el o los controles como inicio. // trackBar1. trackBar1.Minimum = 0; // 0 grados. trackBar1.Maximum = 180; // 180 grados. trackBar1.Value = 90; // 90 grados. trackBar1.LargeChange = 0; // Precisión. x2 = 270; // 270º. // Form1. this.BackColor = Color.GreenYellow; // Fondo verde amarillo. } private void panel1_Paint(object sender, PaintEventArgs e) { typeof(Panel ).InvokeMember("DoubleBuffered", BindingFlags.SetProperty | BindingFlags.Instance | BindingFlags.NonPublic, null, (Panel )sender, new object[] { true }); // Crear brocha sólida color blaco. SolidBrush fondoBlanco = new SolidBrush (Color .White); // Crear localización y tamaño del eclipse. int anchura_x1 = 0; int altura_y1 = 0; int anchura_x2 = 100; int altura_y2 = 100; // e.Graphics.TranslateTransform(75, 75); // Algún margen. // Dibujamos un círculo blanco. e.Graphics.FillEllipse(fondoBlanco, anchura_x1, altura_y1, anchura_x2, altura_y2); // Fleccha que se mueve de 0 a 180 grados. Pen pen = new Pen (Color .Black, 8) // Color negro y el 8 es el grosor de la flecha. { StartCap = LineCap.RoundAnchor, // Anclar en el inicio. EndCap = LineCap.ArrowAnchor // Flecha en el final. }; e.Graphics.TranslateTransform(50, 50); // Origen de coordenadas. e.Graphics.RotateTransform(x2); // Rotación. e.Graphics.DrawLine(pen, 0, 0, 50, 0); // Dibujar línea. } private void trackBar1_Scroll(object sender, EventArgs e) { // Quita el declarador del tipo, si no ocultas la variable que querías usar. x2 = 180 + trackBar1.Value; // 0 grado = trackbar maximun. panel1.Invalidate(); // Redibujar. label_grados.Text = x2.ToString(); } } }
Saludos
|
|
|
105
|
Programación / Scripting / ¿Se puede hacer un chat entre dos PC con PowerShell?
|
en: 21 Enero 2023, 11:39 am
|
Buenas: Quiero hacer un buen mini chat para el puerto serie entre dos PC. Como no estoy famirializado, quiero ayuda. Tengo tres programas que hacen lo mismo en C#, VB .net y C++ .net en modo consola del mini chat y funciona entre ellos. Al menos dejo el código fuente de C# si alguien lo compara y lo logra hacer. Si quieres otro lenguaje, lo cuentas y lo subo la versión completa. Código C#:using System; using System.IO; using System.IO.Ports; using System.Text; using System.Threading; namespace Chat_Consola_04 { class Program { static bool _continua; static SerialPort Puerto_serie; static void Main(string[] args) { const int MAXIMA_LONGITUD = 40000; string COM = ""; string nombre; string mensaje; string titulo = "Mini chat C#"; string tu = "<Tú>"; StringComparer comparaString = StringComparer.OrdinalIgnoreCase; Thread readThread = new Thread (Leer ); #region Configuración ventana. // Título de la ventana. Console.Title = titulo; // Tamaño de la ventana, x, y, o ancho y alto. const byte ANCHO_X = 70, ALTO_Y = 25; Console.SetWindowSize(ANCHO_X, ALTO_Y); // Color de fondo. Console.BackgroundColor = ConsoleColor.Green; // Color de las letras. Console.ForegroundColor = ConsoleColor.Black; // Limpiar pantalla y dejarlo todo en color de fondo. Console.Clear(); // Visible el cursor. Console.CursorVisible = true; #endregion #region Configuración puerto serie. // Crear un nuevo objeto SerialPort con la configuración predeterminada. Puerto_serie = new SerialPort (); // Codificar a UTF-8 para que se vean bien las tildes, ñ y otros caracteres. Puerto_serie.Encoding = Encoding.UTF8; // Obtenga una lista de nombres de puertos serie. string[] puertos = SerialPort.GetPortNames(); Console.WriteLine("Se encontraron los siguientes puertos series:"); // Muestre el nombre de cada puerto en la consola. foreach (string puerto in puertos) { Console.WriteLine(puerto); } // Configuración. Console.Write(@" Introduzca un número para seleccionar puerto COM. Por ejemplo el 4, sería COM4. Puerto: "); COM = Console.ReadLine(); // Escribir el número del puerto. Console.Clear(); // Limpiar pantalla. Puerto_serie.PortName = "COM" + COM; // Número del puerto serie. // Configuración del puerto serie. Puerto_serie.BaudRate = 115200; Puerto_serie.Parity = Parity.None; Puerto_serie.StopBits = StopBits.One; Puerto_serie.DataBits = 8; Puerto_serie.Handshake = Handshake.None; Puerto_serie.RtsEnable = true; // Establecer los tiempos de espera de lectura / escritura. Puerto_serie.ReadTimeout = 500; // 500 Milisegundos. Puerto_serie.WriteTimeout = 500; // 500 // Comprueba si puede abrir el puerto serie. try { Puerto_serie.Open(); // Abrir el puerto serie. } // En caso que diera algún error como que no encuentra el puerto seleccionado // muestra una excepción. catch (IOException) { Console.ForegroundColor = ConsoleColor.Red; // Texto en rojo. Console.CursorVisible = false; Console.SetCursorPosition(16, 6); Console.WriteLine(@"El puerto " + Puerto_serie.PortName + @" no existe o no lo encuentra."); Console.ReadKey(); // Pulse cualquier tecla. Environment.Exit(1); // Salir de la aplicación. } // Se ha denegado el acceso al puerto. catch (UnauthorizedAccessException) { Console.ForegroundColor = ConsoleColor.Red; // Texto en rojo. Console.CursorVisible = false; Console.SetCursorPosition(16, 6); Console.WriteLine(@"Se ha denegado el acceso al puerto " + Puerto_serie.PortName + "" + "\nPuede estar el puerto escogido en uso.\n" + "Elija un puerto diferente o desactiva el que está en uso."); Console.ReadKey(); // Pulse cualquier tecla. Environment.Exit(1); // Salir de la aplicación. } #endregion _continua = true; readThread.Start(); // Mostrar texto Nombre y se Console.Write("Nombre: "); // guarda en la variable nombre. nombre = Console.ReadLine(); // Se muestra el nombre o nick y el puerto seleccionado al final del título de la ventana. Console.Title = titulo + "- Nick: " + nombre + " - COM: " + COM; Console.WriteLine("Escriba /salir para salir."); while (_continua) { // Cualquier caracter recibido se guarda en la variable mensaje. //mensaje = Console.ReadLine(); #region Enviar más de 255 caracteres. // ######################################################################### Stream entradaDeDatos = Console.OpenStandardInput(); byte[] buffer = new byte[MAXIMA_LONGITUD ]; int numerosBytesLeidos = entradaDeDatos.Read(buffer, 0, MAXIMA_LONGITUD); char[] chars = Console.InputEncoding.GetChars(buffer, 0, numerosBytesLeidos); mensaje = new string(chars ); // ######################################################################### #endregion // Compara /salir con el mensaje /salir si lo haz escrito igual. // ¿Escribiste la palabra /salir? if (comparaString.Equals("/salir\r\n", mensaje)) { // Sí. Entonces, pone esta variable _continue en false. _continua = false; } // No. Entonces, envía por el puerto serie tu nick // y mensaje que haz escrito. else { Puerto_serie.WriteLine(String.Format("<{0}>: {1}", nombre, mensaje)); } } // Bloquea el subproceso. readThread.Join(); // Cierra el puerto serie. Puerto_serie.Close(); } // Lee mensaje recibido. public static void Leer() { // Si _continua es true se ejecuta todas las instrucciones dentro de while. while (_continua) { try { // Almacena en la variable mensaje cualquier caracter o mensaje recibido. string mensaje = Puerto_serie.ReadLine(); // Muestra en pantalla mensaje recibido. Console.WriteLine(mensaje); } catch (TimeoutException) { } } } } }
Saludos.
|
|
|
106
|
Programación / .NET (C#, VB.NET, ASP) / Re: Identificador no declarado
|
en: 20 Enero 2023, 19:52 pm
|
Ya funciona. Lo dejo el código completo aquí por si alguien lo necesita. Muchas gracias. #include "pch.h" using namespace System::Threading; using namespace System; using namespace System::IO; using namespace System::IO::Ports; using namespace System::Text; ref class Chat { static bool _continua; static SerialPort^ Puerto_serie; public: static void Main(array<System::String^>^ args) { const int MAXIMA_LONGITUD = 40000; String^ COM = ""; String^ nombre; String^ mensaje; String^ titulo = "Mini chat C++ CLR .net"; StringComparer^ comparaString = StringComparer::OrdinalIgnoreCase; //Thread^ readThread = gcnew Thread(Leer); Thread^ readThread = gcnew Thread(gcnew ThreadStart(Chat::Leer)); #pragma region Configuración ventana. // Título de la ventana. Console::Title = titulo; // Tamaño de la ventana, x, y, o ancho y alto. const Byte ANCHO_X = 70, ALTO_Y = 25; Console::SetWindowSize(ANCHO_X, ALTO_Y); // Color de fondo. Console::BackgroundColor = ConsoleColor::Yellow; // Color de las letras. Console::ForegroundColor = ConsoleColor::Black; // Limpiar pantalla y dejarlo todo en color de fondo. Console::Clear(); // Visible el cursor. Console::CursorVisible = true; #pragma endregion #pragma region Configuración puerto serie. // Crear un nuevo objeto SerialPort con la configuración predeterminada. Puerto_serie = gcnew SerialPort(); // Codificar a UTF-8 para que se vean bien las tildes, ñ y otros caracteres. Puerto_serie->Encoding = Encoding::UTF8; // Obtenga una lista de nombres de puertos serie. array<String^>^ puertos = SerialPort::GetPortNames(); Console::WriteLine("Se encontraron los siguientes puertos series:"); // Muestre el nombre de cada puerto en la consola. for each (String ^ puerto in puertos) { Console::WriteLine(puerto); } // Configuración. Console::Write( "Introduzca un número para seleccionar puerto COM.\n" "Por ejemplo el 4, sería COM4.\n" "\n" "Puerto: "); COM = Console::ReadLine(); // Escribir el número del puerto. Console::Clear(); // Limpiar pantalla. Puerto_serie->PortName = "COM" + COM; // Número del puerto serie. // Configuración del puerto serie. Puerto_serie->BaudRate = 115200; Puerto_serie->Parity = Parity::None; Puerto_serie->StopBits = StopBits::One; Puerto_serie->DataBits = 8; Puerto_serie->Handshake = Handshake::None; Puerto_serie->RtsEnable = true; // Establecer los tiempos de espera de lectura / escritura. Puerto_serie->ReadTimeout = 500; // 500 Milisegundos. Puerto_serie->WriteTimeout = 500; // 500 // Comprueba si puede abrir el puerto serie. try { Puerto_serie->Open(); // Abrir el puerto serie. } // En caso que diera algún error como que no encuentra el puerto seleccionado // muestra una excepción. catch (IOException^) { Console::ForegroundColor = ConsoleColor::Red; // Texto en rojo. Console::CursorVisible = false; Console::SetCursorPosition(16, 6); Console::WriteLine("El puerto " + Puerto_serie->PortName + " no existe " + "o no lo encuentra."); Console::ReadKey(); // Pulse cualquier tecla. Environment::Exit(1); // Salir de la aplicación. } // Se ha denegado el acceso al puerto. catch (UnauthorizedAccessException^) { Console::ForegroundColor = ConsoleColor::Red; // Texto en rojo. Console::CursorVisible = false; Console::SetCursorPosition(16, 6); Console::WriteLine("Se ha denegado el acceso al puerto " + Puerto_serie->PortName + "" + "\nPuede estar el puerto escogido en uso.\n" + "Elija un puerto diferente o desactiva el que está en uso."); Console::ReadKey(); // Pulse cualquier tecla. Environment::Exit(1); // Salir de la aplicación. } #pragma endregion _continua = true; readThread->Start(); // Mostrar texto Nombre y se Console::Write("Nombre: "); // guarda en la variable nombre. nombre = Console::ReadLine(); // Se muestra el nombre o nick y el puerto seleccionado al final del título de la ventana. Console::Title = titulo + "- Nick: " + nombre + " - COM: " + COM; Console::WriteLine("Escriba /salir para salir."); while (_continua) { // Cualquier caracter recibido se guarda en la variable mensaje. //mensaje = Console.ReadLine(); #pragma region Enviar más de 255 caracteres. // ######################################################################### Stream^ entradaDeDatos = Console::OpenStandardInput(); array<Byte>^ buffer = gcnew array<Byte>(MAXIMA_LONGITUD); int numerosBytesLeidos = entradaDeDatos->Read(buffer, 0, MAXIMA_LONGITUD); array<Char>^ chars = Console::InputEncoding->GetChars(buffer, 0, numerosBytesLeidos); mensaje = gcnew String(chars); // ######################################################################### #pragma endregion // Compara /salir con el mensaje /salir si lo haz escrito igual. // ¿Escribiste la palabra /salir? if (comparaString->Equals("/salir\r\n", mensaje)) { // Sí. Entonces, pone esta variable _continue en false. _continua = false; } // No. Entonces, envía por el puerto serie tu nick // y mensaje que haz escrito. else { Puerto_serie->WriteLine(String::Format("<{0}>: {1}", nombre, mensaje)); } } // Bloquea el subproceso. readThread->Join(); // Cierra el puerto serie. Puerto_serie->Close(); } // Lee mensaje recibido. static void Leer() { // Si _continua es true se ejecuta todas las instrucciones dentro de while. while (_continua) { try { // Almacena en la variable mensaje cualquier caracter o mensaje recibido. String^ mensaje = Puerto_serie->ReadLine(); // Muestra en pantalla mensaje recibido. Console::WriteLine(mensaje); } catch (TimeoutException^) {} } } }; int main(array<System::String^>^ args) { Chat::Main(args); return 0; }
|
|
|
107
|
Programación / .NET (C#, VB.NET, ASP) / Re: Identificador no declarado
|
en: 19 Enero 2023, 17:30 pm
|
Si te refieres a este. void Leer();
No debe tenerlo. Ya se el motivo, había que poner en el punto 15 el ^. catch (TimeoutException^) {}
En la línea de abajo, sigue con el fallo. Thread^ readThread = gcnew Thread(Leer);
Gracias.
|
|
|
108
|
Programación / .NET (C#, VB.NET, ASP) / Identificador no declarado
|
en: 18 Enero 2023, 22:52 pm
|
Buenas: Usando C++ CLR .net me da este error: Thread^ readThread = gcnew Thread(Leer);
Error C2065 'Leer': identificador no declarado Sigue con el código de llamada que también hay problemas de error. // Lee mensaje recibido. void Leer(); { // Si _continua es true se ejecuta todas las instrucciones dentro de while. while (_continua) { try { // Almacena en la variable mensaje cualquier caracter o mensaje recibido. String^ mensaje = Puerto_serie->ReadLine(); // Muestra en pantalla mensaje recibido. Console::WriteLine(mensaje); } catch (TimeoutException) {} } }
Error C2725 'System::TimeoutException': no se puede producir o detectar un objeto administrado por valor o referencia. Error C2316 'System::TimeoutException': no se puede detectar porque el destructor y/o el constructor de copia están inaccesibles o se eliminaron.
|
|
|
110
|
Programación / .NET (C#, VB.NET, ASP) / El código de enviar en consola de más de 255 caracteres me sale error.
|
en: 18 Enero 2023, 07:25 am
|
Hola: Usando C++ CLR o .net me sale este error. Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido Error (activo) E0144 no se puede usar un valor de tipo "cli::array<wchar_t, 1> ^" para inicializar una entidad de tipo "cli::array<char, 1> ^" Chat Consola CLR D:\Visual Studio 2022\Chat Consola CLR\Chat Consola CLR\Chat Consola CLR.cpp 144 Stream^ entradaDeDatos = Console::OpenStandardInput(); array<Byte> ^buffer = gcnew array<Byte>(MAXIMA_LONGITUD); int numerosBytesLeidos = entradaDeDatos->Read(buffer, 0, MAXIMA_LONGITUD); array<char> ^chars = Console::InputEncoding->GetChars(buffer, 0, numerosBytesLeidos); mensaje = gcnew String(chars);
¿Alguna idea? Saludos.
|
|
|
|
|
|
|