7 puntos por GN⁺ 14 일 전 | 1 comentarios | Compartir por WhatsApp
  • Las apps modernas de Windows se han vuelto lentas y pesadas por su dependencia de frameworks basados en la web, y se ha perdido el control a nivel del sistema operativo que existía en la era de Win32
  • La API Win32 permitía definir libremente la forma de las ventanas mediante el bucle de mensajes y los objetos HRGN, y los diseños de ventana no estándar eran algo común
  • Usando mapas de bits y la tecnología de ventanas en capas, era posible implementar ventanas de forma libre con transparencia y animaciones
  • Sin embargo, las ventanas personalizadas fueron desapareciendo poco a poco por la complejidad de tener que implementar manualmente todas las funciones básicas y por el cambio en la preferencia de los usuarios hacia la simplicidad
  • Aun así, Win32 sigue ofreciendo libertad para controlar ventanas y experimentar, y mantiene la posibilidad de crear software de escritorio creativo

La monotonía de las apps modernas de Windows y la libertad perdida de Win32

  • En los últimos años, la mayoría de las apps de escritorio para Windows funcionan sobre wrappers de navegador como React, Electron y Tauri, y se han convertido en estructuras complejas basadas en la web que son lentas y consumen demasiada memoria
    • Incluso un simple bloc de notas ocupa 50 MB de memoria, mientras que una app con la misma función escrita en Win32 C puro usa apenas 1.8 MB
    • Incluso con hardware moderno, el uso de memoria al iniciar Windows 11 llega al 77%
  • En la época en que se programaba directamente con la API Win32, se podía tener control total a nivel del sistema operativo
    • En ese entonces no era necesario quedarse dentro de ventanas rectangulares, y se podían crear libremente ventanas con formas no estándar
    • En la era de Windows XP, apps como Windows Media Player y muchas otras tenían apariencias distintivas

Las ventanas “de forma extraña” del pasado

  • Hubo un tiempo en que las apps de Windows se diseñaban con formas muy diversas para expresar identidad y personalidad
    • Los reproductores multimedia parecían hardware real, las mascotas de escritorio caminaban por la pantalla, y los paneles de utilidades se diseñaban como tableros de instrumentos, juguetes o consolas alienígenas
    • La forma de la ventana no tenía por qué ser rectangular, y el objetivo de la UI estaba más cerca de la personalidad que de la usabilidad
  • La razón por la que hoy casi no se ve este tipo de diseño es que los programadores ya no controlan la ventana en sí
    • La mayoría de los frameworks modernos de UI ocultan el sistema operativo, y los desarrolladores solo trabajan dentro de un área rectangular limitada

La estructura basada en mensajes de Win32 y el control de ventanas

  • El núcleo de la programación en Win32 está en el bucle de mensajes de eventos
    • El bucle compuesto por GetMessage, TranslateMessage y DispatchMessage es la base de todo el funcionamiento
    • La conducta de la ventana se define procesando mensajes como “WM_CREATE”, “WM_PAINT”, “WM_SIZE” y “WM_DESTROY”
  • Con HRGN (Region Object) se puede cambiar libremente la forma de una ventana
    • Si se asigna una región a una ventana con SetWindowRgn, solo esa región se reconoce como la ventana real
    • En el código de ejemplo, se crea una ventana elíptica con CreateEllipticRgn y se implementa manualmente la función de arrastre sin barra de título
    • Al recibir “WM_LBUTTONDOWN”, se envía “WM_NCLBUTTONDOWN” con “HTCAPTION” para simular el movimiento de la ventana
  • Así, darle forma a la ventana es fácil, pero el verdadero desafío es tener que implementar por cuenta propia las funciones que antes ofrecía el marco básico

Ventanas basadas en mapas de bits y ventanas en capas

  • El ejemplo “drivenbyimage/main.c” define la forma de la ventana a partir de datos de mapa de bits
    • Carga “shape.bmp” y establece como región de la ventana los píxeles excepto el color transparente (magenta)
    • El mapa de bits funciona al mismo tiempo como imagen dibujada en pantalla y como forma real de la ventana
    • En el pasado, las apps con skins implementaban así formas variadas como perros, naves espaciales, radios o caras de personajes
  • Sin embargo, las regiones basadas en mapas de bits tienen bordes duros y no permiten semitransparencia
    • Para bordes suaves o animaciones, hace falta una ventana en capas (WS_EX_LAYERED)
  • En el ejemplo “Animated/”, una imagen de 32 bits con canal alfa transparente se sube con UpdateLayeredWindow
    • Con GDI+ se dibuja una hoja de sprites en un mapa de bits en memoria para ir cambiando cuadros, y luego se muestra en el escritorio
    • La forma de la ventana no queda fija, sino que el estado actual de los píxeles se convierte en la forma misma de la ventana
    • Este método soporta transparencia suave, cambios de forma por cuadro y animaciones naturales

La dificultad de las ventanas personalizadas y el cambio cultural

  • Al crear ventanas personalizadas con la API Win32, hay que manejar manualmente todos los detalles del comportamiento
    • Arrastre, cambio de tamaño, cierre, entrada de teclado, compatibilidad con DPI y otras funciones que una ventana básica resolvía automáticamente deben implementarse a mano
    • Hacer un prototipo es fácil, pero pulirlo hasta convertirlo en un producto bien terminado requiere mucho costo y esfuerzo
  • Los usuarios empezaron a preferir estabilidad y simplicidad por encima de estos experimentos visuales
    • Las ventanas no estándar solían asociarse con adware, barras de herramientas y utilidades innecesarias, lo que generó una percepción negativa
    • Como resultado, las “ventanas de forma extraña” empezaron a verse más como algo juguetón que como software serio

Las posibilidades vigentes y el significado de Win32

  • Aun así, Win32 sigue ofreciendo control directo y libertad para experimentar
    • Solo con mensajes, handles y APIs de dibujo, sigue siendo posible tener control de ventanas a nivel del sistema operativo
    • En la mayoría de los casos, una ventana rectangular es razonable, pero esto recuerda que su forma es una elección, no una obligación
  • El código de ejemplo está publicado en el repositorio de GitHub WierdApps
    • Incluye tres muestras: ventana elíptica, ventana basada en mapa de bits y mascota animada
    • Demuestra que Win32 todavía permite crear software de escritorio creativo y experimental

1 comentarios

 
GN⁺ 14 일 전
Comentarios en Hacker News
  • Ojalá no vuelvan las ventanas con formas raras
    Que se pueda hacer no significa que se deba hacer
    Que las apps hechas con wrappers de navegador como React, Electron y Tauri se vean todas parecidas hoy en día se debe a que no usan el framework GUI del sistema operativo
    Cuando una app usa widgets no estándar o colores y formas distintos por su cuenta, se arruinan la accesibilidad y la usabilidad
    Irónicamente, las apps que hoy enfatizan su “identidad” suelen ser cosas como paneles de control de drivers que meten los fabricantes de hardware, y ese es el peor bloatware de todos

    • Electron en realidad crea el problema opuesto. Todas las apps se ven distintas entre sí y no siguen las guías de la plataforma
    • La accesibilidad es una parte importante y además un requisito legal. Los frameworks GUI multiplataforma modernos manejan bien los lectores de pantalla para personas con discapacidad visual y el soporte HiDPI
    • Aun así, a mí esas formas de ventana inusuales me parecen geniales. Si alguien quiere intentarlo otra vez, bienvenido sea
    • En la época de Vista vi muchas UIs no estándar hechas con WPF y XAML, pero al redimensionar la ventana o moverla entre monitores el escalado se rompía y al final solo quedaba la incomodidad
    • Yo pienso exactamente lo contrario. Quiero volver a hacer que las computadoras sean divertidas y geniales como antes. Ahora todo parece un archivador. Las partes divertidas de la vida siempre han sido opcionales
  • Me gusta Win32, pero creo que la vieja cultura de skins raros fue una señal temprana de la mentalidad actual de “branding = identidad”
    Eso terminó llevando a la proliferación de Electron y bibliotecas de widgets a medio hacer
    A menos que sea una app especializada como Blender o Ardour, una GUI con mucha personalidad no debería ser prioridad

    • Las apps de Electron se ven todas iguales. En cambio, los skins de Win32 como Winamp al menos tenían personalidad
      Los sistemas operativos actuales ya no son para uso personal, sino para empresas. La época de Win3.1 a XP fue la verdadera era de la computación personal
    • Para una app de oficina común, lo correcto es usar controles nativos, pero en casos como iPad o dispositivos inteligentes, donde toda la pantalla usa una UI personalizada, puede verse bien y funcionar bien
  • Las apps actuales basadas en React no tienen consistencia ni con el sistema operativo ni entre ellas
    La UI cambia cada 6 meses, pero la UX no mejora. La accesibilidad (a11y) está completamente olvidada

  • Antes, el software lo hacía un grupo pequeño de personas y se mantenía estable durante mucho tiempo
    Ahora se pasó a iteración rápida y equipos grandes, y el diseño plano es el resultado que mejor encaja en ese entorno
    El diseño skeuomórfico es caro porque obliga a rehacer continuamente los recursos visuales
    Al final, vivimos en una época donde lo prioritario es la velocidad y la escala. Como cuando los muebles ensamblados en plano reemplazaron a los muebles tallados a mano

    • En realidad, incluso con la API Win32 no hace falta implementar todo a mano. Basta con delegar el manejo básico de mensajes
    • El diseño skeuomórfico exageraba tanto la imitación de la realidad que se volvía visualmente complejo y desordenado. La dirección era buena, pero era difícil de implementar
    • Al final, la razón es reducir costos. Se renuncia a una mejor usabilidad, igual que cuando los botones de un auto se reemplazan por una gran pantalla táctil
  • Con la era HiDPI, ya no es fácil dibujar la UI píxel por píxel como antes
    En la época de Win95 a XP era rápido y usaba poca memoria porque se dibujaba directamente en el front buffer, pero ahora cada ventana mantiene su propio buffer de respaldo y eso consume más RAM

  • Al leer la frase “The point was usually not usability. It was identity.” pensé que parecía escrita por un LLM

    • A mí también me dio esa impresión. Aun así, se notaba que el autor quería decir algo
    • Todas las oraciones parecían generadas por un LLM
  • Antes desarrollé apps para Windows, y la interfaz Win32 solo se podía controlar en un 90% aproximadamente
    Recuerdo que, al intentar cambiar el tema de colores, tuve que reimplementar MessageBox por mi cuenta

    • Antes se podía modificar MessageBox con un Win32 Hook. Bastaba obtener el HWND con HCBT_CREATEWND y hacer subclassing
    • Si uno se mete más a fondo, a veces hay que hookear Win32U.dll en lugar de User32.dll
    • Volver a hacer todo eso manualmente es doloroso. Me pregunto si con Qt sería un poco mejor
  • Notepad hecho en C puro con Win32 solo usa 1.8 MB, pero los blocs de notas de hoy consumen 50 MB

    • Incluso un programa mínimo de “Hello World” necesita unos 500 KB. Las bibliotecas del sistema ocupan memoria por defecto
    • El Notepad de Windows 11 moderno incluye pestañas, texto con estilo y funciones de IA, así que usa 32 MB de base
      Hasta GNU Emacs usa menos memoria
      En cambio, EDIT.EXE en modo texto solo usa 520 KB, así que es mucho más eficiente
  • Antes existía una app para grabar CDs en Mac llamada Disco, y mientras grababa el disco aparecía una animación de humo elevándose sobre la ventana
    Steve Jobs la mostró personalmente en el escenario y le encantaba

  • También me alegró que en el artículo mencionaran a las mascotas de escritorio
    Hace poco vi un video de una mascota de escritorio hecha con Godot, y funciona en varias plataformas
    Requiere algo de trabajo manual, pero no llega al nivel de complejidad de Win32. Para quienes aman las mascotas de escritorio, es una muy buena opción