[WinAPI] Style kontrolek.

0

Witam,

Mam problem ze stylami kontrolek, które nie są takie jak te zdefiniowane przez windows. Do utworzenia zwykłego buttona używam:

CreateWindowEx(WS_EX_CLIENTEDGE, "BUTTON", "Przycisk",
				WS_CHILD | WS_VISIBLE, 0, 0, 80, 30, hWnd, NULL, GetModuleHandle(NULL), NULL);

I jak już napisałem wyżej styl przycisku nie jest taki jak domyślnie przypisany przez windows 7. Przycisk to po prostu czarna ramka z tekstem. Tak więc moje pytanie brzmi jak ustawić tak aby styl przycisku był przypisywany przez ustawienia w windowsie? Mam nadzieję, że zrozumiale wyjaśniłem.

0

Skopiuj ukryty plik C:\WINDOWS\WindowsShell.Manifest do katalogu ze swoim programem, a następnie zmień nazwę tego nowego pliku podmieniając WindowsShell na nazwę programu:
program1.exe.manifest

0

Nic się nie zmieniło ciągle to samo.

0

No to mam nadzieję że zamiast 'program1.exe' wpisałeś nazwę swojego programu. O funkcji InitCommonControls lub InitCommonControlsEx pamiętasz? A może masz system 64-bit, program jest 32-bit, a skopiowany manifest ma "amd64" zamiast "*" ?

Nie chce mi się zgadywać, sam przeczytaj: Enabling Visual Styles: http://msdn.microsoft.com/en-us/library/bb773175.aspx

0
sapero napisał(a)

No to mam nadzieję że zamiast 'program1.exe' wpisałeś nazwę swojego programu.

Wnioskuję, że takie przypadki lub podobne już były? ;d

Co do podanych funkcji to dopiero zaczynam w WinAPI więc pierwszy raz o nich słyszę. Poczytam informacje z linku i napiszę jak rozwiązałem problem (może ktoś kiedyś też będzie to potrzebować to od razu zobaczy rozwiązanie...). Dzięki za pomoc.

0

No to trzeba było od razu napisać że raczkujesz.
Button jest jedną z najstarszych kontrolek, zawsze jest dostępny bez extra bibliotek. Problem w tym, że jego domyślna implementacja jest stara, bez styli.

Button ma swoją implementację w bibliotece comctl32.dll, która sobie siedzi w /system32. Gdy Twój program używa jakiejś funkcji która pośrednio lub bezpśrednio odwołuje się do comctl32.dll, system ładuje comctl32.dll z domyślnej lokalizacji, czyli z /system32 (nie ma styli).

Wizualne style są zaimplementowane w comctl32.dll w wersji (6). Biblioteka ta siedzi sobie głęboko zakopana w /WinSxS. Jest tam ich nawet kilka, w różnych wersjach.

Stosując trik z manifestem dajesz systemowi do zrozumienia, że nie chcesz domyślnej wersji danej biblioteki (z /system32) tylko chcesz wersję 6.0 lub inną. Bezpośrednio przed uruchomieniem programu system sprawdza najpierw czy jest plik manifestu, potem ewentualnie szuka manifestu w zasobach programu, jeżeli nie znalazł pliku. Jeśli już znajdzie manifest i odczyta z niego że sprecyzowałeś wersję 6.0 dla comctl32, oraz gdy jeszcze znajdzie bezpośrednią referencję z programu do taj bibtioteki (InitCommonControls) to przydzieli Ci tą wersję której oczekujesz, zamiast domyślnej. Dopiero wtedy kontrolka będzie miała odpowiednie style.

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