[WinAPI] Style kontrolek.

Odpowiedz Nowy wątek
2010-03-14 13:42

Rejestracja: 11 lat temu

Ostatnio: 9 lat temu

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.

Pozostało 580 znaków

2010-03-14 14:02

Rejestracja: 15 lat temu

Ostatnio: 4 lata temu

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

Pozostało 580 znaków

2010-03-14 14:21

Rejestracja: 11 lat temu

Ostatnio: 9 lat temu

0

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

Pozostało 580 znaków

2010-03-14 16:11

Rejestracja: 15 lat temu

Ostatnio: 4 lata temu

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

Pozostało 580 znaków

2010-03-14 18:17

Rejestracja: 11 lat temu

Ostatnio: 9 lat temu

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.

Pozostało 580 znaków

2010-03-14 19:19

Rejestracja: 15 lat temu

Ostatnio: 4 lata temu

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.

Pozostało 580 znaków

Odpowiedz

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