API Win32 directe, fenêtres aux formes étranges, et pourquoi elles ont presque toutes disparu
(warped3.substack.com)- Les applications Windows modernes sont devenues lentes et lourdes à cause de leur dépendance à des frameworks basés sur le web, et ont perdu le niveau de contrôle offert par le système d’exploitation à l’époque de Win32
- L’API Win32 permettait de définir librement la forme des fenêtres via la boucle de messages et les objets HRGN, et les designs de fenêtres non standards étaient courants
- À l’aide de bitmaps et de la technologie des fenêtres en couches, il était possible de créer des fenêtres de forme libre avec transparence et animations
- Mais les fenêtres personnalisées ont progressivement disparu à cause de la complexité qui impose de réimplémenter manuellement toutes les fonctions de base et de l’évolution des préférences des utilisateurs vers plus de simplicité
- Malgré cela, Win32 offre toujours une liberté de contrôle et d’expérimentation et préserve la possibilité de créer des logiciels desktop créatifs
La monotonie des applications Windows modernes et la liberté perdue de Win32
- Aujourd’hui, la plupart des applications desktop Windows fonctionnent sur des wrappers de navigateur comme React, Electron, Tauri, et reposent sur des architectures web complexes lentes et très gourmandes en mémoire
- Même un simple bloc-notes peut occuper 50 Mo de mémoire, alors qu’une application équivalente écrite en pur Win32 C ne pèse que 1,8 Mo
- Même sur du matériel récent, l’utilisation mémoire atteint 77 % au démarrage de Windows 11
- À l’époque où l’on programmait directement avec l’API Win32, on disposait d’un contrôle total au niveau du système d’exploitation
- On n’était pas enfermé dans des fenêtres rectangulaires et il était possible de créer librement des fenêtres aux formes non standard
- À l’ère de Windows XP, diverses applications, dont Windows Media Player, affichaient des apparences originales
Les fenêtres « aux formes étranges » d’autrefois
- À une époque, les applications Windows adoptaient des formes variées pour exprimer leur identité et leur personnalité
- Les lecteurs multimédias ressemblaient à du matériel physique, des mascottes de bureau se promenaient à l’écran, et des panneaux utilitaires étaient conçus comme des tableaux de bord, des jouets ou des consoles extraterrestres
- La fenêtre n’avait pas besoin d’être rectangulaire, et l’objectif de l’interface relevait davantage de la personnalité que de l’utilisabilité
- Si ces formes ont disparu aujourd’hui, c’est parce que les programmeurs ne contrôlent plus directement la fenêtre elle-même
- La plupart des frameworks UI modernes masquent le système d’exploitation, et les développeurs travaillent uniquement dans une zone rectangulaire limitée
L’architecture orientée messages de Win32 et le contrôle des fenêtres
- Le cœur de la programmation Win32 réside dans la boucle de messages d’événements
- La boucle composée de
GetMessage,TranslateMessage,DispatchMessagesert de base à tout le fonctionnement - Le comportement de la fenêtre est défini par le traitement de messages comme « WM_CREATE », « WM_PAINT », « WM_SIZE », « WM_DESTROY »
- La boucle composée de
- Avec HRGN (Region Object), il est possible de modifier librement la forme d’une fenêtre
- En assignant une région à la fenêtre avec
SetWindowRgn, seule cette région est reconnue comme la véritable fenêtre - Dans l’exemple de code,
CreateEllipticRgnsert à créer une fenêtre elliptique, et la fonction de glisser-déposer est implémentée manuellement sans barre de titre - Lors de « WM_LBUTTONDOWN », l’envoi de « WM_NCLBUTTONDOWN » avec « HTCAPTION » simule le déplacement de la fenêtre
- En assignant une région à la fenêtre avec
- Ainsi, créer la forme est facile, mais le vrai défi consiste à réimplémenter soi-même les fonctions auparavant fournies par le cadre standard
Fenêtres basées sur des bitmaps et fenêtres en couches
- L’exemple « drivenbyimage/main.c » définit la forme de la fenêtre à partir de données bitmap
- Il charge « shape.bmp » et définit comme région de fenêtre les pixels hors couleur transparente (magenta)
- Le bitmap sert à la fois d’image affichée à l’écran et de forme réelle de la fenêtre
- Les applications skinnables d’autrefois utilisaient cette méthode pour créer des formes variées, comme un chien, un vaisseau spatial, une radio ou un visage de personnage
- Mais une région basée sur un bitmap a des bords nets et ne permet pas de semi-transparence
- Pour obtenir des bords doux ou de l’animation, il faut utiliser une fenêtre en couches (
WS_EX_LAYERED)
- Pour obtenir des bords doux ou de l’animation, il faut utiliser une fenêtre en couches (
- Dans l’exemple « Animated/ », une image 32 bits avec canal alpha transparent est envoyée via
UpdateLayeredWindow- Avec GDI+, une sprite sheet est dessinée dans un bitmap en mémoire pour changer d’image à chaque frame, puis affichée sur le bureau
- La forme de la fenêtre n’est plus fixe : l’état actuel des pixels devient lui-même la forme de la fenêtre
- Cette méthode permet une transparence fluide, des changements de forme à chaque frame et des animations naturelles
La difficulté des fenêtres personnalisées et l’évolution culturelle
- Créer une fenêtre personnalisée avec l’API Win32 impose de gérer soi-même tous les détails du comportement
- Déplacement, redimensionnement, fermeture, saisie clavier, prise en charge du DPI : autant de fonctions normalement gérées automatiquement par une fenêtre standard qu’il faut implémenter manuellement
- Le prototype est facile à réaliser, mais le transformer en produit soigné demande beaucoup de temps et d’efforts
- Les utilisateurs ont fini par préférer la stabilité et la simplicité à ce type d’expérimentation visuelle
- Les fenêtres non standard ont souvent été associées à des adwares, des barres d’outils et des utilitaires superflus, ce qui leur a donné une image négative
- En conséquence, les « fenêtres aux formes étranges » ont été perçues davantage comme des éléments ludiques que comme des composants de logiciels sérieux
Les possibilités toujours actuelles de Win32 et leur sens
- Malgré tout, Win32 offre encore une liberté de contrôle direct et d’expérimentation
- Avec les messages, les handles et les API de dessin, il reste possible de contrôler les fenêtres au niveau du système d’exploitation
- Dans la plupart des cas, la fenêtre rectangulaire est raisonnable, mais cela rappelle que sa forme relève d’un choix, non d’une contrainte
- Le code d’exemple est publié sur le dépôt GitHub WierdApps
- Il comprend trois exemples : fenêtre elliptique, fenêtre basée sur un bitmap et mascotte animée
- Win32 permet toujours de créer des logiciels desktop créatifs et expérimentaux
1 commentaires
Réactions sur Hacker News
J’aimerais que les fenêtres aux formes bizarres ne reviennent jamais
Ce n’est pas parce qu’on peut faire quelque chose qu’on doit le faire
Si les applis construites aujourd’hui avec des wrappers de navigateur comme React, Electron, Tauri se ressemblent toutes, c’est parce qu’elles n’utilisent pas les frameworks GUI de l’OS
Quand une appli utilise ses propres widgets non standard, couleurs ou formes, cela ruine l’accessibilité et l’utilisabilité
Ironiquement, les applis qui insistent aujourd’hui sur leur « identité » sont surtout des panneaux de contrôle de pilotes ajoutés par les fabricants de matériel, et c’est le pire bloatware qui soit
J’aime Win32, mais je pense que l’ancienne culture des skins étranges annonçait déjà la logique actuelle du « branding = identité »
Cela a fini par mener à la prolifération d’Electron et de bibliothèques de widgets à moitié finies
À moins d’être une appli spécialisée comme Blender ou Ardour, une GUI avec de la personnalité n’est pas prioritaire
Les OS actuels ne sont plus faits pour les particuliers mais pour les entreprises. L’époque de Win3.1 à XP était le vrai temps de l’informatique personnelle
Les applis modernes basées sur React ne sont cohérentes ni avec l’OS ni entre elles
L’UI change tous les six mois sans que l’UX s’améliore. L’accessibilité (a11y) est complètement oubliée
Avant, les logiciels étaient créés par de petites équipes et maintenus de façon stable pendant longtemps
Aujourd’hui, on est passé à des itérations rapides et à de grandes équipes, et le flat design est le résultat adapté à cet environnement
Le design skeuomorphique coûte cher parce qu’il faut sans cesse recréer les assets
Au final, on est entré dans une époque où la vitesse et l’échelle priment, un peu comme quand les meubles en kit plats deviennent la norme à la place des meubles sculptés à la main
Avec l’ère du HiDPI, il est devenu difficile de dessiner l’UI au pixel près comme autrefois
À l’époque de Win95 à XP, on pouvait dessiner directement dans le front buffer, ce qui était rapide et consommait peu de mémoire, alors qu’aujourd’hui il faut maintenir un buffer de secours pour chaque fenêtre, ce qui utilise plus de RAM
En voyant la phrase « The point was usually not usability. It was identity. », j’ai eu l’impression de lire un texte écrit par un LLM
J’ai développé des applis Windows autrefois, et l’interface Win32 n’était contrôlable qu’à 90 % environ
Je me souviens avoir dû réimplémenter MessageBox pour essayer de changer le thème de couleurs
Le Notepad écrit en pur C Win32 n’utilise que 1,8 Mo, alors qu’un bloc-notes moderne en prend 50 Mo
Même GNU Emacs utilise moins de mémoire
À l’inverse, EDIT.EXE en mode texte ne prend que 520 Ko, donc il est bien plus efficace
Il existait autrefois sur Mac une appli de gravure de CD appelée Disco, qui affichait une animation de fumée montant au-dessus de la fenêtre pendant la gravure
Steve Jobs l’avait lui-même montrée sur scène et l’aimait beaucoup
J’étais aussi content de voir l’article parler des mascottes de bureau
J’ai récemment vu une vidéo d’un desktop pet créé avec Godot, qui fonctionne en cross-platform
Cela demande un peu de travail manuel, mais ce n’est pas aussi complexe qu’au niveau de Win32. Pour les amateurs de desktop pets, c’est une bonne option