Rejestracja klasy okna w WinApi - rozważania na temat implementacji

0

Witam,
po raz kolejny chciałbym prosić o rozwianie moich wątpliwości w zakresie WinApi ;-).
Tym razem pytanie dot. rejestracji klasy okna, którą (przypomnę) należy bezwzględnie wykonać przed utworzeniem okna. Na podstawie danej klasy może być stworzonych wiele okien.

W zasadzie jedyną rzeczą, którą wyróżnia każdą klasę to procedura okna oraz nazwa klasy, która jest przekazywana do funkcji CreateWindowEx() i która musi być unikalna.
W moim mini-wrapperze WinApi procedura okna jest uniwersalna dla każdego tworzonego okna. Procedura jest uniwersalna tzn. że jest ta(ka) sama dla każdego tworzonego okna a jej zadaniem jest pobranie wskaźnika do obiektu klasy Window przekazanego w funkcji CreateWindowEx w ostatnim parametrze. Następnie, mając wskaźnik do obiektu klasy Window wywoływana jest indywidualna procedura utworzonego okna.

W zasadzie to z powyższego wynika, że stosując powyższe rozwiązanie można robić wszystkie okna bazując na jednej klasie ... Chociaż nie wiem, czy to jest dobry pomysł - co Wy o tym sądzicie? Tak jak kontrolki tworzone są na bazie jednej klasy tak inne okna również chyba by mogły. Różnica polega tylko na tym, że ja mam uniwersalną procedurę ;-).

Inne rozwiązanie, które obecnie stosuję to rejestrowanie każdego utworzonego okna w metodzie Create() klasy window.
Takie rozwiązanie ma tylko taką wadę, że rejestruje każdą utworzoną klasę - nawet jak tworzę dwa identyczne okna to każda jest oddzielnie rejestrowana. Pytanie, czy sama rejestracja pozbawia mnie jakiś zasobów lub czegoś podobnego?

Dodatkowo, dlatego, że nazwa klasy musi być unikalna, doszedłem do wniosku, że każdy obiekt klasy Window (i klasy pochodne) będę tworzyć nazwę automatycznie np. tak: wstring name = L"default_window_name" + ID_window;. Zmienna ID_window jest statyczna i jest zwiększana o 1 w konstruktorze klasy Window. Takie rozwiązanie chyba zapewnia mi, że unikalność nazwy ;-) - ale czy są jakieś przeciwwskazania?

Co wy o tym sądzicie i jak Wy byście do tego podeszli? Niby można utworzyć kolejną metodę w klasie Window typu Register(), ale czy jest sens?

Z góry dzięki za wasze komentarze.

0

Jedna klasa okna wystarczy.

0

@_0x666_ chyba jednak to nie jest dobry pomysł ;-). Problem polega na tym, że jak mam jedną klasę to przy zmianie kursora zmienia mi się on w każdym oknie...

Obecnie przerobiłem konstruktor na Window(wstring unique_class_name) a w metodzie Create() sprawdzam, czy podana klasa jest zarejestrowana - jeśli nie to ją rejestruję.
Chwilowo to najlepszy pomysł na jaki wpadłem ;)
Ciągle jednak myślę nad rejestrowanie dla każdego okna nowej unikalnej klasy... Rozwiązuje to problem martwienia się o nazwy, ich dublowanie etc.

1

Pokombinuj z SetCursor i WM_SETCURSOR.

0

@_0x666_ rzeczywiście tak też można ;-) Dzięki.

2

Tym razem pytanie dot. rejestracji klasy okna, którą (przypomnę) należy bezwzględnie wykonać przed utworzeniem okna.
To zdanie nie jest prawdą. Zwłaszcza z tym „bezwzględnie”.

W zasadzie jedyną rzeczą, którą wyróżnia każdą klasę to procedura okna oraz nazwa klasy, która jest przekazywana do funkcji CreateWindowEx() i która musi być unikalna.
Zamiast nazwy można przekazać zmienną typu ATOM zwracaną przez RegisterClass, i ja tak robię, a jako nazwę klasy daję wygenerowany GUID i w ten sposób nie przejmuję się kwestią jej wymyślania.

W zasadzie to z powyższego wynika, że stosując powyższe rozwiązanie można robić wszystkie okna bazując na jednej klasie
Tak też robią zwykle wrappery.

Pytanie, czy sama rejestracja pozbawia mnie jakiś zasobów lub czegoś podobnego?
Idea „klasy okna” powstała dla zmniejszenia zapotrzebowania na pamięć, pozwalając mieć kilka okien które dzielą ten sam kod, te same zasoby - a indywidualny stan mają niewielki, m.in. pozycja okna na ekranie i twoje własne zmienne.
W czasach gdy komputery miały po 4 MB RAM to miało duże znaczenie.
Obecnie możesz robić osobną klasę i osobną procedurę dla każdego okna i nie będzie to specjalnie bolało, ale jest to mimo wszystko raczej niezalecane.

0

@_0x666_ a orientujesz się czy da się jakoś zmienić małą ikonkę po utworzeniu okna? Dużą się da stosując funkcję SetClassLong(), ale małej się w ten sposób nie da...

1

A z wartością GCL_HICONSM nie działa?

0
0x666 napisał(a):

A z wartością GCL_HICONSM nie działa?

Sux, @_0x666_ sorka, chyba trochę namieszałem. Rzeczywiście powinno się tak dać. Przynajmniej jak czytam teraz MSDN. Wcześniej bazowałem na książce Piotra Besty, gdzie jest napisane, że w funkcji SetClassLong nie można podawać flagi GCW_ATOM oraz GCW_HICONSM.

@Azarien nie zauważyłem wcześniej Twojego postu - dzięki za wypowiedź ;-)

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