Doğrudan Win32 API, Tuhaf Şekilli Pencereler ve Çoğunun Neden Ortadan Kaybolduğu
(warped3.substack.com)- Modern Windows uygulamaları, web tabanlı framework’lere bağımlılık nedeniyle yavaş ve ağır hale geldi; geçmişteki Win32 döneminin işletim sistemi düzeyindeki kontrolü kayboldu
- Win32 API, mesaj döngüsü ve HRGN nesneleri üzerinden pencere şeklini özgürce tanımlamaya izin veriyordu ve standart dışı pencere tasarımları yaygındı
- Bitmap’ler ve layered window teknolojisi kullanılarak saydamlık ve animasyon içeren serbest biçimli pencereler uygulanabiliyordu
- Ancak özel pencereler, tüm temel işlevlerin elle uygulanmasını gerektiren karmaşıklık ve kullanıcıların sadelik tercihindeki değişim nedeniyle zamanla ortadan kayboldu
- Buna rağmen Win32 hâlâ pencere kontrolü ve deney yapma özgürlüğü sunuyor ve yaratıcı masaüstü yazılımları geliştirme olanağını koruyor
Modern Windows uygulamalarının tekdüzeliği ve Win32’nin kaybolan özgürlüğü
- Son dönemde Windows masaüstü uygulamalarının çoğu React, Electron, Tauri gibi tarayıcı sarmalayıcıları üzerinde çalışıyor ve yavaş, aşırı bellek tüketen karmaşık web tabanlı yapılara dönüşmüş durumda
- Basit bir not defteri uygulaması bile 50MB bellek kullanırken, saf Win32 C ile yazılmış aynı işlevdeki uygulama yalnızca 1.8MB kullanıyor
- Modern donanımlarda bile Windows 11 açılışında bellek kullanım oranı %77’ye ulaşıyor
- Geçmişte Win32 API ile doğrudan programlama yapılan dönemde işletim sistemi düzeyinde tam kontrol mümkündü
- O zamanlar dikdörtgen pencerelere hapsolmadan standart dışı şekillerde pencereler özgürce oluşturulabiliyordu
- Windows XP döneminde Windows Media Player başta olmak üzere pek çok uygulama kendine özgü bir görünüme sahipti
Geçmişin ‘tuhaf şekilli’ pencereleri
- Bir zamanlar Windows uygulamaları, kimlik ve karakter ifade etmek için çeşitli biçimlerde tasarlanıyordu
- Medya oynatıcılar donanım cihazı gibi görünür, masaüstü maskotları ekranda dolaşır, yardımcı paneler ise gösterge paneli, oyuncak ya da uzaylı konsolu gibi tasarlanırdı
- Pencere biçiminin dikdörtgen olması gerekmezdi ve arayüzün amacı kullanılabilirlikten çok kişilik taşırdı
- Bugün bu tarz biçimlerin kaybolmasının nedeni, programcıların artık pencerenin kendisini kontrol etmemesi
- Modern UI framework’lerinin çoğu işletim sistemini gizliyor ve geliştiriciler yalnızca sınırlı bir dikdörtgen alan içinde çalışıyor
Win32’nin mesaj tabanlı yapısı ve pencere kontrolü
- Win32 programlamasının özü olay mesaj döngüsünde yatıyor
GetMessage,TranslateMessage,DispatchMessagebileşenlerinden oluşan döngü tüm davranışların temelini oluşturuyor- “WM_CREATE”, “WM_PAINT”, “WM_SIZE”, “WM_DESTROY” gibi mesajlar işlenerek pencerenin davranışı tanımlanıyor
- HRGN (Region Object) kullanılarak pencerenin şekli serbestçe değiştirilebiliyor
SetWindowRgnile pencereye bir bölge atanırsa yalnızca o bölge gerçek pencere olarak kabul ediliyor- Örnek kodda
CreateEllipticRgnile eliptik bir pencere oluşturuluyor ve başlık çubuğu olmadan sürükleme işlevi doğrudan uygulanıyor - “WM_LBUTTONDOWN” sırasında “WM_NCLBUTTONDOWN”, “HTCAPTION” ile gönderilerek pencere taşıma davranışı taklit ediliyor
- Yani şekil vermek kolay olsa da, varsayılan çerçevenin sağladığı işlevlerin doğrudan uygulanması asıl zorluk
Bitmap tabanlı pencereler ve layered window
- “drivenbyimage/main.c” örneği, bitmap verisiyle pencere şeklini tanımlıyor
- “shape.bmp” yükleniyor ve saydam renk (macenta) dışındaki pikseller pencere bölgesi olarak ayarlanıyor
- Bitmap aynı anda hem ekrana çizilecek görüntü hem de pencerenin gerçek biçimi olarak çalışıyor
- Geçmişte skin tabanlı uygulamalar bu yöntemle köpek, uzay gemisi, radyo, karakter yüzü gibi pek çok biçim üretiyordu
- Ancak bitmap tabanlı bölgelerde kenarlar serttir ve yarı saydamlık gösterilemez
- Yumuşak kenarlar ya da animasyon için layered window (WS_EX_LAYERED) gerekir
- “Animated/” örneğinde, saydam alfa kanallı 32 bit görseller
UpdateLayeredWindowile yükleniyor- GDI+, sprite sheet’i bellekteki bitmap üzerine çizerek kareler arasında geçiş yapıyor ve bunu masaüstünde gösteriyor
- Pencere şekli sabit değil; o andaki piksel durumu doğrudan pencerenin şekli haline geliyor
- Bu yöntem yumuşak saydamlık, kare bazında şekil değişimi ve doğal animasyon desteği sağlıyor
Özel pencerelerin zorlukları ve kültürel değişim
- Win32 API ile özel pencere oluşturulduğunda tüm ayrıntılı davranışların doğrudan ele alınması gerekir
- Sürükleme, yeniden boyutlandırma, kapatma, klavye girdisi, DPI uyumu gibi normalde varsayılan pencerenin otomatik yaptığı işlevler elle uygulanmalıdır
- Prototip oluşturmak kolaydır ama bunu cilalı bir ürüne dönüştürmek yüksek maliyet ve emek gerektirir
- Kullanıcılar bu tür görsel deneylerden çok kararlılık ve sadeliği tercih etmeye başladı
- Standart dışı pencereler çoğu zaman reklam yazılımları, araç çubukları ve gereksiz yardımcı programlarla ilişkilendirildiği için olumsuz bir algı oluştu
- Sonuç olarak “tuhaf şekilli pencereler”, ciddi yazılımdan çok oyuncu bir unsur gibi görülmeye başlandı
Win32’nin süren potansiyeli ve anlamı
- Buna rağmen Win32 hâlâ doğrudan kontrol ve deney yapma özgürlüğü sunuyor
- Yalnızca mesajlar, handle’lar ve çizim API’leriyle bile işletim sistemi düzeyinde pencere kontrolü mümkün
- Çoğu durumda dikdörtgen pencereler mantıklı olsa da, bu biçimin bir tercih olduğu ve zorunluluk olmadığı hatırlatılıyor
- Örnek kodlar GitHub deposu WierdApps içinde yayımlanmış durumda
- Eliptik pencere, bitmap tabanlı pencere ve animasyonlu maskot dahil üç örnek bulunuyor
- Win32’nin hâlâ yaratıcı ve deneysel masaüstü yazılım üretimini mümkün kıldığı gösteriliyor
1 yorum
Hacker News görüşleri
Umarım garip şekilli pencereler geri gelmez
Sırf yapılabiliyor diye yapılması gerekmez
Bugün React, Electron, Tauri gibi tarayıcı sarmalayıcılarıyla yapılan uygulamaların birbirine benzemesinin nedeni, OS'in GUI framework'lerini kullanmamaları
Uygulamalar kendi standart dışı widget'larını, renklerini ve biçimlerini kullandığında erişilebilirlik ve kullanılabilirlik bozuluyor
İronik biçimde bugün “kimlik” vurgusu yapan uygulamalar çoğunlukla donanım üreticilerinin araya sıkıştırdığı sürücü kontrol panelleri gibi şeyler ve bunlar en kötü bloatware örnekleri
Ben Win32'yi seviyorum ama geçmişteki garip skin kültürünün bugünkü “branding = kimlik” anlayışının habercisi olduğunu düşünüyorum
Bu da sonunda Electron ve yarım yamalak tamamlanmış widget kütüphanelerinin ortalığı kaplamasına yol açtı
Blender ya da Ardour gibi özel amaçlı uygulamalar dışında, karakter sahibi bir GUI öncelik değildir
Bugünün işletim sistemleri kişisel kullanım için değil, kurumsal kullanım için. Win3.1~XP dönemi gerçek kişisel bilişim çağıydı
Bugünün React tabanlı uygulamaları ne işletim sistemiyle ne de birbirleriyle tutarlı
UI her 6 ayda bir değişiyor ama UX iyileşmiyor. Erişilebilirlik (a11y) ise tamamen unutulmuş durumda
Eskiden yazılım az sayıda kişi tarafından geliştirilir ve uzun süre kararlı biçimde sürdürülürdü
Şimdi hızlı yineleme ve büyük ekipler merkezde; flat design de bu ortamın doğal sonucu
Skeuomorphic tasarım sürekli yeni varlıklar üretmeyi gerektirdiği için maliyetli
Sonuçta hız ve ölçek öncelikli hale geldi. Elle oyulmuş mobilyalar yerine düz paket mobilyaların yaygınlaşması gibi
HiDPI çağında, eskisi gibi piksel düzeyinde UI çizmek zorlaştı
Eski Win95~XP döneminde front buffer'a doğrudan çizim yaparak hızlı çalışıyor ve daha az bellek kullanıyordun; şimdi ise her pencere için yedek buffer tutulduğu için daha fazla RAM harcanıyor
“The point was usually not usability. It was identity.” cümlesini görünce bunu LLM'in yazdığı bir metin sanmıştım
Eskiden Windows uygulamaları geliştirdim; Win32 arayüzü üzerinde ancak %90 civarında kontrolün vardı
Renk temasını değiştirmeye çalışırken MessageBox'ı baştan uygulamak zorunda kaldığımı hatırlıyorum
Saf Win32 C ile yazılmış Notepad sadece 1.8MB kullanıyor ama bugünün not defteri 50MB tüketiyor
Hatta GNU Emacs bile daha az bellek tüketiyor
Buna karşılık metin modundaki EDIT.EXE yalnızca 520KB kullanıyor, yani çok daha verimli
Eskiden Mac için Disco adında bir CD yazma uygulaması vardı; disk yazılırken pencerenin üstüne doğru duman yükselme animasyonu çıkıyordu
Steve Jobs bunu sahnede bizzat göstermiş ve çok beğenmişti
Yazıda masaüstü maskotlarından da söz edilmesi hoşuma gitti
Yakın zamanda Godot ile yapılmış bir masaüstü pet videosu gördüm; çapraz platform çalışıyor
Biraz uğraştırıcı olsa da Win32 seviyesinde karmaşık değil. Masaüstü pet meraklıları için iyi bir seçenek