Windows Aero: Jakiego koloru malować, aby pojawiło się „szkło”?
Jakiego koloru muszę malować w obszarze roboczym, aby to zrobićszkło zjawić się?
rozszerzyłem ramkę mojego formularza na obszar klienta za pomocą:
DwmExtendFrameIntoClientArea(self.Handle, margins);
nie mogę znaleźć żadnej oficjalnej dokumentacji firmy Microsoft dotyczącej tego, cokolor i / lubalfa DWM będzie szukał możliwości zastąpienia szkła. Dokumentacja dotyczącaDwmExtendFrameInClientArea nawet nie wspomina, że wymagany jest niestandardowy kolor. Jest tylko pogłoska i mit, że specjalny kolor jest nawet wymagany.
Najbliższy, jaki mogę znaleźć, to temat w witrynie MSDN:
Niestandardowa ramka okna przy użyciu DWMAby rozszerzone ramki były widoczne, regiony leżące pod każdą z boków rozszerzonej ramki muszą mieć dane pikselowe o wartości alfa 0.
Aktualizacja: I wpis na blogu:
Windows Vista dla programistów - Część 3 - Menedżer okien pulpituTak się składa, że wzór bitowy dla czerni RGB (0x00000000) jest taki sam jak wzór bitowy dla 100% przezroczystego ARGB, dzięki czemu można faktycznie rysować „czarnym” pędzlem GDI i zakładając, że poleciłeś DWM rozmyć pomalowany obszar, wynikiem będzie pożądany efekt szkła.
Jeśli biorę to, co mówią dosłownie (dane pikseli z wartością alfa równą zero), konstruuję kolor z zerową alfą i maluję to w rozszerzonym obszarze:
Color fillColor = Color.FromArgb(0, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
ale efekt szkła nie pojawia się:
alt tekst http://i46.tinypic.com/anlmd4.png
Jeśli zignoruję cytowany temat MSDN i zamiast tego użyję całkowicie nieprzezroczystej czerni (zamiast całkowicie przezroczystej czerni):
Color fillColor = Color.FromArgb(255, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
pojawia się efekt szkła:
alt tekst http://i45.tinypic.com/2ug2ias.png
jestem wtedy doprowadzony do uwierzenia w tonieprzezroczysty czarny to wartość piksela, której DWM będzie szukał w celu zastąpienia szkła.
Ale jak mam malować?czarne przedmioty na szklanej powierzchni?
testowałem malowanie czerniprostokąt na szklanej powierzchni, za pomocąokrąg obok tego. Co dziwne, prostokątnie pojawiają się, gdy koło się pojawia; oba są tego samego koloru:
Brush b = new SolidBrush(Color.FromArgb(255, 0, 0, 0));
e.Graphics.FillRectangle(b, 11, 11, 32, 32);
e.Graphcis.FillEllipse(b, 43, 11, 32, 32);
alt text http://i49.tinypic.com/aayykk.png
Co się dzieje na świecie? Co to jestwłaściwy kolor do malowania w rozszerzonym obszarze ramki, aby pojawiło się szkło?
Aktualizacja 2Za pomocąAdisaksugestia, aby dokładnie określić, gdzie głupota Aero żyje, tutaj rysuję czarny prostokąt wewnątrz czarnego koła:
alt tekst http://i47.tinypic.com/5dw861.png
Czy FillEllipse nie obsługuje rysowania czarnych okręgów?
Aktualizacja 3Pondidum zastanawiałem się, czy zadzwonićGrafika. Wyczyść zprzezroczysty czarny kolor sprawi, że szkło będzie widoczne:
e.Graphics.Clear(Color.FromArgb(0,0,0,0));
Torobi pracuj, ale nadal nie możesz narysować nieprzezroczystych czarnych przedmiotów na szybie:
alt tekst http://i47.tinypic.com/5dw861.png
Aktualizacja 4Patrzeć naMicrosoft Bridge Vista Library (zarządzane wrapery wokół funkcjonalności Vista, które nie zostaną dodane do .NET), zawsze udaje im się uzyskać rozszerzoną szklaną ramkę działającą na formularzach WPF, a nie WinForm.
Zobacz teżAero: Jak narysować tekst ClearType na szybie?Aero: Jak narysować jednolite kolory na szkle?