2011-10-06 11 views
18

Jeśli spojrzysz na okna przeglądarek Firefox, Chrome lub Opera, zauważysz, że ich oknaWinAPI: Utwórz okno z możliwością zmiany rozmiaru bez paska tytułu, ale z przyciskami minimalizuj/maksymalizuj/zamykaj (jako Firefox/Chrome/Opera)

  • mają zminimalizować/zmaksymalizować/zamknij przyciski
  • są skalowalne
  • ale nie mają pasek tytułu

Jestem zainteresowany: w jaki sposób można stworzyć takie okno?

Co Próbowałem już:

Rozejrzałem się na StackOverflow (i google też), i znalazłem to: opening a window that has no title bar with win32

pechowo, to nie pomogło całkowicie:

Pierwszym krokiem było przedłużenie rozwiązania zaproponowanego na opening a window that has no title bar with win32

Oczywiście, to nie wyda minimalizacji/maksymalizacji przycisków, ale z drugiej strony, jeśli chcę zminimalizować/zmaksymalizować przyciski, muszę zrobić:

SetWindowLong(hWnd, GWL_STYLE, WS_SIZEBOX | WS_MAXIMIZEBOX | 
    WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION); 

Dlaczego to połączenie wydaje się być konieczne? Najpierw prawdopodobnie chcę WS_MAXIMIZEBOX | WS_MINIMIZEBOX, ponieważ chcę te przyciski.

Ale http://msdn.microsoft.com/en-us/library/ms632600.aspx mówi, że jeśli ustawię jedną z WS_MAXIMIZEBOX i WS_MINIMIZEBOX, muszę również ustawić WS_SYSMENU. I kiedy ustawiam WS_SYSMENU, muszę też ustawić WS_CAPTION, ale to nie jest to, czego chcę, ponieważ chciałem uniknąć paska tytułu (w rzeczy samej: jeśli nie ustawiono WS_CAPTION, nie są wyświetlane przyciski minimalizacji/maksymalizacji).

Co należy zrobić?

+0

Ta metoda nie działa na Windows 10 –

Odpowiedz

13

Programy usuwają obszar poza obszarem roboczym (pasek tytułu) i mają kilka niestandardowych czynności do odtworzenia przycisków okna, ikon, menu systemu itp. Korzyścią jest to, że mogą narysować nowy tytuł pasek ", który jest częścią standardowego obszaru roboczego, dodając karty lub inne niestandardowe elementy sterujące.

Poniższe dwa artykuły pokaże jak to zrobić na Vista i powyżej (przy użyciu DWM):

Jest to bardzo skomplikowane zadanie, więc powyższe dwa artykuły są nieocenione. Autor musiał włożyć w nie dużo pracy! Oba odnośniki mają przykładowy kod napisany w Delphi, ale powinno być dość łatwo przetłumaczyć je na C++ - pojęcia są identyczne, to tylko składnia.

Możesz być także zainteresowany general resources on Glass and DWM, ponieważ to wszystko jest ze sobą powiązane. Będziesz dostrzec dwie powyższe linki zawarte w tym wykazie :)

+0

Bardzo pomocny. Wierzę, że ty i Roman R. * obaj uzyskalibyśmy flagę "Answered". Pechowo mogę dać to tylko jednemu z was. :-( – Nubok

0

Sądzę, że tworzą one zwykłe okno, a następnie malują na pasku tytułowym z ich niestandardowymi widżetami/zakładkami. Jest to widoczne w przeglądarce Firefox, ponieważ po jej zawieszeniu widać normalny pasek tytułu systemu Windows widoczny na kartach.

+1

Hmm, ja naprawdę nie sądzę, że to jest prawda. –

+0

Normalne, rysowane przez właściciela okno służy do rysowania niestandardowego rysunku nad zwykłym paskiem tytułu. W razie wątpliwości sprawdź kod źródłowy, w końcu jest to open source. – Daemin

6

Możesz utworzyć okno z podpisem lub bez - cokolwiek jest bardziej odpowiednie z punktu widzenia pożądanego dostosowania (to znaczy "bez", chcesz to zrobić "bez paska tytułu", jak mówisz), a ważna jest to, że brodawkę przejąć malarstwo poza obszarem klienta - to jest kluczowa sprawa.

W tym momencie nikt już nie może namalować przycisków "Mimimize/Maxize". Nie oznacza to jednak, że musisz zrobić obraz od podstaw i naśladować standardowy interfejs użytkownika. Jest DrawFrameControl i API znajomych, gdzie możesz użyć argumentu DFCS_CAPTIONMIN i mieć przycisk pomniejszenia dla Ciebie. Będziesz także chciał odpowiedzieć na inne wiadomości poza obszarem klienta, np. uchwyt WM_NCHITTEST, aby powiedzieć systemowi Windows, gdzie znajdują się nowe przyciski okna.

Możesz także chcieć sprawdzić Visual Styles Reference, aby skorzystać z interfejsu API obsługującego rysunki, takiego jak DrawThemeBackground.

Prostym przykładem tego działania jest umieszczenie dodatkowego przycisku na podpisie, na przykład opisanego tutaj: CCaptionButton (buttons for the titlebar).

+1

Interfejs API motywów jest sposobem na to, ale łatwo jest to powiedzieć i cholernie trudno to wszystko połączyć. –

+4

Prawda. Tak długo, jak długo nie masz go pomalować, musisz włożyć sporo wysiłku, aby wyglądał spójnie ze standardowym interfejsem użytkownika. –

Powiązane problemy