blob: 45cd764203ac07d441e98b40c4ee6aa60ea80ed5 [file] [log] [blame]
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