7 puan yazan GN⁺ 14 일 전 | 1 yorum | WhatsApp'ta paylaş
  • 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, DispatchMessage bileş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
    • SetWindowRgn ile pencereye bir bölge atanırsa yalnızca o bölge gerçek pencere olarak kabul ediliyor
    • Örnek kodda CreateEllipticRgn ile 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 UpdateLayeredWindow ile 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

 
GN⁺ 14 일 전
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

    • Electron aslında tam ters bir sorun yaratıyor. Bütün uygulamalar birbirinden farklı görünüyor ve platform yönergelerine uymuyor
    • Erişilebilirlik, yasal gereklilikleri de olan önemli bir konu. Modern çapraz platform GUI framework'leri görme engelliler için screen reader ve HiDPI desteğini iyi yönetiyor
    • Yine de ben böyle alışılmadık pencere biçimlerinin havalı olduğunu düşünüyorum. Biri yeniden denerse memnuniyetle karşılarım
    • Vista döneminde WPF ve XAML ile yapılmış çok sayıda standart dışı UI gördüm; pencere yeniden boyutlandırılırken ya da monitörler arasında taşınırken ölçekleme berbat oluyordu ve geriye sadece rahatsızlık kalıyordu
    • Ben tam tersini düşünüyorum. Bilgisayarları eskisi gibi eğlenceli ve havalı yapmak istiyorum. Şimdi her şey evrak klasörü gibi. Hayatın eğlenceli kısımları zaten isteğe bağlı şeylerdir
  • 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

    • Electron uygulamalarının hepsi birbirine benziyor. Buna karşılık Winamp gibi Win32 skin'leri en azından karakter sahibiydi
      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ı
    • Genel ofis uygulamalarında native kontroller kullanmak doğru ama iPad ya da akıllı cihazlar gibi tam ekran özel UI kullanılan durumlarda bu yaklaşım havalı duruyor ve iyi çalışıyor
  • 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

    • Aslında Win32 API'de de her şeyi doğrudan kendin yazman gerekmez. Temel mesaj işlemeyi delege edebilirsin
    • Skeuomorphic tasarım, gerçeği fazlasıyla taklit ettiği için görsel olarak karmaşık ve dağınık görünüyordu. Yön doğruydu ama uygulaması zordu
    • Sonuçta sebep maliyet düşürme. Daha iyi kullanılabilirlikten vazgeçip arabalardaki düğmeleri büyük dokunmatik ekranlarla değiştirmek 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

    • Ben de aynı hissi aldım. Yine de yazarın bir şey anlatmak istediği anlaşılıyordu
    • Bütün cümleler LLM üretimiymiş gibi görünüyordu
  • 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

    • Eskiden Win32 Hook ile MessageBox değiştirilebiliyordu. HCBT_CREATEWND ile HWND alıp subclassing yapmak yeterliydi
    • Daha derine inince User32.dll yerine Win32U.dll hook'lamak gereken durumlar da olabiliyor
    • Bunu baştan yazmak acı verici. Qt ile biraz daha iyi olur muydu diye merak ediyorum
  • Saf Win32 C ile yazılmış Notepad sadece 1.8MB kullanıyor ama bugünün not defteri 50MB tüketiyor

    • En basit “Hello World” programı bile 500KB gerektiriyor. Sistem kütüphaneleri varsayılan olarak belleği işgal ediyor
    • Modern Windows 11 Notepad sekmeler, stilli metin ve yapay zeka özellikleri içerdiği için varsayılan olarak 32MB kullanıyor
      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