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