WM_NCCREATE
to właściwie very first message your window will receive, który pojawi się przed WM_CREATE
. Jest to związane z tworzeniem obszaru poza obszarem klienta (np. Pasek tytułu, menu systemowe itp.), Stąd prefiks NC
.
WM_GETMINMAXINFO
jest wysyłany before the window size/position is changed i może pojawić się przed WM_CREATE
(patrz poniżej więcej).
Wiadomość jest wysyłana przed CreateWindow()
wiadomością zwrotną, więc można zagwarantować, że inicjalizacja okna została wykonana przez ten punkt. Twój proces okna otrzyma WM_CREATE
po utworzeniu okna, ale zanim okno stanie się widoczne (WM_SHOWWINDOW
).
W dokumentacji MSDN występuje interesująca niekonsekwencja - komunikaty o tworzeniu wydają się zależeć od tego, czy wywoływana jest nazwa CreateWindow()
lub CreateWindowEx()
, jednak nie określa ona, że komunikaty muszą być wymienione w kolejności wysyłania.
CreateWindow()
: WM_CREATE
, WM_GETMINMAXINFO
i WM_NCCREATE
CreateWindowEx()
: WM_NCCREATE
, WM_NCCALCSIZE
i WM_CREATE
I podejrzewam, że kolejność komunikat opisany w CreateWindow()
powinien mieć WM_NCCREATE
pierwszy, a regularne WM_CREATE
ostatni , co jest zgodne z dokumentacją powiadamiania i numerem referencyjnym CreateWindowEx()
(a także zgodnie z tym, co opisać).
Raymond Chen ma również kilka interesujących information on window creation/destruction.
Po prostu pokazuje, nawet pozornie proste rzeczy mogą się skomplikować, im więcej na nie patrzysz.
To pytanie nie ma sensu. Jak zauważyłeś, pierwsze wiadomości nie zawsze są takie same. W zależności od tego, czy okno zostanie utworzone, czy nie, cała masa wiadomości może przyjść do WindowPRoc, zanim CreateWindow kiedykolwiek powróci. które wiadomości i ich kolejność zmieniły się między wersjami okien. Gwarantujemy tylko, że WM_CREATE - a teraz WM_NCREATE - zostanie wysłane przed powrotem do CreateWindow (Zakładając pomyślne utworzenie okna). –
Chris, dlaczego komentarz zamiast odpowiedzi? Czy to nie ma sensu? Założę się, że 90% programistów Win32 przysięgnie, że WM_CREATE jest pierwszym odebranym msg (i byłem jednym z nich do 30 sekund temu). W końcu to wszystko czytamy w naszych podręcznikach. –
Zgadzam się, Serge Wautier, Myślałem o tym, dopóki nie zrobiłem małego testu. To jest kolejność wszystkich moich wiadomości WM do WM_CREATE: WM_GETMINMAXINFO, WM_NCCREATE, WM_NCCALCSIZE, WM_CREATE. – Kit10