2015-05-06 9 views
5

Potrzebuję utworzyć okno bez ramki z określonym kolorem tła. Wiem jak usunąć non obszar roboczy i dostać coś takiego:Okno bez obramowania. Jak dodać cień i usunąć obramowanie 1px?

enter image description here

Fajnie, ale nie naprawdę to, co chcę. Jeśli przyjrzysz się bliżej każdemu oknu aero - wokół niego jest cień (w rzeczywistości to nie cień, ale blask). Znalazłem gdzieś, że mogę użyć tego kodu, aby dodać cień:

const MARGINS shadow_on = { 1, 1, 1, 1 }; 
DwmExtendFrameIntoClientArea(hwnd, &shadow_on); 

To prawie zrobić to zadanie (pomyślałem, że to nie jest absolutnie dla mnie jasne - dokumentacja nie mówi nic na temat relacji z cienia i tej funkcji). Prawie. Wokół okna pojawiło się cienkie obramowanie. Wygląda na to, że to półprzezroczysta i łamie wygląd okna:

enter image description here

wiem, że jest to możliwe - w visual studio nawet zmienić kolor tej granicy jakoś!

Aktualizacja: jako IInspectable zauważony w komentarzach mogę używać ujemnych marginesów w DwmExtendFrameIntoClientArea(). Ustawić wartość -1 i dostał ten wynik:

enter image description here

Jak widać - to jeszcze dziwniejsze. Próbowałem wypełnić tło kolorem, ale bez powodzenia.

+0

można klip powierzchnia okien usunąć blask. Czy próbowałeś już go spiąć, aby usunąć poświatę? Możliwe, że nie można pozbyć się blasku i używać cienia w tym samym czasie. – icbytes

+0

@icbytes nie, nie rozumiesz - potrzebuję blasku - nie potrzebuję granicy, która pojawia się, gdy dodaję poświatę. – nikitablack

+0

Następnie nie używaj wspomnianej funkcji. Narysuj to sam. Jedna linia px ze wszystkich stron, z lekkim zielonym pasemkiem. – icbytes

Odpowiedz

1

Aby usunąć jeden piksel granicę po wywołaniu tej funkcji:

const MARGINS shadow_on = { 1, 1, 1, 1 }; 
DwmExtendFrameIntoClientArea(hwnd, &shadow_on); 

Musisz przesłonić WndProc WM_NCCALCSIZE wiadomość i powrócić 0 jako wynik. Musisz również utworzyć okno, używając stylu WS_CAPTION. (W systemie Windows XP ten kod nie będzie generował prostokątnego okna, ale nie ma cienia na WinXP, więc w Windows XP powinieneś zmienić styl na WS_POPUP)
Przy okazji, aby dodać cień, wystarczy użyć tych marginesów:
const MARGINS shadow_on = { 1, 0, 0, 0 };

Oto czysty Windows API przykładowy kod jak tworzyć takie okno jest napisane na Delphi: https://stackoverflow.com/a/44489430/877099

Powiązane problemy