2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Win32k subsystem
4 * PURPOSE: Miscellaneous User functions
5 * FILE: win32ss/user/ntuser/defwnd.c
12 DBG_DEFAULT_CHANNEL(UserDefwnd
);
14 INT WINAPI
DrawTextExWorker( HDC hdc
, LPWSTR str
, INT i_count
,
15 LPRECT rect
, UINT flags
, LPDRAWTEXTPARAMS dtp
);
17 INT WINAPI
DrawTextW( HDC hdc
, LPCWSTR str
, INT count
, LPRECT rect
, UINT flags
)
21 memset (&dtp
, 0, sizeof(dtp
));
22 dtp
.cbSize
= sizeof(dtp
);
23 if (flags
& DT_TABSTOP
)
25 dtp
.iTabLength
= (flags
>> 8) & 0xff;
28 return DrawTextExWorker(hdc
, (LPWSTR
)str
, count
, rect
, flags
, &dtp
);
33 DefWndControlColor(HDC hDC
, UINT ctlType
)
35 if (ctlType
== CTLCOLOR_SCROLLBAR
)
37 HBRUSH hb
= IntGetSysColorBrush(COLOR_SCROLLBAR
);
38 COLORREF bk
= IntGetSysColor(COLOR_3DHILIGHT
);
39 IntGdiSetTextColor(hDC
, IntGetSysColor(COLOR_3DFACE
));
40 IntGdiSetBkColor(hDC
, bk
);
42 /* if COLOR_WINDOW happens to be the same as COLOR_3DHILIGHT
43 * we better use 0x55aa bitmap brush to make scrollbar's background
44 * look different from the window background.
46 if ( bk
== IntGetSysColor(COLOR_WINDOW
))
49 NtGdiUnrealizeObject( hb
);
53 IntGdiSetTextColor(hDC
, IntGetSysColor(COLOR_WINDOWTEXT
));
55 if ((ctlType
== CTLCOLOR_EDIT
) || (ctlType
== CTLCOLOR_LISTBOX
))
57 IntGdiSetBkColor(hDC
, IntGetSysColor(COLOR_WINDOW
));
61 IntGdiSetBkColor(hDC
, IntGetSysColor(COLOR_3DFACE
));
62 return IntGetSysColorBrush(COLOR_3DFACE
);
65 return IntGetSysColorBrush(COLOR_WINDOW
);
69 DefWndHandleWindowPosChanging(PWND pWnd
, WINDOWPOS
* Pos
)
71 POINT maxTrack
, minTrack
;
72 LONG style
= pWnd
->style
;
74 if (Pos
->flags
& SWP_NOSIZE
) return 0;
75 if ((style
& WS_THICKFRAME
) || ((style
& (WS_POPUP
| WS_CHILD
)) == 0))
77 co_WinPosGetMinMaxInfo(pWnd
, NULL
, NULL
, &minTrack
, &maxTrack
);
78 Pos
->cx
= min(Pos
->cx
, maxTrack
.x
);
79 Pos
->cy
= min(Pos
->cy
, maxTrack
.y
);
80 if (!(style
& WS_MINIMIZE
))
82 if (Pos
->cx
< minTrack
.x
) Pos
->cx
= minTrack
.x
;
83 if (Pos
->cy
< minTrack
.y
) Pos
->cy
= minTrack
.y
;
88 Pos
->cx
= max(Pos
->cx
, 0);
89 Pos
->cy
= max(Pos
->cy
, 0);
95 DefWndHandleWindowPosChanged(PWND pWnd
, WINDOWPOS
* Pos
)
98 LONG style
= pWnd
->style
;
100 IntGetClientRect(pWnd
, &Rect
);
101 IntMapWindowPoints(pWnd
, (style
& WS_CHILD
? IntGetParent(pWnd
) : NULL
), (LPPOINT
) &Rect
, 2);
103 if (!(Pos
->flags
& SWP_NOCLIENTMOVE
))
105 co_IntSendMessage(UserHMGetHandle(pWnd
), WM_MOVE
, 0, MAKELONG(Rect
.left
, Rect
.top
));
108 if (!(Pos
->flags
& SWP_NOCLIENTSIZE
) || (Pos
->flags
& SWP_STATECHANGED
))
110 if (style
& WS_MINIMIZE
) co_IntSendMessage(UserHMGetHandle(pWnd
), WM_SIZE
, SIZE_MINIMIZED
, 0 );
113 WPARAM wp
= (style
& WS_MAXIMIZE
) ? SIZE_MAXIMIZED
: SIZE_RESTORED
;
114 co_IntSendMessage(UserHMGetHandle(pWnd
), WM_SIZE
, wp
, MAKELONG(Rect
.right
- Rect
.left
, Rect
.bottom
- Rect
.top
));
121 // Handle a WM_SYSCOMMAND message. Called from DefWindowProc().
124 DefWndHandleSysCommand(PWND pWnd
, WPARAM wParam
, LPARAM lParam
)
129 if (ISITHOOKED(WH_CBT
) || (pWnd
->head
.rpdesk
->pDeskInfo
->fsHooks
& HOOKID_TO_FLAG(WH_CBT
)))
132 lResult
= co_HOOK_CallHooks(WH_CBT
, HCBT_SYSCOMMAND
, wParam
, lParam
);
134 if (lResult
) return lResult
;
137 switch (wParam
& 0xfff0)
141 DefWndDoSizeMove(pWnd
, wParam
);
145 if (UserHMGetHandle(pWnd
) == UserGetActiveWindow())
146 IntShowOwnedPopups(pWnd
,FALSE
); // This is done in ShowWindow! Need to retest!
147 co_WinPosShowWindow( pWnd
, SW_MINIMIZE
);
151 if (((pWnd
->style
& WS_MINIMIZE
) != 0) && UserHMGetHandle(pWnd
) == UserGetActiveWindow())
152 IntShowOwnedPopups(pWnd
,TRUE
);
153 co_WinPosShowWindow( pWnd
, SW_MAXIMIZE
);
157 if (((pWnd
->style
& WS_MINIMIZE
) != 0) && UserHMGetHandle(pWnd
) == UserGetActiveWindow())
158 IntShowOwnedPopups(pWnd
,TRUE
);
159 co_WinPosShowWindow( pWnd
, SW_RESTORE
);
163 return co_IntSendMessage(UserHMGetHandle(pWnd
), WM_CLOSE
, 0, 0);
166 ERR("Screensaver Called!\n");
167 UserPostMessage(hwndSAS
, WM_LOGONNOTIFY
, LN_START_SCREENSAVE
, 0); // always lParam 0 == not Secure
172 USER_REFERENCE_ENTRY Ref
;
174 pWnd
= ValidateHwndNoErr((HWND
)lParam
);
177 if (pWnd
->spwndLastActive
)
179 pWnd
= pWnd
->spwndLastActive
;
181 UserRefObjectCo(pWnd
, &Ref
);
182 co_IntSetForegroundWindow(pWnd
);
183 UserDerefObjectCo(pWnd
);
184 if (pWnd
->style
& WS_MINIMIZE
)
186 UserPostMessage(UserHMGetHandle(pWnd
), WM_SYSCOMMAND
, SC_RESTORE
, 0);
195 Pt
.x
= (short)LOWORD(lParam
);
196 Pt
.y
= (short)HIWORD(lParam
);
197 MENU_TrackMouseMenuBar(pWnd
, wParam
& 0x000f, Pt
);
202 MENU_TrackKbdMenuBar(pWnd
, wParam
, (WCHAR
)lParam
);
207 // We do not support anything else here so we should return normal even when sending a hook.
211 return(Hook
? 1 : 0); // Don't call us again from user space.
215 co_IntFindChildWindowToOwner(PWND Root
, PWND Owner
)
218 PWND Child
, OwnerWnd
;
220 for(Child
= Root
->spwndChild
; Child
; Child
= Child
->spwndNext
)
222 OwnerWnd
= Child
->spwndOwner
;
226 if (!(Child
->style
& WS_POPUP
) ||
227 !(Child
->style
& WS_VISIBLE
) ||
228 /* Fixes CMD pop up properties window from having foreground. */
229 Owner
->head
.pti
->MessageQueue
!= Child
->head
.pti
->MessageQueue
)
232 if(OwnerWnd
== Owner
)
242 DefWndHandleSetCursor(PWND pWnd
, WPARAM wParam
, LPARAM lParam
)
244 PWND pwndPopUP
= NULL
;
245 WORD Msg
= HIWORD(lParam
);
247 /* Not for child windows. */
248 if (UserHMGetHandle(pWnd
) != (HWND
)wParam
)
253 switch((short)LOWORD(lParam
))
257 //// This is the real fix for CORE-6129! This was a "Code hole".
258 USER_REFERENCE_ENTRY Ref
;
260 if (Msg
== WM_LBUTTONDOWN
)
262 // Find a pop up window to bring active.
263 pwndPopUP
= co_IntFindChildWindowToOwner(UserGetDesktopWindow(), pWnd
);
266 // Not a child pop up from desktop.
267 if ( pwndPopUP
!= UserGetDesktopWindow()->spwndChild
)
269 // Get original active window.
270 PWND pwndOrigActive
= gpqForeground
->spwndActive
;
272 co_WinPosSetWindowPos(pWnd
, NULL
, 0, 0, 0, 0, SWP_NOMOVE
| SWP_NOSIZE
| SWP_NOACTIVATE
);
274 UserRefObjectCo(pwndPopUP
, &Ref
);
275 //UserSetActiveWindow(pwndPopUP);
276 co_IntSetForegroundWindow(pwndPopUP
); // HACK
277 UserDerefObjectCo(pwndPopUP
);
279 // If the change was made, break out.
280 if (pwndOrigActive
!= gpqForeground
->spwndActive
)
286 if (Msg
== WM_LBUTTONDOWN
|| Msg
== WM_MBUTTONDOWN
||
287 Msg
== WM_RBUTTONDOWN
|| Msg
== WM_XBUTTONDOWN
)
293 UserHMGetHandle(pwndPopUP
),
295 gspv
.dwForegroundFlashCount
,
296 (gpsi
->dtCaretBlink
>> 3)};
298 // Now shake that window!
299 IntFlashWindowEx(pwndPopUP
, &fwi
);
301 UserPostMessage(hwndSAS
, WM_LOGONNOTIFY
, LN_MESSAGE_BEEP
, 0);
308 if (pWnd
->pcls
->spcur
)
310 UserSetCursor(pWnd
->pcls
->spcur
, FALSE
);
318 if (pWnd
->style
& WS_MAXIMIZE
)
322 UserSetCursor(SYSTEMCUR(SIZEWE
), FALSE
);
329 if (pWnd
->style
& WS_MAXIMIZE
)
333 UserSetCursor(SYSTEMCUR(SIZENS
), FALSE
);
340 if (pWnd
->style
& WS_MAXIMIZE
)
344 UserSetCursor(SYSTEMCUR(SIZENWSE
), FALSE
);
351 if (pWnd
->style
& WS_MAXIMIZE
)
355 UserSetCursor(SYSTEMCUR(SIZENESW
), FALSE
);
359 UserSetCursor(SYSTEMCUR(ARROW
), FALSE
);
363 VOID FASTCALL
DefWndPrint( PWND pwnd
, HDC hdc
, ULONG uFlags
)
368 if ( (uFlags
& PRF_CHECKVISIBLE
) &&
369 !IntIsWindowVisible(pwnd
) )
373 * Unimplemented flags.
375 if ( (uFlags
& PRF_CHILDREN
) ||
376 (uFlags
& PRF_OWNED
) ||
377 (uFlags
& PRF_NONCLIENT
) )
379 FIXME("WM_PRINT message with unsupported flags\n");
385 if ( uFlags
& PRF_ERASEBKGND
)
386 co_IntSendMessage(UserHMGetHandle(pwnd
), WM_ERASEBKGND
, (WPARAM
)hdc
, 0);
391 if ( uFlags
& PRF_CLIENT
)
392 co_IntSendMessage(UserHMGetHandle(pwnd
), WM_PRINTCLIENT
, (WPARAM
)hdc
, uFlags
);
396 UserPaintCaption(PWND pWnd
, INT Flags
)
400 if ( pWnd
->style
& WS_VISIBLE
&& (pWnd
->style
& WS_CAPTION
) == WS_CAPTION
)
403 if (pWnd
->state
& WNDS_HASCAPTION
&& pWnd
->head
.pti
->MessageQueue
== gpqForeground
)
406 * When themes are not enabled we can go on and paint the non client area.
407 * However if we do that with themes enabled we will draw a classic frame.
408 * This is sovled by sending a themes specific message to notify the themes
409 * engine that the caption needs to be redrawn
411 if (gpsi
->dwSRVIFlags
& SRVINFO_APIHOOK
)
414 * This will cause uxtheme to either paint the themed caption or call
415 * RealUserDrawCaption in order to draw the classic caption when themes
416 * are disabled but the themes service is enabled
418 co_IntSendMessage(UserHMGetHandle(pWnd
), WM_NCUAHDRAWCAPTION
, Flags
, 0);
422 HDC hDC
= UserGetDCEx(pWnd
, NULL
, DCX_WINDOW
|DCX_USESTYLE
);
423 UserDrawCaptionBar(pWnd
, hDC
, Flags
);
424 UserReleaseDC(pWnd
, hDC
, FALSE
);
428 // Support window tray
434 DefWndSetIcon(PWND pWnd
, WPARAM wParam
, LPARAM lParam
)
436 HICON hIcon
, hIconSmall
, hIconOld
;
438 if ( wParam
> ICON_SMALL2
)
440 EngSetLastError(ERROR_INVALID_PARAMETER
);
443 hIconSmall
= UserGetProp(pWnd
, gpsi
->atomIconSmProp
);
444 hIcon
= UserGetProp(pWnd
, gpsi
->atomIconProp
);
446 hIconOld
= wParam
== ICON_BIG
? hIcon
: hIconSmall
;
451 hIcon
= (HICON
)lParam
;
454 hIconSmall
= (HICON
)lParam
;
457 ERR("FIXME: Set ICON_SMALL2 support!\n");
462 IntSetProp(pWnd
, gpsi
->atomIconProp
, hIcon
);
463 IntSetProp(pWnd
, gpsi
->atomIconSmProp
, hIconSmall
);
465 if ((pWnd
->style
& WS_CAPTION
) == WS_CAPTION
)
466 UserPaintCaption(pWnd
, DC_CAPTION
);
468 return (LRESULT
)hIconOld
;
472 DefWndGetIcon(PWND pWnd
, WPARAM wParam
, LPARAM lParam
)
475 if ( wParam
> ICON_SMALL2
)
477 EngSetLastError(ERROR_INVALID_PARAMETER
);
483 hIconRet
= UserGetProp(pWnd
, gpsi
->atomIconProp
);
487 hIconRet
= UserGetProp(pWnd
, gpsi
->atomIconSmProp
);
492 return (LRESULT
)hIconRet
;
496 DefWndScreenshot(PWND pWnd
)
504 SETCLIPBDATA scd
= {FALSE
, FALSE
};
506 UserOpenClipboard(UserHMGetHandle(pWnd
));
507 UserEmptyClipboard();
509 hdc
= UserGetWindowDC(pWnd
);
510 IntGetWindowRect(pWnd
, &rect
);
511 w
= rect
.right
- rect
.left
;
512 h
= rect
.bottom
- rect
.top
;
514 hbitmap
= NtGdiCreateCompatibleBitmap(hdc
, w
, h
);
515 hdc2
= NtGdiCreateCompatibleDC(hdc
);
516 NtGdiSelectBitmap(hdc2
, hbitmap
);
518 NtGdiBitBlt(hdc2
, 0, 0, w
, h
, hdc
, 0, 0, SRCCOPY
, 0, 0);
520 UserSetClipboardData(CF_BITMAP
, hbitmap
, &scd
);
522 UserReleaseDC(pWnd
, hdc
, FALSE
);
523 UserReleaseDC(pWnd
, hdc2
, FALSE
);
525 UserCloseClipboard();
529 Win32k counterpart of User DefWindowProc
539 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
541 USER_REFERENCE_ENTRY Ref
;
543 if (Msg
> WM_USER
) return 0;
547 case WM_GETTEXTLENGTH
:
552 if (Wnd
!= NULL
&& Wnd
->strName
.Length
!= 0)
554 buf
= Wnd
->strName
.Buffer
;
556 NT_SUCCESS(RtlUnicodeToMultiByteSize(&len
,
558 Wnd
->strName
.Length
)))
560 lResult
= (LRESULT
) (Wnd
->strName
.Length
/ sizeof(WCHAR
));
568 case WM_GETTEXT
: // FIXME: Handle Ansi
571 PWSTR outbuf
= (PWSTR
)lParam
;
573 if (Wnd
!= NULL
&& wParam
!= 0)
575 if (Wnd
->strName
.Buffer
!= NULL
)
576 buf
= Wnd
->strName
.Buffer
;
582 if (Wnd
->strName
.Length
!= 0)
584 lResult
= min(Wnd
->strName
.Length
/ sizeof(WCHAR
), wParam
- 1);
585 RtlCopyMemory(outbuf
,
587 lResult
* sizeof(WCHAR
));
588 outbuf
[lResult
] = L
'\0';
597 case WM_SETTEXT
: // FIXME: Handle Ansi
599 DefSetText(Wnd
, (PCWSTR
)lParam
);
601 if ((Wnd
->style
& WS_CAPTION
) == WS_CAPTION
)
602 UserPaintCaption(Wnd
, DC_TEXT
);
603 IntNotifyWinEvent(EVENT_OBJECT_NAMECHANGE
, Wnd
, OBJID_WINDOW
, CHILDID_SELF
, 0);
610 TRACE("hwnd %p WM_SYSCOMMAND %lx %lx\n", Wnd
->head
.h
, wParam
, lParam
);
611 lResult
= DefWndHandleSysCommand(Wnd
, wParam
, lParam
);
617 if ((Wnd
->style
& WS_VISIBLE
) && wParam
) break;
618 if (!(Wnd
->style
& WS_VISIBLE
) && !wParam
) break;
619 if (!Wnd
->spwndOwner
) break;
624 if (!(Wnd
->state
& WNDS_HIDDENPOPUP
)) break;
625 Wnd
->state
&= ~WNDS_HIDDENPOPUP
;
628 Wnd
->state
|= WNDS_HIDDENPOPUP
;
630 co_WinPosShowWindow(Wnd
, wParam
? SW_SHOWNOACTIVATE
: SW_HIDE
);
635 case WM_CLIENTSHUTDOWN
:
636 return IntClientShutdown(Wnd
, wParam
, lParam
);
639 if ( (Wnd
->style
& (WS_POPUP
|WS_CHILD
)) != WS_CHILD
&&
640 Wnd
!= co_GetDesktopWindow(Wnd
) )
642 if (!co_HOOK_CallHooks(WH_SHELL
, HSHELL_APPCOMMAND
, wParam
, lParam
))
643 co_IntShellHookNotify(HSHELL_APPCOMMAND
, wParam
, lParam
);
646 UserRefObjectCo(Wnd
->spwndParent
, &Ref
);
647 lResult
= co_IntSendMessage(UserHMGetHandle(Wnd
->spwndParent
), WM_APPCOMMAND
, wParam
, lParam
);
648 UserDerefObjectCo(Wnd
->spwndParent
);
654 HMENU hMenu
= UlongToHandle(Wnd
->IDMenu
);
655 PWND pwndActive
= MENU_IsMenuActive();
656 hi
.cbSize
= sizeof(HELPINFO
);
657 hi
.MousePos
= gpsi
->ptCursor
;
658 hi
.iContextType
= HELPINFO_MENUITEM
;
659 hi
.hItemHandle
= pwndActive
? UserHMGetHandle(pwndActive
) : UserHMGetHandle(Wnd
);
660 hi
.iCtrlId
= (Wnd
->style
& (WS_POPUP
|WS_CHILD
)) == WS_CHILD
? IntMenuItemFromPoint(Wnd
, hMenu
, hi
.MousePos
) : 0;
661 hi
.dwContextId
= IntGetWindowContextHelpId(Wnd
);
663 co_IntSendMessage( UserHMGetHandle(Wnd
), WM_HELP
, 0, (LPARAM
)&hi
);
669 return DefWndSetIcon(Wnd
, wParam
, lParam
);
674 return DefWndGetIcon(Wnd
, wParam
, lParam
);
679 PWND Parent
= IntGetParent(Wnd
);
680 co_IntSendMessage(UserHMGetHandle(Parent
), Msg
, wParam
, lParam
);
687 pti
->MessageQueue
->QF_flags
&= ~(QF_FMENUSTATUS
|QF_FMENUSTATUSBREAK
);
690 case WM_NCLBUTTONDOWN
:
691 return (NC_HandleNCLButtonDown( Wnd
, wParam
, lParam
));
693 case WM_LBUTTONDBLCLK
:
694 return (NC_HandleNCLButtonDblClk( Wnd
, HTCLIENT
, lParam
));
696 case WM_NCLBUTTONDBLCLK
:
697 return (NC_HandleNCLButtonDblClk( Wnd
, wParam
, lParam
));
699 case WM_NCRBUTTONDOWN
:
700 return NC_HandleNCRButtonDown( Wnd
, wParam
, lParam
);
706 Pt
.x
= GET_X_LPARAM(lParam
);
707 Pt
.y
= GET_Y_LPARAM(lParam
);
708 IntClientToScreen(Wnd
, &Pt
);
709 lParam
= MAKELPARAM(Pt
.x
, Pt
.y
);
710 co_IntSendMessage(UserHMGetHandle(Wnd
), WM_CONTEXTMENU
, (WPARAM
)UserHMGetHandle(Wnd
), lParam
);
716 * FIXME : we must NOT send WM_CONTEXTMENU on a WM_NCRBUTTONUP (checked
717 * in Windows), but what _should_ we do? According to MSDN :
718 * "If it is appropriate to do so, the system sends the WM_SYSCOMMAND
719 * message to the window". When is it appropriate?
721 ERR("WM_NCRBUTTONUP\n");
726 if (Wnd
->style
& WS_CHILD
)
728 co_IntSendMessage(UserHMGetHandle(IntGetParent(Wnd
)), Msg
, wParam
, lParam
);
738 Pt
.x
= GET_X_LPARAM(lParam
);
739 Pt
.y
= GET_Y_LPARAM(lParam
);
740 if (Style
& WS_CHILD
)
742 IntScreenToClient(IntGetParent(Wnd
), &Pt
);
745 HitCode
= GetNCHitEx(Wnd
, Pt
);
747 if (HitCode
== HTCAPTION
|| HitCode
== HTSYSMENU
)
752 if((SystemMenu
= IntGetSystemMenu(Wnd
, FALSE
)))
754 MENU_InitSysMenuPopup(SystemMenu
, Wnd
->style
, Wnd
->pcls
->style
, HitCode
);
756 if(HitCode
== HTCAPTION
)
757 Flags
= TPM_LEFTBUTTON
| TPM_RIGHTBUTTON
;
759 Flags
= TPM_LEFTBUTTON
;
761 IntTrackPopupMenuEx(SystemMenu
, Flags
|TPM_SYSTEM_MENU
, Pt
.x
, Pt
.y
, Wnd
, NULL
);
764 if (HitCode
== HTHSCROLL
|| HitCode
== HTVSCROLL
)
766 WARN("Scroll Menu Not Supported\n");
773 if (wParam
== VK_F10
)
775 pti
->MessageQueue
->QF_flags
|= QF_FF10STATUS
;
777 if (UserGetKeyState(VK_SHIFT
) & 0x8000)
779 co_IntSendMessage(UserHMGetHandle(Wnd
), WM_CONTEXTMENU
, (WPARAM
)UserHMGetHandle(Wnd
), MAKELPARAM(-1, -1));
786 if (HIWORD(lParam
) & KF_ALTDOWN
)
787 { /* Previous state, if the key was down before this message,
788 this is a cheap way to ignore autorepeat keys. */
789 if ( !(HIWORD(lParam
) & KF_REPEAT
) )
791 if ( ( wParam
== VK_MENU
||
792 wParam
== VK_LMENU
||
793 wParam
== VK_RMENU
) && !(pti
->MessageQueue
->QF_flags
& QF_FMENUSTATUS
)) //iMenuSysKey )
794 pti
->MessageQueue
->QF_flags
|= QF_FMENUSTATUS
; //iMenuSysKey = 1;
796 pti
->MessageQueue
->QF_flags
&= ~QF_FMENUSTATUS
; //iMenuSysKey = 0;
799 pti
->MessageQueue
->QF_flags
&= ~QF_FF10STATUS
; //iF10Key = 0;
801 if (wParam
== VK_F4
) /* Try to close the window */
803 PWND top
= UserGetAncestor(Wnd
, GA_ROOT
);
804 if (!(top
->style
& CS_NOCLOSE
))
805 UserPostMessage(UserHMGetHandle(top
), WM_SYSCOMMAND
, SC_CLOSE
, 0);
807 else if (wParam
== VK_SNAPSHOT
) // Alt-VK_SNAPSHOT?
810 while (IntGetParent(pwnd
) != NULL
)
812 pwnd
= IntGetParent(pwnd
);
814 ERR("DefWndScreenshot\n");
815 DefWndScreenshot(pwnd
);
817 else if ( wParam
== VK_ESCAPE
|| wParam
== VK_TAB
) // Alt-Tab/ESC Alt-Shift-Tab/ESC
820 HWND Active
= UserGetActiveWindow(); // Noticed MDI problem.
823 FIXME("WM_SYSKEYDOWN VK_ESCAPE no active\n");
826 wParamTmp
= UserGetKeyState(VK_SHIFT
) & 0x8000 ? SC_PREVWINDOW
: SC_NEXTWINDOW
;
827 co_IntSendMessage( Active
, WM_SYSCOMMAND
, wParamTmp
, wParam
);
830 else if( wParam
== VK_F10
)
832 if (UserGetKeyState(VK_SHIFT
) & 0x8000)
833 co_IntSendMessage( UserHMGetHandle(Wnd
), WM_CONTEXTMENU
, (WPARAM
)UserHMGetHandle(Wnd
), MAKELPARAM(-1, -1) );
834 pti
->MessageQueue
->QF_flags
|= QF_FF10STATUS
; //iF10Key = 1;
836 else if( wParam
== VK_ESCAPE
&& (UserGetKeyState(VK_SHIFT
) & 0x8000))
837 co_IntSendMessage( UserHMGetHandle(Wnd
), WM_SYSCOMMAND
, SC_KEYMENU
, ' ' );
844 /* Press and release F10 or ALT */
845 if (((wParam
== VK_MENU
|| wParam
== VK_LMENU
|| wParam
== VK_RMENU
)
846 && (pti
->MessageQueue
->QF_flags
& (QF_FMENUSTATUS
|QF_FMENUSTATUSBREAK
)) == QF_FMENUSTATUS
/*iMenuSysKey*/) ||
847 ((wParam
== VK_F10
) && pti
->MessageQueue
->QF_flags
& QF_FF10STATUS
/*iF10Key*/))
848 co_IntSendMessage( UserHMGetHandle(UserGetAncestor( Wnd
, GA_ROOT
)), WM_SYSCOMMAND
, SC_KEYMENU
, 0L );
849 pti
->MessageQueue
->QF_flags
&= ~(QF_FMENUSTATUS
|QF_FMENUSTATUSBREAK
|QF_FF10STATUS
); //iMenuSysKey = iF10Key = 0;
855 pti
->MessageQueue
->QF_flags
&= ~(QF_FMENUSTATUS
|QF_FMENUSTATUSBREAK
); //iMenuSysKey = 0;
856 if (wParam
== VK_RETURN
&& (Wnd
->style
& WS_MINIMIZE
) != 0)
858 UserPostMessage( UserHMGetHandle(Wnd
), WM_SYSCOMMAND
, SC_RESTORE
, 0L );
861 if ((HIWORD(lParam
) & KF_ALTDOWN
) && wParam
)
863 if (wParam
== VK_TAB
|| wParam
== VK_ESCAPE
) break;
864 if (wParam
== VK_SPACE
&& Wnd
->style
& WS_CHILD
)
865 co_IntSendMessage( UserHMGetHandle(IntGetParent(Wnd
)), Msg
, wParam
, lParam
);
867 co_IntSendMessage( UserHMGetHandle(Wnd
), WM_SYSCOMMAND
, SC_KEYMENU
, wParam
);
869 else /* check for Ctrl-Esc */
870 if (wParam
!= VK_ESCAPE
) UserPostMessage(hwndSAS
, WM_LOGONNOTIFY
, LN_MESSAGE_BEEP
, 0); //MessageBeep(0);
876 pti
->MessageQueue
->QF_flags
&= ~(QF_FMENUSTATUS
|QF_FMENUSTATUSBREAK
);
879 if (IntGetCaptureWindow() == UserHMGetHandle(Wnd
))
887 co_UserDestroyWindow(Wnd
);
890 case WM_CTLCOLORMSGBOX
:
891 case WM_CTLCOLOREDIT
:
892 case WM_CTLCOLORLISTBOX
:
895 case WM_CTLCOLORSTATIC
:
896 case WM_CTLCOLORSCROLLBAR
:
897 return (LRESULT
) DefWndControlColor((HDC
)wParam
, Msg
- WM_CTLCOLORMSGBOX
);
900 return (LRESULT
) DefWndControlColor((HDC
)wParam
, HIWORD(lParam
));
904 if (Wnd
->style
& WS_CHILD
)
906 /* with the exception of the border around a resizable wnd,
907 * give the parent first chance to set the cursor */
908 if (LOWORD(lParam
) < HTLEFT
|| LOWORD(lParam
) > HTBOTTOMRIGHT
)
910 PWND parent
= Wnd
->spwndParent
;//IntGetParent( Wnd );
911 if (parent
!= UserGetDesktopWindow() &&
912 co_IntSendMessage( UserHMGetHandle(parent
), WM_SETCURSOR
, wParam
, lParam
))
916 return DefWndHandleSetCursor(Wnd
, wParam
, lParam
);
919 case WM_MOUSEACTIVATE
:
920 if (Wnd
->style
& WS_CHILD
)
924 PWND pwndParent
= IntGetParent(Wnd
);
925 hwndParent
= pwndParent
? UserHMGetHandle(pwndParent
) : NULL
;
926 if (hwndParent
) Ret
= co_IntSendMessage(hwndParent
, WM_MOUSEACTIVATE
, wParam
, lParam
);
927 if (Ret
) return (Ret
);
929 return ( (HIWORD(lParam
) == WM_LBUTTONDOWN
&& LOWORD(lParam
) == HTCAPTION
) ? MA_NOACTIVATE
: MA_ACTIVATE
);
932 /* The default action in Windows is to set the keyboard focus to
933 * the window, if it's being activated and not minimized */
934 if (LOWORD(wParam
) != WA_INACTIVE
&&
935 !(Wnd
->style
& WS_MINIMIZE
))
937 //ERR("WM_ACTIVATE %p\n",hWnd);
938 co_UserSetFocus(Wnd
);
943 if (Wnd
->style
& WS_CHILD
)
946 PWND pwndParent
= IntGetParent(Wnd
);
947 hwndParent
= pwndParent
? UserHMGetHandle(pwndParent
) : NULL
;
948 return co_IntSendMessage( hwndParent
, WM_MOUSEWHEEL
, wParam
, lParam
);
953 case WM_ICONERASEBKGND
:
956 HBRUSH hBrush
= Wnd
->pcls
->hbrBackground
;
957 if (!hBrush
) return 0;
958 if (hBrush
<= (HBRUSH
)COLOR_MENUBAR
)
960 hBrush
= IntGetSysColorBrush((INT
)hBrush
);
962 if (Wnd
->pcls
->style
& CS_PARENTDC
)
964 /* can't use GetClipBox with a parent DC or we fill the whole parent */
965 IntGetClientRect(Wnd
, &Rect
);
966 GreDPtoLP((HDC
)wParam
, (LPPOINT
)&Rect
, 2);
970 GdiGetClipBox((HDC
)wParam
, &Rect
);
972 FillRect((HDC
)wParam
, &Rect
, hBrush
);
977 //ERR("WM_GETHOTKEY\n");
978 return DefWndGetHotKey(Wnd
);
980 //ERR("WM_SETHOTKEY\n");
981 return DefWndSetHotKey(Wnd
, wParam
);
986 Point
.x
= GET_X_LPARAM(lParam
);
987 Point
.y
= GET_Y_LPARAM(lParam
);
988 return GetNCHitEx(Wnd
, Point
);
993 DefWndPrint(Wnd
, (HDC
)wParam
, lParam
);
997 case WM_SYSCOLORCHANGE
:
999 /* force to redraw non-client area */
1000 UserPaintCaption(Wnd
, DC_NC
);
1001 /* Use InvalidateRect to redraw client area, enable
1002 * erase to redraw all subcontrols otherwise send the
1003 * WM_SYSCOLORCHANGE to child windows/controls is required
1005 co_UserRedrawWindow( Wnd
, NULL
, NULL
, RDW_ALLCHILDREN
|RDW_INVALIDATE
|RDW_ERASE
);
1015 /* If already in Paint and Client area is not empty just return. */
1016 if (Wnd
->state2
& WNDS2_STARTPAINT
&& !RECTL_bIsEmptyRect(&Wnd
->rcClient
))
1018 ERR("In Paint and Client area is not empty!\n");
1022 hDC
= IntBeginPaint(Wnd
, &Ps
);
1025 if (((Wnd
->style
& WS_MINIMIZE
) != 0) && (Wnd
->pcls
->spicn
))
1030 ERR("Doing Paint and Client area is empty!\n");
1031 IntGetClientRect(Wnd
, &ClientRect
);
1032 x
= (ClientRect
.right
- ClientRect
.left
- UserGetSystemMetrics(SM_CXICON
)) / 2;
1033 y
= (ClientRect
.bottom
- ClientRect
.top
- UserGetSystemMetrics(SM_CYICON
)) / 2;
1034 UserReferenceObject(Wnd
->pcls
->spicn
);
1035 UserDrawIconEx(hDC
, x
, y
, Wnd
->pcls
->spicn
, 0, 0, 0, 0, DI_NORMAL
| DI_COMPAT
| DI_DEFAULTSIZE
);
1036 UserDereferenceObject(Wnd
->pcls
->spicn
);
1039 IntEndPaint(Wnd
, &Ps
);
1047 Wnd
->state
&= ~WNDS_SYNCPAINTPENDING
;
1048 TRACE("WM_SYNCPAINT\n");
1049 hRgn
= NtGdiCreateRectRgn(0, 0, 0, 0);
1052 if (co_UserGetUpdateRgn(Wnd
, hRgn
, FALSE
) != NULLREGION
)
1054 PREGION pRgn
= REGION_LockRgn(hRgn
);
1055 if (pRgn
) REGION_UnlockRgn(pRgn
);
1057 wParam
= (RDW_ERASENOW
| RDW_ERASE
| RDW_FRAME
| RDW_ALLCHILDREN
);
1058 co_UserRedrawWindow(Wnd
, NULL
, pRgn
, wParam
);
1060 GreDeleteObject(hRgn
);
1068 if (!(Wnd
->style
& WS_VISIBLE
))
1070 IntSetStyle( Wnd
, WS_VISIBLE
, 0 );
1071 Wnd
->state
|= WNDS_SENDNCPAINT
;
1076 if (Wnd
->style
& WS_VISIBLE
)
1078 co_UserRedrawWindow( Wnd
, NULL
, NULL
, RDW_ALLCHILDREN
| RDW_VALIDATE
);
1079 IntSetStyle( Wnd
, 0, WS_VISIBLE
);
1084 case WM_WINDOWPOSCHANGING
:
1086 return (DefWndHandleWindowPosChanging(Wnd
, (WINDOWPOS
*)lParam
));
1089 case WM_WINDOWPOSCHANGED
:
1091 return (DefWndHandleWindowPosChanged(Wnd
, (WINDOWPOS
*)lParam
));
1096 return NC_HandleNCCalcSize( Wnd
, wParam
, (RECTL
*)lParam
);
1101 return NC_HandleNCActivate( Wnd
, wParam
, lParam
);
1109 HDC hDC
= UserGetDCEx(Wnd
, (HRGN
)wParam
, DCX_WINDOW
| DCX_INTERSECTRGN
| DCX_USESTYLE
| DCX_KEEPCLIPRGN
);
1110 Wnd
->state
|= WNDS_FORCEMENUDRAW
;
1111 NC_DoNCPaint(Wnd
, hDC
, -1);
1112 Wnd
->state
&= ~WNDS_FORCEMENUDRAW
;
1113 UserReleaseDC(Wnd
, hDC
, FALSE
);
1117 // Draw Caption mode.
1119 // wParam are DC_* flags.
1121 case WM_NCUAHDRAWCAPTION
:
1123 HDC hDC
= UserGetDCEx(Wnd
, NULL
, DCX_WINDOW
|DCX_USESTYLE
);
1124 TRACE("WM_NCUAHDRAWCAPTION: wParam DC_ flags %08x\n",wParam
);
1125 UserDrawCaptionBar(Wnd
, hDC
, wParam
|DC_FRAME
); // Include DC_FRAME to comp for drawing glich.
1126 UserReleaseDC(Wnd
, hDC
, FALSE
);
1132 // wParam is HDC, lParam are DC_ACTIVE and or DC_REDRAWHUNGWND.
1134 case WM_NCUAHDRAWFRAME
:
1136 TRACE("WM_NCUAHDRAWFRAME: wParam hDC %p lParam DC_ flags %08x\n",wParam
,lParam
);
1137 NC_DoNCPaint(Wnd
, (HDC
)wParam
, lParam
|DC_NC
);
1154 ProbeForRead((PVOID
)lParam
,
1162 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1169 lResult
= co_HOOK_CallHooks(WH_CBT
, HCBT_MOVESIZE
, (WPARAM
)Wnd
->head
.h
, lParam
? (LPARAM
)&rt
: 0);