La API Win32 directa, las ventanas de formas extrañas y por qué casi todas desaparecieron
(warped3.substack.com)- 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,TranslateMessageyDispatchMessagees 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”
- El bucle compuesto por
- 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
CreateEllipticRgny 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
- Si se asigna una región a una ventana con
- 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)
- Para bordes suaves o animaciones, hace falta una ventana en capas (
- 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
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
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
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
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
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
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
Notepad hecho en C puro con Win32 solo usa 1.8 MB, pero los blocs de notas de hoy consumen 50 MB
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