My tests show that Windows window management events behave like described in this file, at least under Win98. The (16/32) or (16) or (32) at the end shows whether the sequence has been confirmed for win16, win32, or both. Window Edge Styles (Win31 look), in order of precedence: WS_EX_DLGMODALFRAME: double border, WS_CAPTION allowed WS_THICKFRAME: thick border WS_DLGFRAME: double border, WS_CAPTION not allowed (but possibly shown anyway, untested) WS_BORDER (default for overlapped windows): single black border none (default for child and popup windows): no border Window Edge Styles (Win95/98 look), in order of precedence: WS_EX_DLGMODALFRAME: double border, WS_CAPTION allowed WS_THICKFRAME: thick border WS_DLGFRAME: double border, WS_CAPTION not allowed (but possibly shown anyway) WS_BORDER (default for overlapped windows): single black border none (default for child (and popup?) windows): no border Win31 look, system metrics relations: CYFRAME = 5, thick border, includes both edges (the colored inside is thus 3 pixels) CYDLGFRAME = 4, double border CYBORDER = 1, thin border CYCAPTION = 20, includes both borders (the colored inside is thus 18 pixels) CYMENU = 18, does not include any borders CYHSCROLL = 17, includes both borders (the colored inside is thus 15 pixels) CreateWindow (for overlapped window, not initially visible) (16/32) Messages sent: WM_GETMINMAXINFO WM_NCCREATE WM_NCCALCSIZE (wParam=0) WM_CREATE ShowWindow (for overlapped window) (16/32) Messages sent: WM_SHOWWINDOW (wParam=1) WM_WINDOWPOSCHANGING (NOMOVE|NOSIZE|SHOWWINDOW) WM_QUERYNEWPALETTE, if in 256-color mode WM_WINDOWPOSCHANGING (NOMOVE|NOSIZE) WM_ACTIVATEAPP (wParam=1) WM_NCACTIVATE (wParam=1) DefWindowProc: WM_GETTEXT WM_ACTIVATE (wParam=1) DefWindowProc: WM_SETFOCUS (wParam=0) WM_NCPAINT (wParam=1) DefWindowProc: WM_GETTEXT WM_ERASEBKGND WM_WINDOWPOSCHANGED (NOMOVE|NOSIZE|NOZORDER|SHOWWINDOW) WM_SIZE (NOT from DefWindowProc) WM_MOVE (NOT from DefWindowProc) (WM_NCHITTEST and WM_SETCURSOR will tend to follow immediately after the ShowWindow if the mouse is inside the window) DestroyWindow (for overlapped window) (32) Messages sent: WM_WINDOWPOSCHANGING (wParam=0) WM_WINDOWPOSCHANGED (wParam=0) WM_NCACTIVATE (wParam=0) WM_ACTIVATE (wParam=0) WM_ACTIVATEAPP (wParam=0) WM_KILLFOCUS (wParam=0) WM_DESTROY WM_NCDESTROY CreateWindow (for child window, not initially visible) Messages sent: WM_NCCREATE (child is inserted into parent's child list after WM_NCCREATE returns) WM_NCCALCSIZE (wParam=0) WM_CREATE WM_SIZE WM_MOVE (to parent window) WM_PARENTNOTIFY (wParam=1) ShowWindow (for child window) Messages sent: WM_SHOWWINDOW (wParam=1) WM_WINDOWPOSCHANGING (wParam=0) (to parent window) WM_ERASEBKGND WM_WINDOWPOSCHANGED (wParam=0) DestroyWindow (for child window) Messages sent: (to parent window) WM_PARENTNOTIFY (wParam=2) WM_SHOWWINDOW (wParam=0) WM_WINDOWPOSCHANGING (wParam=0) (to parent window) WM_ERASEBKGND WM_WINDOWPOSCHANGED (wParam=0) WM_DESTROY WM_NCDESTROY Moving the mouse: Messages sent: WM_NCHITTEST WM_SETCURSOR Messages posted: WM_MOUSEMOVE, if WM_NCHITTEST returns HTCLIENT WM_NCMOUSEMOVE, if WM_NCHITTEST returns somewhere in nonclient area (not HTNOWHERE) Moving by dragging the title bar (after WM_NCHITTEST and WM_SETCURSOR) (outline move): WM_NCLBUTTONDOWN (wParam=2=HTCAPTION) DefWindowProc: WM_SYSCOMMAND (wParam=0xf012=SC_MOVE+2) DefWindowProc: WM_GETMINMAXINFO WM_ENTERSIZEMOVE WM_WINDOWPOSCHANGING WM_WINDOWPOSCHANGED DefWindowProc: WM_MOVE WM_EXITSIZEMOVE Sizing by dragging the thick borders (after WM_NCHITTEST and WM_SETCURSOR) (outline move): WM_NCLBUTTONDOWN (wParam=0xd) DefWindowProc: WM_SYSCOMMAND (wParam=0xf004) DefWindowProc: WM_GETMINMAXINFO WM_ENTERSIZEMOVE WM_SIZING (wParam=4) (many times, probably one for each mouse movement) WM_WINDOWPOSCHANGING DefWindowProc: WM_GETMINMAXINFO WM_NCCALCSIZE (wParam=1) WM_NCPAINT (wParam=1) DefWindowProc: WM_GETTEXT WM_ERASEBKGND WM_WINDOWPOSCHANGED DefWindowProc: WM_MOVE WM_SIZE WM_EXITSIZEMOVE Resizing child window with MoveWindow (32): WM_WINDOWPOSCHANGING WM_NCCALCSIZE (wParam=1) WM_ERASEBKGND WM_WINDOWPOSCHANGED DefWindowProc: WM_MOVE WM_SIZE Clicking on inactive button: Messages sent: WM_NCHITTEST (to parent window) WM_PARENTNOTIFY (wParam=0x201=WM_LBUTTONDOWN) WM_MOUSEACTIVATE ButtonProc->DefWindowProc: (to parent window) WM_MOUSEACTIVATE WM_SETCURSOR ButtonProc->DefWindowProc: (to parent window) WM_SETCURSOR Messages posted: WM_LBUTTONDOWN (to parent window) WM_KILLFOCUS WM_SETFOCUS (to parent window) WM_CTLCOLORBTN BM_SETSTATE32 (to parent window) WM_CTLCOLORBTN WM_LBUTTONUP BM_SETSTATE32 (to parent window) WM_CTLCOLORBTN (to parent window) WM_COMMAND Reparenting a button (16/32): WM_SHOWWINDOW (wParam=0) WM_WINDOWPOSCHANGING (HIDEWINDOW|NOACTIVATE|NOMOVE|NOSIZE|NOZORDER) (to parent window) WM_ERASEBKGND WM_WINDOWPOSCHANGED (HIDEWINDOW|NOACTIVATE|NOMOVE|NOSIZE|NOZORDER) WM_WINDOWPOSCHANGING (NOSIZE|NOZORDER) WM_CHILDACTIVATE WM_WINDOWPOSCHANGED (NOSIZE|NOREDRAW|NOZORDER) DefWindowProc: WM_MOVE WM_SHOWWINDOW (wParam=1) The last child (button) reparented gets topmost for its new parent. Creation of a modal dialog (32): (to parent window) WM_CANCELMODE (to parent window) WM_KILLFOCUS (to parent window) WM_ENABLE (wParam=0) (window proc creation messages not tracked yet, because...) (dlgproc) WM_SETFONT (dlgproc) WM_INITDIALOG (...the window proc message hook was installed here, IsVisible still FALSE) (to parent window) WM_NCACTIVATE (wParam=0) DefWindowProc: WM_GETTEXT (to parent window) WM_ACTIVATE (wParam=0) WM_WINDOWPOSCHANGING (to parent window) WM_WINDOWPOSCHANGING WM_NCACTIVATE (wParam=1) WM_ACTIVATE (wParam=1) (setting focus) WM_SHOWWINDOW (wParam=1) WM_WINDOWPOSCHANGING WM_NCPAINT DefWindowProc: WM_GETTEXT WM_ERASEBKGND DialogWindowProc(?): WM_CTLCOLORDLG WM_WINDOWPOSCHANGED WM_PAINT (bunch of WM_CTLCOLOR* for each control) (to parent window) WM_PAINT (to parent window) WM_ENTERIDLE (wParam=0) (to parent window) WM_SETCURSOR Destruction of a modal dialog (32): (inside dialog proc: EndDialog is called) (to parent window) WM_ENABLE (wParam=1) WM_SETFOCUS WM_WINDOWPOSCHANGING (to parent window) WM_NCPAINT DefWindowProc: WM_GETTEXT (to parent window) WM_ERASEBKGND WM_WINDOWPOSCHANGED WM_NCACTIVATE (wParam=0) WM_ACTIVATE (wParam=0) WM_WINDOWPOSCHANGING (to parent window) WM_WINDOWPOSCHANGING (to parent window) WM_NCACTIVATE (wParam=1) DefWindowProc: WM_GETTEXT (to parent window) WM_ACTIVATE (wParam=1) (to dialog) WM_KILLFOCUS (to parent window) WM_SETFOCUS WM_DESTROY WM_NCDESTROY Creation of a modal dialog that is resized inside WM_INITDIALOG (32): (inside dialog proc, handling WM_INITDIALOG) WM_WINDOWPOSCHANGING WM_NCCALCSIZE (to parent window) WM_NCACTIVATE (wParam=0) DefWindowProc: WM_GETTEXT (to parent window) WM_ACTIVATE (wParam=0) WM_WINDOWPOSCHANGING (to parent window) WM_WINDOWPOSCHANGING WM_NCACTIVATE (wParam=1) WM_ACTIVATE (wParam=1) WM_WINDOWPOSCHANGED DefWindowProc: WM_SIZE (setting focus) WM_SHOWWINDOW (wParam=1) WM_WINDOWPOSCHANGING WM_NCPAINT DefWindowProc: WM_GETTEXT WM_ERASEBKGND DialogWindowProc(?): WM_CTLCOLORDLG WM_WINDOWPOSCHANGED WM_PAINT (bunch of WM_CTLCOLOR* for each control) (to parent window) WM_PAINT (to parent window) WM_ENTERIDLE (wParam=0) (to parent window) WM_SETCURSOR