| 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 |