← Todos los cursos
UI · Curso gratuito

Dibujo y pintura en Wisej.NET

Tarde o temprano, toda aplicación de negocio pide algo que ningún control estándar sabe dibujar: un indicador, una sparkline dentro de una celda, un mapa de topología interactivo o un PNG adjunto al informe de fin de turno. Este curso avanzado te enseña a producir esos gráficos a la manera de Wisej.NET: eligiendo la superficie de renderizado antes de escribir la primera llamada de dibujo. Todo se construye alrededor de VisualOperationsStudio, una aplicación de operaciones en la que un único modelo de telemetría y topología se representa de cuatro formas distintas. Siete módulos parten de la arquitectura de dibujo de Wisej.NET y de la frontera entre servidor y navegador, y siguen con el evento Paint de los controles bien hecho, el dibujo de celdas de la DataGridView sobre cuadrículas de mil filas, y Wisej.Web.Canvas con el modelo Canvas 2D de HTML5. A partir de ahí convertirás el canvas en un editor interactivo con prueba de impacto, desplazamiento y zoom, generarás imágenes fuera de pantalla con System.Drawing.Managed en Windows, Linux, macOS, iOS y Android, y cerrarás con una arquitectura de dibujo lista para producción, instrumentada y medida, en el proyecto final. Está pensado para desarrolladores .NET con experiencia que ya construyen pantallas Wisej.NET y ahora necesitan gráficos personalizados.

Crea gráficos personalizados con Paint, CellPaint, Canvas y System.Drawing.Managed multiplataforma.

Empezar este curso gratuito

También disponible en: EnglishDeutschFrançaisItaliano

Temario

Módulo 1: La arquitectura de dibujo de Wisej.NET

Módulo 1 de Dibujo y pintura en Wisej.NET — crea gráficos personalizados con Paint, CellPaint, Canvas y System.Drawing.Managed multiplataforma. Lee la guía de la lección y la guía del laboratorio / examen, mira el recorrido guiado sobre la arquitectura de dibujo, supera la evaluación de conocimientos y después completa el laboratorio práctico en VisualOperationsStudio.

  1. LecturaGuía de la lección · 14 min

    Cuatro canalizaciones de renderizado y cómo elegir entre ellas: el Paint de un control, que envía una imagen renderizada en el servidor; el CellPaint de la DataGridView, dentro de una sola celda; Wisej.Web.Canvas, que envía comandos de dibujo al navegador; y System.Drawing.Managed fuera de pantalla, que produce bytes de imagen; además de la escala de decisión que mantiene los controles estándar y el CSS como opción por defecto. Qué significa esto para un desarrollador .NET con experiencia que ya construye pantallas Wisej.NET y ahora necesita gráficos personalizados, y cómo leer este módulo.

    Leer la guía de la lección (PDF)

  2. LecturaGuía del laboratorio / examen · 10 min

    Lo que construirás en el laboratorio práctico, el enfoque sugerido y los entregables requeridos.

    Leer la guía de la lección (PDF)

  3. Lección en vídeoCuatro superficies, un valor: de dónde vienen los píxeles · 14 min

    Cuatro superficies, un valor: de dónde vienen los píxeles: un recorrido guiado del Módulo 1, construido paso a paso en VisualOperationsStudio. Se ejecuta aquí mismo, en el reproductor.

    Transcripción de la narración

    Dibujo y pintura en Wisej.NET empieza con una decisión previa a cualquier código de dibujo: dónde se producen realmente los píxeles. En este módulo se muestra una única lectura de telemetría en cuatro superficies distintas de Visual Operations Studio, para que puedas compararlas una al lado de otra.

    Pedirle a una aplicación que dibuje un número no es un requisito, sino cuatro. Un dial en un panel, un indicador pequeño dentro de una celda de cuadrícula, un nodo en un mapa de topología y una imagen escrita en un archivo de informe presentan el mismo valor, pero cada uno se produce en otro sitio y cada uno envía algo distinto al navegador.

    Un controlador Paint se ejecuta en el servidor, y la imagen terminada viaja al navegador. El dibujo de celdas hace lo mismo, acotado a una sola celda de la cuadrícula. El Canvas se comporta de otra forma: envía comandos de dibujo que ejecuta el navegador. El renderizado fuera de pantalla produce bytes de imagen que ningún control llega a mostrar.

    En la página, las cuatro superficies leen un único campo de muestra de telemetría, así que ninguna es dueña del valor. Un botón cambia ese campo y refresca cada superficie a su manera: la etiqueta y la barra de progreso simplemente lo leen, el panel dibujado se invalida para que el servidor lo repinte, el método de escena del Canvas vuelve a ejecutarse y se produce una imagen nueva fuera de pantalla.

    El dibujo personalizado va al final de una escalera de decisión, no al principio. Recurre primero a un control estándar, después a marcado normal, y solo entonces a un controlador Paint, una celda dibujada o un Canvas. El renderizado fuera de pantalla viene después, y un bucle de dibujo en el navegador se reserva para cuando la frecuencia de fotogramas importa de verdad.

    Redibujar un Canvas significa limpiarlo y reconstruir toda la escena desde el modelo, porque el servidor no puede depender de la copia que tiene el navegador. El renderizador fuera de pantalla está en el extremo opuesto: un bitmap, y una superficie de gráficos creada sobre él, bastan para producir una imagen sin ningún control implicado.

    Ejecuta la página y pulsa New reading. El mismo número aparece a la vez en los cuatro sitios, lo que hace que parezca una sola operación. No lo es. Cada superficie acaba de poner en la red algo bastante distinto para llegar hasta ahí, y de esa diferencia trata realmente este módulo.

    Ahora redimensiona la ventana del navegador. Tres de las superficies vuelven solas, porque el servidor sigue siendo dueño de lo que muestran. El Canvas vuelve en blanco, y sigue en blanco hasta que el método de redibujado lo reconstruye desde la muestra de telemetría que guardó el servidor. Esa asimetría es la consecuencia práctica de la frontera.

    En el primer laboratorio construyes esta página tú mismo: un modelo detrás de cuatro superficies, un único botón que las refresca todas y una nota breve que registra qué cruza la red por cada superficie y qué visuales sobreviven a un redimensionado.

  4. LecturaEjercicio de programación con IA · 20 min

    Construye el ejemplo VisualOperationsStudio de este módulo con ChatGPT o Claude a partir de un prompt listo para usar que dirige al modelo a la especificación del módulo, y después revisa, ejecuta y amplía lo que te devuelva.

    Leer la guía de la lección (PDF)

  5. CuestionarioEvaluación de conocimientos — Módulo 1 · 10 min · Nota mínima 80%
  6. Laboratorio prácticoLaboratorio — Un valor, cuatro superficies de renderizado · 45 min

    Objetivo: Construye el shell de VisualOperationsStudio y representa una única lectura de telemetría en cuatro superficies a la vez. Crea una VisualOperationsPage que contenga una sola instancia del modelo TelemetrySample y después presenta su valor como (1) un Label simple más un ProgressBar, (2) un Panel con un controlador de Paint que dibuja una barra a partir de PaintEventArgs.Graphics y e.ClipRectangle, (3) un Wisej.Web.Canvas cuyo controlador de Redraw reconstruye la misma barra a partir del modelo y (4) un Bitmap fuera de pantalla renderizado con Graphics.FromImage y mostrado en un PictureBox. Conecta un botón que cambie el valor del modelo y actualice las cuatro superficies mediante Invalidate() y un redibujado del Canvas; después redimensiona el navegador y anota qué superficies sobreviven y cuáles hay que reconstruir. Entregables: VisualOperationsPage con un único modelo TelemetrySample del que leen todas las superficies; Controlador de Paint que dibuja desde PaintEventArgs.Graphics dentro de e.ClipRectangle; Controlador de Redraw del Canvas que reconstruye toda la escena a partir del modelo después de un redimensionado; Bitmap fuera de pantalla renderizado con Graphics.FromImage y mostrado en la página; SurfaceNotes.md que registre qué cruza la red en cada superficie y qué elementos visuales sobreviven a un redimensionado.

Módulo 2: Dominar el evento Paint de los controles

Módulo 2 de Dibujo y pintura en Wisej.NET — crea gráficos personalizados con Paint, CellPaint, Canvas y System.Drawing.Managed multiplataforma. Lee la guía de la lección y la guía del laboratorio / examen, mira el recorrido guiado sobre el indicador dibujado, supera la evaluación de conocimientos y después completa el laboratorio práctico en VisualOperationsStudio.

  1. LecturaGuía de la lección · 14 min

    Controles dibujados en el servidor, bien hechos: PaintEventArgs.Graphics y ClipRectangle, la geometría separada del dibujo, liberar todos los pens, brushes y fuentes que creas, setters de propiedades que llaman a Invalidate() exactamente una vez, y el presupuesto de coste de dibujado que decide cuándo un control con tema es la mejor respuesta. Qué significa esto para un desarrollador .NET con experiencia que ya construye pantallas Wisej.NET y ahora necesita gráficos personalizados, y cómo leer este módulo.

    Leer la guía de la lección (PDF)

  2. LecturaGuía del laboratorio / examen · 10 min

    Lo que construirás en el laboratorio práctico, el enfoque sugerido y los entregables requeridos.

    Leer la guía de la lección (PDF)

  3. Lección en vídeoCrea un indicador dibujado que se redibuja solo cuando hace falta · 14 min

    Crea un indicador dibujado que se redibuja solo cuando hace falta: un recorrido guiado del Módulo 2, construido paso a paso en VisualOperationsStudio. Se ejecuta aquí mismo, en el reproductor.

    Transcripción de la narración

    Este módulo construye un control dibujado como es debido. El indicador de telemetría dibuja un anillo, sus zonas de umbral, una aguja y una lectura numérica, y cada una de sus propiedades públicas acota lo que recibe antes de decidir si hace falta repintar.

    Tu código de dibujo se ejecuta en el servidor, y el navegador recibe la imagen resultante. Eso es cómodo, y también es la razón de que un controlador copiado en seis paneles salga caro: se producen seis imágenes, se crean seis juegos de objetos de dibujo y ocurren repintados que nadie pidió.

    Así que mide primero y dibuja después. El ayudante de geometría recibe un rectángulo y devuelve los límites del anillo, los ángulos de barrido, los puntos de la aguja y el rectángulo donde va la etiqueta. Es aritmética normal, sin nada de dibujo, y eso significa que puedes probar la parte difícil sin llegar a crear un control.

    Cada setter de propiedad sigue una misma receta: acota el valor entrante, compáralo con el actual, sal de inmediato cuando nada ha cambiado, asígnalo e invalida exactamente una vez. La misma línea de código refresca la descripción accesible, de modo que la lectura sigue disponible como texto y no solo como píxeles.

    El controlador se protege de un recorte de tamaño cero, llama una vez al paso de medición y después dibuja. Cinco declaraciones using cubren los cinco objetos que este código crea y por tanto posee. La superficie de gráficos que llega en los argumentos del evento no es uno de ellos, y liberarla sería un error.

    Saber de quién es cada objeto resuelve casi todas las dudas. Los brushes y pens del framework son compartidos y hay que dejarlos en paz, un pen estático propio es inseguro en cuanto varias sesiones dibujan a la vez, y una consulta a base de datos, una carga de fuente o un temporizador no pintan nada en una ruta de dibujo.

    Míralo funcionar. Una lectura se mueve, así que un indicador se invalida y se produce una imagen. Los otros dos setters compararon sus valores y salieron antes de tiempo, que es justo de lo que se trata. Un redimensionado reconstruye después cada imagen desde el nuevo rectángulo de recorte, al nuevo tamaño.

    Luego viene el presupuesto: tiempo de procesador en el servidor, memoria para el bitmap temporal y los bytes enviados en cada repintado. Cuando esas cifras dejan de justificar los píxeles, un control con tema es la mejor respuesta. En cualquier caso, los valores en sí deben seguir siendo legibles como texto.

    En el segundo laboratorio construyes el indicador y su ayudante de geometría puro, proteges el tamaño cero y un rango invertido, publicas la lectura mediante la descripción accesible y anotas el coste de un repintado en tus propias notas.

  4. LecturaEjercicio de programación con IA · 20 min

    Construye el ejemplo VisualOperationsStudio de este módulo con ChatGPT o Claude a partir de un prompt listo para usar que dirige al modelo a la especificación del módulo, y después revisa, ejecuta y amplía lo que te devuelva.

    Leer la guía de la lección (PDF)

  5. CuestionarioEvaluación de conocimientos — Módulo 2 · 10 min · Nota mínima 80%
  6. Laboratorio prácticoLaboratorio — Un indicador de telemetría dibujado y reutilizable · 45 min

    Objetivo: Añade a VisualOperationsStudio un control TelemetryGauge reutilizable que dibuje un anillo, zonas de umbral coloreadas, una aguja, un valor numérico y un rótulo. Dale propiedades Value, Minimum, Maximum, WarningThreshold y CriticalThreshold cuyos setters acoten la entrada, salgan de inmediato cuando nada haya cambiado y llamen a Invalidate() una sola vez. Pon los cálculos de coordenadas en un ayudante puro GaugeGeometry que reciba un Rectangle y devuelva los límites del anillo, los ángulos de barrido, los puntos de la aguja y el rectángulo de la etiqueta; después dibuja a partir de esos valores con pens, brushes y un GraphicsPath declarados con using, sin tocar el Graphics que se te entrega. Gestiona un control de tamaño cero, un rango invertido y un valor fuera de rango sin lanzar excepciones, y expón la lectura mediante AccessibleDescription para que no exista solo como píxeles. Entregables: Control TelemetryGauge con propiedades Value, Minimum, Maximum y de umbral que acotan el valor y llaman a Invalidate() una vez por cambio real; Ayudante puro GaugeGeometry que devuelve los límites del anillo, los ángulos de barrido, los puntos de la aguja y el rectángulo de la etiqueta; Controlador de Paint que libera todos los pens, brushes, fuentes y paths que crea y nunca libera e.Graphics; Comprobaciones para tamaño cero, rango invertido y valores fuera de rango, con un AccessibleDescription que lleve la lectura; PaintCost.md que anote el tamaño del redibujado, con qué frecuencia se redibuja y cuándo saldría más barato un control con tema.

Módulo 3: Dibujo de celdas en DataGridView

Módulo 3 de Dibujo y pintura en Wisej.NET — crea gráficos personalizados con Paint, CellPaint, Canvas y System.Drawing.Managed multiplataforma. Lee la guía de la lección y la guía del laboratorio / examen, mira el recorrido guiado sobre el dibujo de celdas en DataGridView, supera la evaluación de conocimientos y después completa el laboratorio práctico en VisualOperationsStudio.

  1. LecturaGuía de la lección · 14 min

    Dibujar dentro de la cuadrícula: UserPaint en el ámbito de celda o de columna, DataGridViewCellPaintEventArgs con RowIndex y ColumnIndex, celdas de progreso y sparkline que leen las filas de forma barata, y la comparación honesta con el contenido de celda AllowHtml en una cuadrícula de mil filas. Qué significa esto para un desarrollador .NET con experiencia que ya construye pantallas Wisej.NET y ahora necesita gráficos personalizados, y cómo leer este módulo.

    Leer la guía de la lección (PDF)

  2. LecturaGuía del laboratorio / examen · 10 min

    Lo que construirás en el laboratorio práctico, el enfoque sugerido y los entregables requeridos.

    Leer la guía de la lección (PDF)

  3. Lección en vídeoSparklines e indicadores dentro de las celdas de la cuadrícula, a escala · 14 min

    Sparklines e indicadores dentro de las celdas de la cuadrícula, a escala: un recorrido guiado del Módulo 3, construido paso a paso en VisualOperationsStudio. Se ejecuta aquí mismo, en el reproductor.

    Transcripción de la narración

    En este módulo es la cuadrícula quien dibuja. Visual Operations Studio muestra ahora mil máquinas, y dos de sus columnas tienen que leerse de un vistazo, en lugar de número a número.

    Hay tres formas de llegar ahí. Un número enlazado que nadie mira es honesto pero inútil. Un control indicador en cada fila es legible y ruinoso, porque eso son mil controles de servidor vivos en una sola sesión. La tercera opción es una celda que se dibuja sola, y solo mientras está visible de verdad.

    El dibujo por el usuario va siempre antes que el dibujo de celda: pasas una celda o una columna entera a modo dibujado por el usuario, y solo entonces la cuadrícula lanza para ella su evento de dibujo de celda. Sus argumentos derivan de los de dibujo normales, así que llevan la superficie de gráficos y el rectángulo de recorte, y añaden los índices de fila y columna que necesitas para enrutar.

    Una diferencia importa más que las demás. Los argumentos de evento de Wisej.NET no traen ayudantes para dibujar el fondo ni el contenido, así que tu controlador es responsable de todo lo que aparece en esa celda. Copiar tal cual un ejemplo de Windows Forms no va a funcionar. Suscríbete una sola vez en la cuadrícula y bifurca según las dos columnas que son tuyas.

    Protege antes de dibujar. Un índice de fila negativo es una cabecera y no una fila de datos, y una columna que no es tuya sale de inmediato. Solo entonces toma la geometría del rectángulo de recorte y lee los valores que necesitas, en un único paso, del objeto al que la fila ya está enlazada.

    Al ejecutarlo, seis filas visibles producen doce llamadas al controlador: una barra coloreada por umbrales para la salud y un pequeño gráfico de líneas para la tendencia. La fila seleccionada se dibuja con sus propios colores, porque una celda dibujada que ignora la selección parece rota en cuanto alguien hace clic.

    Ahora desplázate por las mil filas. Cada celda que se hace visible vuelve a llamar al controlador, y eso lo convierte en una ruta crítica. Por eso dentro no hay acceso a archivos ni a base de datos, no se crean fuentes ni imágenes por celda, y leer los valores de una fila debe seguir siendo un paso de tiempo constante.

    Después haz la comparación honesta. El marcado de celda gana para texto, iconos y accesibilidad. El dibujo gana para la geometría que el marcado no sabe expresar. Y un tipo de celda real gana siempre que el usuario tenga que interactuar con la celda y no solo leerla.

    En el tercer laboratorio construyes dos columnas dibujadas detrás de un único controlador protegido, lees los valores de cada fila en un solo paso, después construyes ese mismo indicador de estado otra vez como celda de marcado y anotas cuál de los dos enviarías realmente a producción.

  4. LecturaEjercicio de programación con IA · 20 min

    Construye el ejemplo VisualOperationsStudio de este módulo con ChatGPT o Claude a partir de un prompt listo para usar que dirige al modelo a la especificación del módulo, y después revisa, ejecuta y amplía lo que te devuelva.

    Leer la guía de la lección (PDF)

  5. CuestionarioEvaluación de conocimientos — Módulo 3 · 10 min · Nota mínima 80%
  6. Laboratorio prácticoLaboratorio — Celdas de progreso y sparkline dibujadas por el usuario · 45 min

    Objetivo: Dota a VisualOperationsStudio de una cuadrícula de operaciones con dos columnas dibujadas por el usuario. Añade columnas explícitas a gridOperations, activa UserPaint = true solo en las columnas Health y Trend y gestiona CellPaint una única vez: sal de inmediato cuando e.RowIndex sea negativo o e.ColumnIndex no sea una de las dos columnas objetivo, y después dibuja una barra de progreso coloreada por umbrales para Health y una sparkline de polilínea para Trend dentro de e.ClipRectangle. Lee los valores de cada fila del objeto MachineStatus enlazado en lugar de buscar en una lista dentro del controlador, respeta los colores de la fila seleccionada y mantén el controlador libre de efectos secundarios. Enlaza 1000 filas generadas, desplázate por ellas y después construye el mismo indicador de estado una segunda vez como celda AllowHtml, para poder dejar por escrito cuál de los dos llevarías a producción. Entregables: gridOperations con columnas explícitas y UserPaint = true solo en las columnas Health y Trend; Un único controlador de CellPaint que comprueba e.RowIndex y e.ColumnIndex antes de dibujar nada; Celda de progreso coloreada por umbrales y celda de sparkline de polilínea dibujadas dentro de e.ClipRectangle; Valores de fila leídos del objeto MachineStatus enlazado, sin búsquedas, reservas de memoria ni creación de controles por celda; Una columna de estado con AllowHtml construida en paralelo, más una nota que compare ambas en un desplazamiento por 1000 filas.

Módulo 4: Wisej.Web.Canvas y el modelo Canvas 2D de HTML5

Módulo 4 de Dibujo y pintura en Wisej.NET — crea gráficos personalizados con Paint, CellPaint, Canvas y System.Drawing.Managed multiplataforma. Lee la guía de la lección y la guía del laboratorio / examen, mira el recorrido guiado sobre Canvas 2D, supera la evaluación de conocimientos y después completa el laboratorio práctico en VisualOperationsStudio.

  1. LecturaGuía de la lección · 14 min

    Leer la documentación de Canvas 2D del navegador y escribir el equivalente en Wisej.NET: miembros en PascalCase en Wisej.Web.Canvas, ángulos en grados donde el navegador usa radianes, Save y Restore alrededor de las transformaciones, degradados, patrones, sombras y recortes, y Redraw como el único lugar donde se reconstruye una escena. Qué significa esto para un desarrollador .NET con experiencia que ya construye pantallas Wisej.NET y ahora necesita gráficos personalizados, y cómo leer este módulo.

    Leer la guía de la lección (PDF)

  2. LecturaGuía del laboratorio / examen · 10 min

    Lo que construirás en el laboratorio práctico, el enfoque sugerido y los entregables requeridos.

    Leer la guía de la lección (PDF)

  3. Lección en vídeoTraduce un ejemplo de canvas del navegador a C# de Wisej · 14 min

    Traduce un ejemplo de canvas del navegador a C# de Wisej: un recorrido guiado del Módulo 4, construido paso a paso en VisualOperationsStudio. Se ejecuta aquí mismo, en el reproductor.

    Transcripción de la narración

    Visual Operations Studio necesita ahora una superficie de dibujo de verdad. El Canvas de Wisej.NET te da el contexto de dibujo bidimensional del navegador desde C#, con una condición: no recuerda nada por ti.

    Paint y el dibujo de celdas envían los dos una imagen terminada, y el servidor sabe qué contiene esa imagen. Un Canvas envía en cambio comandos de dibujo que ejecuta el navegador. Nada se retiene en el servidor, y un redimensionado puede borrar el resultado, así que la escena tiene que existir en algún sitio que tú controles.

    Traducir un ejemplo del navegador son tres pasadas. Ajusta el uso de mayúsculas, porque los miembros son los de siempre con la convención de C#. Cambia las cadenas de estilo por tipos de .NET, como colores y fuentes. Convierte los ángulos de radianes a grados. Y confirma que el miembro existe de verdad, en vez de suponer que todo lo del navegador se trasladó.

    El evento de redibujado llama exactamente a un método. Ese método empieza limpiando toda la superficie, y cada forma abre un trazado nuevo antes de dibujarse. Sáltate ese paso y un trazo posterior arrastrará consigo el contorno anterior, que es una de las formas más comunes de que un ejemplo traducido salga mal.

    El texto se coloca con las propiedades de alineación y de línea base, en lugar de medirse, porque la llamada de medición del navegador no forma parte de la superficie documentada. Los degradados son objetos por derecho propio: construyes uno y después lo asignas como estilo de relleno, en vez de describirlo dentro de cada llamada.

    Cada transformación va entre un Save y un Restore. También la región de recorte, también la transparencia, y también el patrón de guiones y la sombra, porque todos ellos son estado del Canvas y no argumentos de una sola llamada. Acotarlos así evita que una sección se filtre en la siguiente.

    Cinco secciones se emiten juntas en una sola actualización, porque la actualización en vivo está desactivada por defecto. Actívala solo cuando una operación larga de servidor deba ir mostrando su progreso mientras trabaja. No es una forma de animar, y una petición por fotograma es la arquitectura equivocada.

    Merece la pena ver dos fallos a propósito. Redimensiona la superficie y se queda en blanco hasta que el redibujado la reconstruye desde el modelo. Quita una llamada a Restore y todo lo dibujado después se desvía de su sitio. Ninguno de los dos aparece en el diseñador, y justo por eso cuestan tanto tiempo.

    En el cuarto laboratorio dibujas el área de pruebas entera desde un único método al que llama el redibujado, acotas cada transformación, añades un recorte, una sección de transparencia, un guionado y una sombra, y portas un ejemplo medido en radianes a los grados que espera la rotación de Wisej.NET.

  4. LecturaEjercicio de programación con IA · 20 min

    Construye el ejemplo VisualOperationsStudio de este módulo con ChatGPT o Claude a partir de un prompt listo para usar que dirige al modelo a la especificación del módulo, y después revisa, ejecuta y amplía lo que te devuelva.

    Leer la guía de la lección (PDF)

  5. CuestionarioEvaluación de conocimientos — Módulo 4 · 10 min · Nota mínima 80%
  6. Laboratorio prácticoLaboratorio — Un área de pruebas de Canvas reconstruida por Redraw · 45 min

    Objetivo: Construye en VisualOperationsStudio una página de pruebas de Canvas que traslade un conjunto de ejemplos de Canvas 2D del navegador a la API documentada de Wisej.Web.Canvas. Haz que todo dependa de un método DrawPlayground invocado por el evento Redraw del Canvas, para que la escena vuelva a aparecer tras un redimensionado, y empiézalo con un ClearRect sobre toda la superficie. Dibuja un trazado con contorno, rectángulos rellenos, un rótulo colocado, un degradado lineal y un degradado radial; después envuelve cada sección transformada en Save() y Restore() y demuestra Translate, Scale, Rotate y SetTransform. Añade una región recortada, una sección con globalAlpha, una línea discontinua y una sombra, traslada un ejemplo del navegador que gira Math.PI / 4 al valor en grados que Wisej espera, y mantén LiveUpdate desactivado en el render principal mientras lo muestras en un pequeño ejemplo progresivo. Entregables: Área de pruebas de Canvas cuya escena completa dibuja un método DrawPlayground llamado desde Redraw; Trazados, rectángulos, un rótulo colocado, un degradado lineal y uno radial usando únicamente miembros documentados de Wisej.Web.Canvas; Save() y Restore() alrededor de cada sección con Translate, Scale, Rotate y SetTransform; Recorte, alfa, una línea discontinua y una sombra, más una conversión de radianes a grados escrita en un comentario; Una demostración de LiveUpdate separada del render principal, con una nota sobre cuándo es apropiado.

Módulo 5: Canvas interactivo: estado, entrada, prueba de impacto y rendimiento

Módulo 5 de Dibujo y pintura en Wisej.NET — crea gráficos personalizados con Paint, CellPaint, Canvas y System.Drawing.Managed multiplataforma. Lee la guía de la lección y la guía del laboratorio / examen, mira el recorrido guiado sobre el canvas interactivo, supera la evaluación de conocimientos y después completa el laboratorio práctico en VisualOperationsStudio.

  1. LecturaGuía de la lección · 14 min

    Convertir un Canvas en un editor: el bucle Modelo, Entrada, Estado y Render; los eventos de puntero y táctiles que llegan desde Control; la conversión de pantalla a mundo para que la prueba de impacto sobreviva al desplazamiento y al zoom; estado de escena por sesión en lugar de campos estáticos; descarte por viewport; y el punto en el que un bucle en el cliente sustituye a los viajes de ida y vuelta al servidor. Qué significa esto para un desarrollador .NET con experiencia que ya construye pantallas Wisej.NET y ahora necesita gráficos personalizados, y cómo leer este módulo.

    Leer la guía de la lección (PDF)

  2. LecturaGuía del laboratorio / examen · 10 min

    Lo que construirás en el laboratorio práctico, el enfoque sugerido y los entregables requeridos.

    Leer la guía de la lección (PDF)

  3. Lección en vídeoSelección, arrastre, desplazamiento y zoom sin perder la escena · 14 min

    Selección, arrastre, desplazamiento y zoom sin perder la escena: un recorrido guiado del Módulo 5, construido paso a paso en VisualOperationsStudio. Se ejecuta aquí mismo, en el reproductor.

    Transcripción de la narración

    El Canvas olvida, y el modelo no debe. En este módulo el área de pruebas del módulo anterior se convierte en un editor de topología con selección, arrastre, desplazamiento y zoom, y cada uno de esos gestos tiene que sobrevivir a un redibujado.

    Un rectángulo en el navegador no es una bomba. El significado vive en el objeto de escena del servidor: los nodos, las aristas, cuál está seleccionado, dónde está el viewport. La entrada cambia ese estado, y un único método de render convierte el estado en llamadas de dibujo. El renderizador nunca decide nada.

    El render convierte coordenadas de mundo en coordenadas de pantalla aplicando el zoom y después el desplazamiento. La prueba de impacto ejecuta esa conversión al revés, y devuelve la posición del puntero a coordenadas de mundo antes de compararla con un nodo. El Canvas no ofrece ninguna prueba de punto dentro de trazado, así que esa aritmética es cosa tuya.

    Empieza por el modelo. Los nodos y las aristas llevan identificadores estables y su propia geometría, y la escena que los contiene vive por sesión, nunca en un campo estático mutable que todos los usuarios compartirían. La prueba de impacto recorre la lista hacia atrás, así que el nodo dibujado el último, y por tanto el de encima, es el que obtiene el usuario.

    Los tres controladores de puntero hacen poco. Al bajar el ratón se convierte y se hace la prueba de impacto, al moverlo se arrastra la selección o se desplaza el viewport, y al soltarlo acaba el gesto. Cada uno cambia el estado y llama al único método de render. El redibujado llama a ese mismo método, y por eso un redimensionado reconstruye la escena.

    Cuando redibujar cuesta demasiado, baja por una escalera: primero menos primitivas, después descarta lo que queda fuera de pantalla, luego simplifica la geometría y después guarda en caché las capas que casi no cambian. Llevar el bucle al navegador es el último paso, no el primero, y la actualización en vivo sigue desactivada para el render principal.

    En el navegador el clic se convierte a coordenadas de mundo, encuentra la segunda bomba, la marca como seleccionada y renderiza. Mira cómo sube el número de peticiones mientras arrastras. Esa cifra es lo que cuesta de verdad un arrastre en el servidor, y es la medición que te dice cuándo parar.

    Haz zoom alrededor del puntero y la selección sigue cayendo en el nodo correcto, porque la conversión inversa tiene en cuenta el nuevo zoom. Los nodos fuera del rectángulo visible se descartan por completo. Y la tecla de tabulación con las flechas alcanza todos los nodos, así que el editor no exige un ratón para ser usable.

    En el quinto laboratorio construyes la escena por sesión, haces la prueba de impacto en coordenadas de mundo, mantienes los tres controladores llamando a un único método de render, descartas lo que queda fuera de pantalla, añades la vía de teclado y anotas cuándo llevarías la interacción al navegador.

  4. LecturaEjercicio de programación con IA · 20 min

    Construye el ejemplo VisualOperationsStudio de este módulo con ChatGPT o Claude a partir de un prompt listo para usar que dirige al modelo a la especificación del módulo, y después revisa, ejecuta y amplía lo que te devuelva.

    Leer la guía de la lección (PDF)

  5. CuestionarioEvaluación de conocimientos — Módulo 5 · 10 min · Nota mínima 80%
  6. Laboratorio prácticoLaboratorio — Un editor de topología con prueba de impacto basada en el modelo · 45 min

    Objetivo: Convierte el área de pruebas de Canvas en un editor de topología para VisualOperationsStudio. Crea las clases NodeModel y EdgeModel con identificadores estables y geometría en coordenadas de mundo, guarda la escena en un objeto TopologyScene almacenado por sesión en lugar de en un campo estático, y deja RenderScene como el único método que dibuja. Añade conversiones ToWorld y ToScreen para el desplazamiento y el factor de zoom actuales; después gestiona MouseDown para hacer la prueba de impacto contra los límites de los nodos en coordenadas de mundo y marcar Selected, MouseMove para arrastrar el nodo seleccionado o desplazar el viewport, y MouseUp para terminar el gesto, cambiando cada uno el estado y llamando después a RenderScene. Añade zoom con la rueda o con botones centrado en el puntero, omite al dibujar los nodos que quedan fuera del rectángulo visible, da a quien usa el teclado una forma de seleccionar y desplazar un nodo, y registra el tráfico de peticiones que genera un arrastre junto con el punto a partir del cual llevarías el bucle a JavaScript en el cliente. Entregables: NodeModel, EdgeModel y un TopologyScene por sesión con identificadores estables y sin estado estático mutable; Conversiones ToWorld y ToScreen usadas en la prueba de impacto para que la selección siga siendo correcta tras desplazar y hacer zoom; Controladores de MouseDown, MouseMove y MouseUp que cambian el estado y después llaman al único método RenderScene; Descarte de los nodos que quedan fuera del rectángulo visible, más una vía de teclado para seleccionar y desplazar un nodo; InteractionNotes.md con el tráfico de peticiones medido durante un arrastre y el límite a partir del cual pasarías al cliente.

Módulo 6: System.Drawing.Managed en Windows, Linux, macOS, iOS y Android

Módulo 6 de Dibujo y pintura en Wisej.NET — crea gráficos personalizados con Paint, CellPaint, Canvas y System.Drawing.Managed multiplataforma. Lee la guía de la lección y la guía del laboratorio / examen, mira el recorrido guiado sobre el dibujo gestionado multiplataforma, supera la evaluación de conocimientos y después completa el laboratorio práctico en VisualOperationsStudio.

  1. LecturaGuía de la lección · 14 min

    Renderizado fuera de pantalla que funciona en todas partes: por qué System.Drawing.Common solo funciona en Windows en el .NET moderno, qué son realmente el paquete Managed.System.Drawing y el ensamblado System.Drawing.Managed, la matriz de fuentes y gráficos de Wisej.NET 4, una política de fuentes determinista, y cómo elegir entre él, ImageSharp, SkiaSharp, Aspose.Drawing y Microsoft.Maui.Graphics según el caso de uso. Qué significa esto para un desarrollador .NET con experiencia que ya construye pantallas Wisej.NET y ahora necesita gráficos personalizados, y cómo leer este módulo.

    Leer la guía de la lección (PDF)

  2. LecturaGuía del laboratorio / examen · 10 min

    Lo que construirás en el laboratorio práctico, el enfoque sugerido y los entregables requeridos.

    Leer la guía de la lección (PDF)

  3. Lección en vídeoGenera un PNG en el servidor que también funciona en Linux · 14 min

    Genera un PNG en el servidor que también funciona en Linux: un recorrido guiado del Módulo 6, construido paso a paso en VisualOperationsStudio. Se ejecuta aquí mismo, en el reproductor.

    Transcripción de la narración

    Este módulo produce un archivo en lugar de una pantalla. Operaciones quiere la misma topología como una imagen que puedan conservar, generada en un servidor que no tiene debajo ningún subsistema gráfico del tipo tradicional.

    Ninguna de las tres superficies anteriores puede hacerlo, porque cada una necesita un control vivo y una sesión viva. Y la biblioteca obvia también queda descartada: Microsoft hizo su paquete de dibujo clásico específico de Windows desde .NET 6, y el interruptor que lo reactivaba en otros sistemas desapareció en .NET 7.

    Tres nombres describen una sola cosa, y tenerlos claros te ahorra una tarde. El paquete que referencias es la distribución gestionada, el ensamblado en disco es la biblioteca de dibujo gestionada, y el espacio de nombres que usa tu código es el de siempre. Es un motor de renderizado gestionado, no un envoltorio sobre la capa gráfica de la plataforma.

    El renderizador recibe una escena y un tamaño de salida y devuelve bytes. Crea un bitmap, obtiene sobre él una superficie de gráficos, dibuja las aristas, los nodos y las etiquetas con pens, brushes y un trazado, y guarda el resultado en un flujo de memoria como PNG. No aparece ningún control por ninguna parte.

    Memoriza la matriz de plataformas. La medición de fuentes es gestionada en todas partes. El dibujo es gestionado en el .NET moderno en todos los sistemas operativos, y recae en la capa de la plataforma en .NET Framework y en la compilación del diseñador. Nunca ates un despliegue multiplataforma a un destino solo de Windows para quitarte de encima un problema de dibujo.

    Dos decisiones deciden después si esto sobrevive al despliegue. Resuelve la fuente mediante una cadena que termine en algo que entregues tú mismo, en lugar de dar por hecho que la fuente existe en el host. Y mantén exactamente una implementación de dibujo en el grafo de referencias, porque dos de ellas resolviendo los mismos nombres de tipo son un problema que no disfrutarás diagnosticando.

    Ejecútalo. La exportación se renderiza fuera de pantalla en unos treinta y cuatro milisegundos sin ningún control implicado, y los bytes se entregan al navegador como una descarga. Eso sí, acota el tamaño pedido: un bitmap de cuatro mil píxeles de ancho por tres mil de alto cuesta unos cuarenta y ocho megabytes antes de haber dibujado nada.

    Ahora el contenedor. La misma prueba pasa en Linux, nada se enlaza con la biblioteca gráfica nativa de la plataforma, y las dos imágenes salen idénticas byte a byte, porque la fuente viajó con la aplicación en lugar de tomarse prestada del host.

    En el sexto laboratorio construyes el renderizador sin controles, le das una cadena de reserva de fuentes, descargas la imagen desde la página, revisas las referencias por si hay una segunda implementación de dibujo y registras tus evidencias de Windows y de Linux junto con lo que implican para los destinos móviles y de escritorio.

  4. LecturaEjercicio de programación con IA · 20 min

    Construye el ejemplo VisualOperationsStudio de este módulo con ChatGPT o Claude a partir de un prompt listo para usar que dirige al modelo a la especificación del módulo, y después revisa, ejecuta y amplía lo que te devuelva.

    Leer la guía de la lección (PDF)

  5. CuestionarioEvaluación de conocimientos — Módulo 6 · 10 min · Nota mínima 80%
  6. Laboratorio prácticoLaboratorio — Un renderizador PNG fuera de pantalla que viaja · 45 min

    Objetivo: Añade a VisualOperationsStudio un TopologyImageRenderer que convierta el modelo de topología en un PNG sin tocar ningún control de Wisej. Dale un método Render que reciba la escena y un tamaño de salida, cree el Bitmap, obtenga su Graphics con Graphics.FromImage, dibuje nodos, aristas, etiquetas y una leyenda con pens, brushes y un GraphicsPath, y libere todo lo que le pertenece sin tocar los objetos de quien lo llama. Resuelve su Font mediante un método ResolveFont que pruebe una familia proporcionada por la aplicación y recurra a otra que sepas presente, en lugar de dar por hecho que existe una fuente del sistema; guarda el resultado como PNG en un MemoryStream y entrega los bytes a la página para su descarga. Después revisa las referencias del proyecto para confirmar que no estás añadiendo System.Drawing.Common junto a la implementación gestionada de Wisej, ejecuta o prepara el renderizador en Windows y en un contenedor Linux, y documenta cómo se comporta el mismo código en destinos iOS, Android y macOS Hybrid. Entregables: TopologyImageRenderer sin dependencia de ningún control de Wisej, que dibuja con Graphics.FromImage sobre un Bitmap; Método ResolveFont con una cadena de alternativas explícita en lugar de una fuente del sistema dada por supuesta; PNG escrito en un MemoryStream y descargado desde la página, con todos los objetos gráficos propios liberados; Comprobación de referencias que confirme que se usa Managed.System.Drawing y que System.Drawing.Common no se añade junto a él; CrossPlatform.md con evidencias en Windows y en un contenedor Linux, y las implicaciones para iOS, Android y macOS.

Módulo 7: Arquitectura de dibujo en producción, rendimiento y proyecto final

Módulo 7 de Dibujo y pintura en Wisej.NET — crea gráficos personalizados con Paint, CellPaint, Canvas y System.Drawing.Managed multiplataforma. Lee la guía de la lección y la guía del laboratorio / examen, mira el recorrido guiado sobre la arquitectura en producción y el proyecto final, supera la evaluación de conocimientos y después completa el laboratorio práctico en VisualOperationsStudio.

  1. LecturaGuía de la lección · 14 min

    Llevar el código de dibujo a producción: un único modelo visual con una capa de geometría pura y renderizadores separados por superficie, instrumentación del tiempo de renderizado y del tamaño de la carga útil, perfilado de una ruta dibujada frente a una ruta fuera de pantalla, comportamiento ante redimensionados, temas, datos vacíos y fuentes ausentes, un equivalente textual accesible, y el proyecto final Visual Operations Studio. Qué significa esto para un desarrollador .NET con experiencia que ya construye pantallas Wisej.NET y ahora necesita gráficos personalizados, y cómo leer este módulo.

    Leer la guía de la lección (PDF)

  2. LecturaGuía del laboratorio / examen · 10 min

    Lo que construirás en el laboratorio práctico, el enfoque sugerido y los entregables requeridos.

    Leer la guía de la lección (PDF)

  3. Lección en vídeoUn modelo, cuatro renderizadores, medido y listo para producción · 14 min

    Un modelo, cuatro renderizadores, medido y listo para producción: un recorrido guiado del Módulo 7, construido paso a paso en VisualOperationsStudio. Se ejecuta aquí mismo, en el reproductor.

    Transcripción de la narración

    Este es el proyecto final. Seis módulos han construido cuatro superficies de renderizado en Visual Operations Studio, cada una correcta por su cuenta. Entregarlas significa ponerlas de acuerdo entre sí, y demostrar que lo están.

    Ahora mismo cada superficie guarda sus propios umbrales, sus propios colores y su propia idea de dónde va cada cosa. Mueve una vez la línea de aviso y la imagen exportada contradice en silencio a la pantalla de la que salió. Eso no es un fallo de renderizado; son cuatro copias de la misma regla de negocio.

    El remedio son tres capas. Un modelo visual guarda el estado semántico: valores, estados, selección. Una capa de geometría convierte ese estado y un tamaño en formas, y es aritmética pura. Y después un renderizador por superficie, cada uno conservando las primitivas que le van bien, porque forzarlos a través de una interfaz común no ayuda a nadie.

    Después, fija las cifras antes de optimizar nada. Un control dibujado debería quedarse por debajo de unos cinco milisegundos. Un redibujado completo del Canvas pertenece al rango de dieciséis a cincuenta milisegundos. Una exportación puede ser más lenta que cualquiera de los dos, siempre que nunca bloquee la sesión de otro usuario mientras se ejecuta.

    La llamada de geometría recibe el modelo y un tamaño y devuelve formas, y los dos renderizadores la llaman, así que ninguno puede desviarse. A su alrededor, un pequeño ayudante de métricas registra cuánto tardó un render, cuán grande fue la salida y cuántos objetos de escena se dibujaron realmente. Sin esas tres cifras, ajustar es adivinar.

    Después dibuja los estados malos a propósito. Datos vacíos, una superficie sin tamaño, un rango cuyo mínimo supera al máximo, una fuente que falta: cada uno debería degradar a algo legible en lugar de lanzar una excepción. Y una exportación fallida debería llegar al usuario como un mensaje, no como un hueco en blanco donde se esperaba una imagen.

    Un valor cambia y las cuatro superficies lo siguen: el indicador dibujado, las celdas dibujadas, la topología en Canvas y la imagen exportada. Junto a ellas hay una tabla sencilla que lista cada lectura, y eso es lo que pone la información al alcance de quien no puede usar los gráficos en absoluto.

    Por último, las evidencias. El indicador dibujado bajó de unos once milisegundos a cuatro, la exportación de unos trescientos diez milisegundos a ciento veintiocho, y la matriz de pruebas cubre Windows, Linux, los destinos híbridos y tres navegadores. Una decisión medida de no optimizar también cuenta, siempre que quede por escrito.

    El laboratorio final es el proyecto final: un único modelo detrás de las cuatro superficies, un ayudante de métricas, una optimización que mediste antes y después, cuatro rutas degradadas que fallan con elegancia y las notas que explican la arquitectura y la frontera que respeta.

  4. LecturaEjercicio de programación con IA · 20 min

    Construye el ejemplo VisualOperationsStudio de este módulo con ChatGPT o Claude a partir de un prompt listo para usar que dirige al modelo a la especificación del módulo, y después revisa, ejecuta y amplía lo que te devuelva.

    Leer la guía de la lección (PDF)

  5. CuestionarioEvaluación de conocimientos — Módulo 7 · 10 min · Nota mínima 80%
  6. Laboratorio prácticoLaboratorio — Proyecto final: Visual Operations Studio · 45 min

    Objetivo: Completa el proyecto final de VisualOperationsStudio poniendo un único modelo detrás de las cuatro superficies. Reestructura el proyecto en carpetas Models, Geometry, Renderers y de adaptadores de Wisej, de modo que el indicador dibujado, las celdas de cuadrícula dibujadas por el usuario, la topología en Canvas y la exportación a PNG lean todos el mismo OperationsModel y compartan la capa de geometría pura, sin duplicar estado de negocio en cada renderizador. Añade un ayudante RenderMetrics que registre la duración del renderizado, el tamaño del mapa de bits de salida y el número de objetos de la escena dibujados, y úsalo para comparar el indicador dibujado en el servidor con el renderizador fuera de pantalla, antes y después de una optimización que elijas y justifiques. Ejercita las rutas de fallo —datos vacíos, una superficie de tamaño cero, un rango no válido, una fuente ausente— para que cada una degrade a un marcador de posición legible en lugar de provocar una excepción, añade una tabla accesible que enumere todos los valores que muestran los gráficos y redacta las notas del proyecto final cubriendo la arquitectura, la frontera entre navegador y servidor y la matriz de pruebas. Entregables: Capas Models, Geometry, Renderers y de adaptadores con un único OperationsModel que alimenta las cuatro superficies; Ayudante RenderMetrics que registra la duración del renderizado, el tamaño del mapa de bits y el número de objetos dibujados por superficie; Mediciones antes y después de una optimización, con el razonamiento de por qué la elegiste; Rutas de fallo para datos vacíos, tamaño cero, rango no válido y fuente ausente que degradan en lugar de lanzar excepciones; CapstoneNotes.md con la arquitectura, la frontera servidor/navegador, la matriz de pruebas y una tabla de datos accesible.