Direct Win32 API, अजीब आकार वाली विंडोज़, और वे ज़्यादातर क्यों गायब हो गईं
(warped3.substack.com)- आधुनिक Windows ऐप्स web-based framework पर निर्भरता की वजह से धीमे और भारी हो गए हैं, और पुराने Win32 दौर वाला operating system स्तर का नियंत्रण खो गया है
- Win32 API में message loop और HRGN object के ज़रिए विंडो का आकार मनचाहे ढंग से तय किया जा सकता था, और non-standard window design आम थे
- bitmap और layered window तकनीक का इस्तेमाल करके transparency और animation वाली मुक्त आकार की विंडो बनाई जा सकती थीं
- लेकिन custom windows धीरे-धीरे गायब हो गईं क्योंकि उनमें सारी basic functionality हाथ से implement करनी पड़ती थी, और यूज़र्स की पसंद सरलता की ओर बदल गई
- फिर भी Win32 आज भी window control और experimentation की आज़ादी देता है, और creative desktop software बनाने की संभावना बनाए रखता है
आधुनिक Windows ऐप्स की एकरसता और Win32 की खोई हुई आज़ादी
- हाल के Windows desktop apps में ज़्यादातर React, Electron, Tauri जैसे browser wrapper के ऊपर चलते हैं, और धीमे तथा memory ज़्यादा खाने वाले जटिल web-based ढांचे में बदल गए हैं
- एक साधारण notepad भी 50MB memory लेता है, जबकि शुद्ध Win32 C में लिखी वही functionality वाली app सिर्फ 1.8MB में चल जाती है
- आधुनिक hardware पर भी Windows 11 boot होते समय memory usage 77% तक पहुंच जाता है
- पहले जब सीधे Win32 API से programming की जाती थी, तब operating system स्तर का पूरा नियंत्रण हाथ में होता था
- उस समय rectangular window तक सीमित रहने की ज़रूरत नहीं थी, और non-standard आकार की windows खुलकर बनाई जा सकती थीं
- Windows XP के दौर में Windows Media Player समेत कई apps का रूप-रंग अलग और अनोखा होता था
अतीत की ‘अजीब आकार’ वाली विंडोज़
- एक समय Windows apps को पहचान और व्यक्तित्व दिखाने के लिए कई तरह के आकारों में बनाया जाता था
- media player hardware जैसे दिखते थे, desktop mascot स्क्रीन पर घूमते थे, और utility panel को instrument panel, खिलौने, alien console जैसी शक्ल दी जाती थी
- विंडो का आकार rectangular होना ज़रूरी नहीं था, और UI का मकसद usability से ज़्यादा personality दिखाना होता था
- आज ऐसे रूप कम दिखने का कारण यह है कि programmer अब विंडो को सीधे नियंत्रित नहीं करते
- ज़्यादातर आधुनिक UI frameworks operating system को छिपा देते हैं, और developer सिर्फ सीमित rectangular area के भीतर ही काम करता है
Win32 की message-based संरचना और window control
- Win32 programming का केंद्र event message loop है
GetMessage,TranslateMessage,DispatchMessageसे बना loop हर व्यवहार की नींव है- “WM_CREATE”, “WM_PAINT”, “WM_SIZE”, “WM_DESTROY” जैसे messages को handle करके विंडो का व्यवहार तय किया जाता है
- HRGN(Region Object) का उपयोग करके विंडो का आकार मनचाहे ढंग से बदला जा सकता है
SetWindowRgnसे विंडो को कोई region दिया जाए तो वही हिस्सा वास्तविक विंडो माना जाता है- उदाहरण code में
CreateEllipticRgnसे elliptical window बनाई जाती है, और title bar के बिना drag functionality भी सीधे implement की जाती है - “WM_LBUTTONDOWN” के समय “WM_NCLBUTTONDOWN” को “HTCAPTION” के साथ भेजकर विंडो खिसकाने का व्यवहार नकल किया जाता है
- यानी आकार बनाना आसान है, लेकिन framework जो basic features देता था उन्हें खुद implement करना ही असली चुनौती है
bitmap-आधारित windows और layered window
- “drivenbyimage/main.c” उदाहरण में bitmap data से विंडो का आकार तय किया जाता है
- “shape.bmp” लोड करके transparent color (magenta) को छोड़ बाकी pixels को window region बनाया जाता है
- bitmap एक साथ स्क्रीन पर दिखने वाली image भी होता है और विंडो का वास्तविक आकार भी
- पहले के skinned apps इसी तरीके से कुत्ता, spaceship, radio, character face जैसी कई आकृतियाँ बनाते थे
- लेकिन bitmap-based region में किनारे कठोर होते हैं और semi-transparency संभव नहीं होती
- मुलायम edges या animation के लिए layered window (WS_EX_LAYERED) की ज़रूरत होती है
- “Animated/” उदाहरण में transparent alpha channel वाली 32-bit image को
UpdateLayeredWindowसे upload किया जाता है- GDI+ से memory bitmap पर sprite sheet draw करके frame बदले जाते हैं, और उसे desktop पर दिखाया जाता है
- इसमें विंडो का आकार स्थिर नहीं रहता, बल्कि उस पल की pixel state ही विंडो का आकार बन जाती है
- यह तरीका smooth transparency, frame-by-frame shape change, और natural animation को support करता है
custom windows की कठिनाई और सांस्कृतिक बदलाव
- Win32 API से custom window बनाते समय हर बारीकी को खुद संभालना पड़ता है
- drag, resize, close, keyboard input, DPI support जैसी वे सुविधाएँ जो सामान्य विंडो अपने-आप संभालती थी, उन्हें manually implement करना पड़ता है
- prototype बनाना आसान हो सकता है, लेकिन उसे polished product में बदलने के लिए काफी लागत और मेहनत चाहिए
- यूज़र्स ऐसे visual experiment की तुलना में stability और simplicity को ज़्यादा पसंद करने लगे
- non-standard windows का रिश्ता अक्सर adware, toolbar, और बेकार utilities से जुड़ गया, जिससे उनकी छवि नकारात्मक हो गई
- नतीजतन “अजीब आकार वाली विंडो” को serious software की बजाय खिलंदड़े तत्व की तरह देखा जाने लगा
Win32 की अब भी मौजूद संभावना और महत्व
- इसके बावजूद Win32 आज भी सीधे नियंत्रण और experimentation की आज़ादी देता है
- सिर्फ messages, handles, और drawing API के सहारे भी operating system स्तर का window control संभव है
- ज़्यादातर मामलों में rectangular window व्यावहारिक है, लेकिन यह याद दिलाता है कि यह सिर्फ एक विकल्प है, कोई अनिवार्यता नहीं
- उदाहरण code GitHub repository WierdApps में उपलब्ध है
- इसमें elliptical window, bitmap-based window, और animated mascot जैसे तीन sample शामिल हैं
- Win32 आज भी रचनात्मक और प्रयोगधर्मी desktop software बनाना संभव बनाता है
1 टिप्पणियां
Hacker News की राय
अजीब आकार वाली विंडो फिर वापस न आएँ तो बेहतर होगा
सिर्फ इसलिए कि कुछ बनाया जा सकता है, इसका मतलब यह नहीं कि उसे बनाना ही चाहिए
आजकल React, Electron, Tauri जैसे browser wrapper से बने ऐप्स सब एक जैसे दिखते हैं, क्योंकि वे OS के GUI framework का इस्तेमाल नहीं करते
अगर ऐप अपने-अपने गैर-मानक widgets या रंग, आकार इस्तेमाल करें तो accessibility और usability खराब हो जाती है
विडंबना यह है कि आजकल ‘identity’ पर ज़ोर देने वाले ऐप्स ज़्यादातर hardware manufacturers द्वारा ठूँसे गए driver control panel जैसे होते हैं, और वही सबसे खराब bloatware होते हैं
मुझे Win32 पसंद है, लेकिन मुझे लगता है कि पहले की अजीब skin संस्कृति आज की “branding = identity” सोच की पूर्वसूचना थी
वही आगे चलकर Electron और आधे-अधूरे widget libraries की भरमार तक पहुँची
Blender या Ardour जैसे विशेष ऐप्स न हों, तो अलग व्यक्तित्व वाला GUI प्राथमिकता नहीं है
आज के OS व्यक्तिगत उपयोग के लिए नहीं, बल्कि enterprise के लिए हैं। Win3.1~XP era ही असली personal computing का दौर था
आज के React-आधारित apps में न OS के साथ, न आपस में कोई consistency है
हर 6 महीने में UI बदल जाता है, लेकिन UX बेहतर नहीं होता। accessibility (a11y) को पूरी तरह भुला दिया गया है
पहले software कम लोग बनाते थे और उसे लंबे समय तक स्थिर रूप से maintain करते थे
अब चीज़ें तेज़ iteration और बड़े teams के इर्द-गिर्द बदल गई हैं, और flat design इसी माहौल के अनुरूप निकला हुआ नतीजा है
Skeuomorphic design में assets को लगातार फिर से बनाना पड़ता है, इसलिए इसकी लागत अधिक है
आखिरकार यह speed और scale को प्राथमिकता देने वाला दौर बन गया है। जैसे हाथ से तराशी गई furniture की जगह flat-pack furniture का चलन हो गया हो
HiDPI के दौर में पहले की तरह pixel-level पर UI बनाना कठिन हो गया है
Win95~XP के दौर में front buffer पर सीधे draw करना तेज़ था और memory भी कम लगती थी, लेकिन अब हर window के लिए backup buffer बनाए रखने पड़ते हैं, इसलिए RAM ज़्यादा लगती है
“The point was usually not usability. It was identity.” यह वाक्य पढ़कर लगा कि जैसे LLM ने लिखा हो
मैंने पहले Windows apps develop किए हैं, और Win32 interface पर लगभग 90% तक ही control मिल पाता था
color theme बदलने की कोशिश में MessageBox को खुद reimplement करना पड़ा था, यह याद है
शुद्ध Win32 C में बना Notepad सिर्फ 1.8MB इस्तेमाल करता है, जबकि आजकल के memo apps 50MB तक लेते हैं
यहाँ तक कि GNU Emacs भी उससे कम memory इस्तेमाल करता है
दूसरी ओर text-mode EDIT.EXE सिर्फ 520KB लेता है, इसलिए वह कहीं अधिक efficient है
पहले Mac के लिए Disco नाम का CD burning app था, जिसमें disc burn होने के दौरान window के ऊपर धुआँ उठने वाली animation दिखती थी
Steve Jobs ने उसे मंच पर खुद दिखाया था और उसे पसंद किया था
लेख में desktop mascots की बात आना भी अच्छा लगा
हाल ही में Godot से बना desktop pet वीडियो देखा, जो cross-platform चलता है
थोड़ा मेहनत वाला ज़रूर है, लेकिन Win32-स्तर की जटिलता नहीं है। desktop pet enthusiasts के लिए यह अच्छा विकल्प है