2015-09-01 53 views
5

Ben Bu yakın zamana kadar çalışmış, Windows 10 bir "cam" etkisi ile şeffaf pencere oluşturmak çalışıyorum:Windows 10'da başlık çubuğuna sahip arka plan penceresi mi? sonra çalışmayı durdurdu Windows Update

Screenshot

Ne yapıyor geçerli:

  • Bir alfa kanalı içeren hedef DC'ye boya. Düz GDI'da bunu yapmanın bir yolu, bir alfa kanalı ile bir görüntü oluşturmak ve DC'ye SRCCOPY kullanarak BitBlt etmektir. AlphaBlend işlevini de kullanabilirsiniz.
  • Sonra, pencerelerde 10 (veya daha eski) arkasında bulanıklaşmayı etkinleştirmek için SetWindowCompositionAttribute (veya DwmExtendFrameIntoClientArea) kullanıyorum.

Bu, bugüne kadar çalıştı ve aniden bir güncelleme sonrasında çalışmayı durdurdu - pencere artık opak. Sistem Geri Yükleme'yi kullandım ve bir gün geri döndüm ve yine işe yaradı! Herhangi bir fikir bunu nasıl düzeltebilirim?

+0

"GDI alfa kanallarını desteklemediğinden, bu aynı zamanda her pikselin alfa değerini sıfırlar." Bu kesinlikle doğru değil; Bu bir uygulama detayı. Piksel başına piksel içeren bir pencere oluşturmanın yaygın yolu, katmanlı bir pencere kullanmak ve UpdateLayeredWindow'u çağırmaktır. –

+0

@AdrianMcCarthy: Elbette belgesiz bir uygulama detayıdır. Ama bu yüzden cam etkisi yaratmak için SetWindowCompositionAttribute çağırıyor, bu yüzden zaten belgesiz karada yaşıyorum. Katmanlı pencerelere geçmek, WM_PAINT tabanlı kodun büyük bir yeniden yazımını gerektirir ve ben de çalışacağından emin değilim (opak bir standart başlık çubuğu istiyorum, ancak yarı saydam bir içerik alanı). Ayrıca, Vista'dan bu yana "cam" saydamlığı katmanlı pencerelere dayanmaz, ancak alfa kanalı olan normal pencereler (DWM tarafından harmanlama yapılır). – jdm

+1

"SetWindowCompositionAttribute" işlevini, istemci alanının dışında bulanıklaşmasını önlemek için bulanıklık bölgesini ("DwmEnableBlurBehindWindow" ile mümkün olduğu kadar) ayarlamak için herhangi bir yol biliyor musunuz? – melak47

cevap

3

SetWindowCompositionAttribute yanlış arandığım çıkıyor. Yani, parametrelerden biri size alana sahip ve yanlış boyutta koyuyordum. Bir noktada çalışmak için kullanılan, saf bir kazaydı.

+0

Bu "boyut" alanında genişletebilir misiniz? –

+0

@ charles.milette Biraz zaman geçti, ancak işlev WINCOMPATTR öğesini işaret etmek için bir işaretçi kullanıyor. Bu yapıda, hangi özniteliği ayarlamak istediğinizi, yeni verilere işaretçi ve veri alanının boyutunu belirtirsiniz. Örnek: https://github.com/jdmansour/mintty/blob/glass/src/winmain.c#L683 – jdm

+0

Doğru. WINCOMPATTR'in bir alanından bahsederken ... –