Jak ustawić programowo w aplikacji Delphi styl klasyczny Windows

0

Nigdzie nie mogę znaleźć jak ustawić programowo styl Windows klasyczny tylko dla mojej aplikacji.
Styl podstawowy dla aplikacji to:

SetThemeAppProperties(0);
SendMessage(Application.Handle,WM_THEMECHANGED,0,0);
SendMessage(Application.MainForm.Handle,CM_RECREATEWND,0,0);
0

Można wiedzieć jaki jest cel takiej zmiany wyglądu interfejsu?

0

Tak oczywiście. program utworzony został w delphi 7 personal. Np jak w menu jest wiecej itemów co sprawia, że trzeba tracić czas na zjeżdzanie w dół i wybieranie. W windows clasic rozstep jest niewielki.

3

Widzę, że użytkownicy nie ogarniają powodu, dla którego wątek przeniosłem do kategorii Perełki. Dlatego też przenoszę z powrotem, dodając od siebie dwa słowa o tym, dlaczego uważam ten wątek za perełkę.


1. Rozwiązanie problemu ze szkodą dla użytkownika

Tak więc perełką jest to, że pytacz zaprojektował menu główne w taki sposób, że nie da się normalnie z niego korzystać i zamiast je przeprojektować, chce zmusić użytkownika do korzystania z programu o najbardziej podstawowym wyglądzie. Z tego co widać w poprzedniej wiadomości, nie tylko menu jest do bani.

Aplikacje desktopowe tworzy się w taki sposób, aby korzystały z systemowych ustawień. Jeśli użytkownik korzysta z kompozycji wizualnych, to aplikacje również powinny z nich korzystać – dzięki temu użytkownik pracuje w ujednoliconym środowisku, nie musząc poświęcać czasu na uczenie się obsługi odmiennych kompozycji.

Oczywiście korzystanie z tej ustawionej w systemie nie jest wymogiem – interfejs można zaprojektować po swojemu, co łatwe nie jest. Wyjątkiem jest też pokaźna grupa aplikacji, które muszą wyglądać ładnie – typowym przykładem są aplikacje prezentacyjne.

2. Złe rozwiązanie, rozwiązujące problem połowicznie

W dalszym ciągu nie zmienia to faktu, że źle zaprojektowanego interfejsu użytkownika nie naprawi się poprzez wyłączenie kompozycji. Poza tym, kompozycja nie jest jedynym czynnikiem mogącym wpływać na to menu – z innych to np. DPI czy rozdzielczość ekranu. Tak więc na każdym komputerze ten program będzie wyglądał inaczej i brak korzystania z kompozycji wizualnych niczego nie naprawi – wręcz przeciwnie.

3. Utrudnianie pracy użytkownikowi końcowemu

O tym jak wyglądają okna w systemie, decyduje każdy użytkownik z osobna. Jeśli użytkownik chce aby program wyglądał tak jak pozostałe okna, program musi na to pozwalać (czyli musi domyślnie pracować jako ostylowany). Natomiast jeżeli użytkownik będzie chciał wyłączyć kompozycje to może to zrobić dla każdej aplikacji z osobna, korzystając z indywidualnych ustawień plików wykonywalnych. Wystarczy otworzyć okno właściwości pliku wykonywalnego, odszukać w nim zakładkę dotyczącą zgodności pracy programu i zaznaczyć opcję Wyłącz kompozycje wizualne (lub podobnie nazwaną). W tym przypadku to do użytkownika należy ostatnie zdanie i nie powinno się mu tego zdania odbierać.

4. Zbędne kombinacje

Dochodząc do meritum – środowisko Delphi 7 natywnie nie obsługuje kompozycji wizualnych. Każdy utworzony w tym IDE projekt domyślnie nie będzie takich kompozycji obsługiwał – jego okna będą wyglądały tak jak te w Win98. Aby włączyć obsługę kompozycji, należy albo dołączyć w ~dowolnym miejscu moduł XPMan, albo w dowolny inny sposób dołączyć specyficzny plik manifestu do projektu (tak aby został wkompilowany do pliku wynikowego).

Brak modułu XPMan na liście to brak kompozycji. Nie ma absolutnie żadnego powodu, aby wyłączać je z poziomu kodu, skoro wystarczy po prostu nie używać tego modułu. A nawet jeśli używamy nowszego środowiska, to takie rzeczy ustawia się dwoma kliknięciami w opcjach projektu.

5. Konieczność przeprojektowania UI

Jeśli interfejs programu nie jest wygodny w obsłudze to należy wrócić do fazy projektowania – niestety. Menu główne i kontekstowe mogą być bardzo długie, a nawet jeszcze dłuższe. System bez problemu sobie z nim poradzi – użytkownik już niekoniecznie.

Jeżeli menu posiada bardzo dużo pozycji, to należy je podzielić na mniejsze grupy i albo dodać kolejne główne pozycje, albo skorzystać z submenu grupujących. Jest to powszechna praktyka, stosowana we wszystkich profesjonalnych aplikacjach, posiadających owe menu rozbudowane w sposób znaczący – pierwszymi z brzegu przykładami są duże edytory tekstowe i graficzne.

0

Wnioski uważam za niezasadne. Zważywszy na to, iż kod jest bardzo rozbudowany a administratorowi nawet nie śnił się taki program. Menu jest dokładnie takie jakie powinno być razem z subitemami. Nie widzę powodu dla którego musiałbym je zmieniać. Program w całości jest napisany dla mnie i jedynym użytkownikiem pierwotnym jak i zarazem końcowym jestem Ja sam. Pytanie było proste. Jak ustawić programowo ...? Jeśli nikt nie odpisał świadczyć mogło to, iż nie ma zainteresowania tym tematem. I wszystko gra. Pisać list filozoficzny na temat co ja muszę zrobić z menu to nie na miejscu i mija się z zadanym na forum przeze mnie pytaniem. A tak poza tym. Kiedyś W.A.Mozart poproszony o napisanie dzieła muzycznego przez pewnego zamożnego pana i też muzyka. Napisał to dzieło na co zleceniodawca za dużo tutaj nut. Na co Mozart rzekł. Jest tyle ile powinno być. dzieło doskonałe :)

0

No widzisz, jest tyle punktów odpowiedzi, ile powinno być – post doskonały. :]

Nie znam odpowiedzi na to jak zmienić kompozycję podczas działania programu i nie sądzę, aby było to możliwe (wyjątkiem są aplikacje używające niestandardowego mechanizmu skinowania okien lub posiadające wrappery na funkcje malujące, jak np. przeglądarki internetowe).

Z ciekawości poświęciłem dłuższą chwilę na przewertowanie Google w poszukiwaniu jakiegokolwiek kodu robiącego to co potrzebujesz, w dowolnym języku – nie znalazłem ani jednego. Są przykładowe kody zmieniające kompozycję w całym systemie, ale tych dotyczących tylko i wyłącznie jednej aplikacji nie byłem w stanie znaleźć.

Tak więc możesz skorzystać z tego co podałem wcześniej. No i w dalszym ciągu jest to dla mnie problem XY.

0

Wygląd „uskórkowiony” wynika (prawdopodobnie, bo nie dałeś screena) z istnienia tzw. manifestu common controls w exeku.
Wystarczy się go pozbyć.

Delphi 7 domyślnie go nie dodaje. Zatem ktoś to zrobił celowo.

0

Manifest jest w zasobach. Mogę go dołączać i wyłączać. Dla Windows classic zresztą manifest staje się obojętny tak czy siak.

0

Chodzi mi jedynie o taki interfejs.

0

Jak chcesz, aby program zawsze korzystał z klasycznej kompozycji to tego manifestu nie dodawaj – proste.

0
var
img : TImageList;
begin
  img := TImageList.Create(nil);
  img.Width := 9;
  img.Height := 9;

  MainMenu1.Images := Img;

  Screen.MenuFont.Name := 'Courier Now';
  Screen.MenuFont.Size := 8;

 // img.Free;
0

@Brunatny Krawiec – skomentuj swój post.

0

Powyższy kod umieszczony przeze mnie to rozwiązanie tymczasowe. Form jest wiele w programie i stosowanie kodu do programu dla każdej z nich to proces żmudny. Dokładnie jest ponad 900 unitów program pisany ponad 8 lat także szukam nadal rozwiązania aby jednym kodem zastosować ustawienia do menu i popupmenu dla całej aplikacji. Stad szukałem rozwiązania dla klasycznego wyglądu. Może z czasem coś wymyślę. Na ten czas dzięki :)

0
Brunatny Krawiec napisał(a):

Powyższy kod umieszczony przeze mnie to rozwiązanie tymczasowe. Form jest wiele w programie i stosowanie kodu do programu dla każdej z nich to proces żmudny.

Dalej nie czytam bo to lelum-polelum...
Ale; poczytaj co to jest OOP ze wskazaniem na dziedziczenie.
Bo z tego co napisałeś, to dla mnie wynika, że unitów jest 900. Ale gdyby to napisać poprawnie, to byłoby ich znacznie mniej - może 100x mniej?

Tak czy siak, ten Twój kod da się dodać do jednego unitu, zrobić search&replace i będzie działać na każdej z 900 formatek.
To jakieś 15-30 min roboty.

1 użytkowników online, w tym zalogowanych: 0, gości: 1