3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS user32.dll
5 * FILE: lib/user32/windows/window.c
6 * PURPOSE: Window management
7 * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
9 * 06-06-2001 CSH Created
12 /* INCLUDES ******************************************************************/
16 #include <wine/debug.h>
17 WINE_DEFAULT_DEBUG_CHANNEL(user32
);
20 #define WM_SETVISIBLE 9
22 #ifndef WM_QUERYDROPOBJECT
23 #define WM_QUERYDROPOBJECT 0x022B
26 LRESULT
DefWndNCPaint(HWND hWnd
, HRGN hRgn
, BOOL Active
);
27 LRESULT
DefWndNCCalcSize(HWND hWnd
, BOOL CalcSizeStruct
, RECT
*Rect
);
28 LRESULT
DefWndNCActivate(HWND hWnd
, WPARAM wParam
);
29 LRESULT
DefWndNCHitTest(HWND hWnd
, POINT Point
);
30 LRESULT
DefWndNCLButtonDown(HWND hWnd
, WPARAM wParam
, LPARAM lParam
);
31 LRESULT
DefWndNCLButtonDblClk(HWND hWnd
, WPARAM wParam
, LPARAM lParam
);
32 void FASTCALL
MenuInitSysMenuPopup(HMENU Menu
, DWORD Style
, DWORD ClsStyle
, LONG HitTest
);
34 /* GLOBALS *******************************************************************/
36 /* Bits in the dwKeyData */
37 #define KEYDATA_ALT 0x2000
38 #define KEYDATA_PREVSTATE 0x4000
40 static short iF10Key
= 0;
41 static short iMenuSysKey
= 0;
43 /* FUNCTIONS *****************************************************************/
46 InitStockObjects(void)
48 /* FIXME - Instead of copying the stuff to usermode we should map the tables to
49 userland. The current implementation has one big flaw: the system color
50 table doesn't get updated when another process changes them. That's why
51 we should rather map the table into usermode. But it only affects the
52 SysColors table - the pens, brushes and stock objects are not affected
53 as their handles never change. But it'd be faster to map them, too. */
62 GetSysColor(int nIndex
)
64 if(nIndex
>= 0 && nIndex
<= NUM_SYSCOLORS
)
66 return g_psi
->SysColors
[nIndex
];
69 SetLastError(ERROR_INVALID_PARAMETER
);
77 GetSysColorPen(int nIndex
)
79 if(nIndex
>= 0 && nIndex
<= NUM_SYSCOLORS
)
81 return g_psi
->SysColorPens
[nIndex
];
84 SetLastError(ERROR_INVALID_PARAMETER
);
92 GetSysColorBrush(int nIndex
)
94 if(nIndex
>= 0 && nIndex
<= NUM_SYSCOLORS
)
96 return g_psi
->SysColorBrushes
[nIndex
];
99 SetLastError(ERROR_INVALID_PARAMETER
);
110 CONST INT
*lpaElements
,
111 CONST COLORREF
*lpaRgbValues
)
113 return NtUserSetSysColors(cElements
, lpaElements
, lpaRgbValues
, 0);
117 UserGetInsideRectNC(PWINDOW Wnd
, RECT
*rect
)
123 ExStyle
= Wnd
->ExStyle
;
125 rect
->top
= rect
->left
= 0;
126 rect
->right
= Wnd
->WindowRect
.right
- Wnd
->WindowRect
.left
;
127 rect
->bottom
= Wnd
->WindowRect
.bottom
- Wnd
->WindowRect
.top
;
129 if (Style
& WS_ICONIC
)
134 /* Remove frame from rectangle */
135 if (UserHasThickFrameStyle(Style
, ExStyle
))
137 InflateRect(rect
, -GetSystemMetrics(SM_CXFRAME
),
138 -GetSystemMetrics(SM_CYFRAME
));
142 if (UserHasDlgFrameStyle(Style
, ExStyle
))
144 InflateRect(rect
, -GetSystemMetrics(SM_CXDLGFRAME
),
145 -GetSystemMetrics(SM_CYDLGFRAME
));
146 /* FIXME: this isn't in NC_AdjustRect? why not? */
147 if (ExStyle
& WS_EX_DLGMODALFRAME
)
148 InflateRect( rect
, -1, 0 );
152 if (UserHasThinFrameStyle(Style
, ExStyle
))
154 InflateRect(rect
, -GetSystemMetrics(SM_CXBORDER
),
155 -GetSystemMetrics(SM_CYBORDER
));
163 DefWndSetRedraw(HWND hWnd
, WPARAM wParam
)
165 LONG Style
= GetWindowLong(hWnd
, GWL_STYLE
);
166 /* Content can be redrawn after a change. */
169 if (!(Style
& WS_VISIBLE
)) /* Not Visible */
171 SetWindowLong(hWnd
, GWL_STYLE
, WS_VISIBLE
);
174 else /* Content cannot be redrawn after a change. */
176 if (Style
& WS_VISIBLE
) /* Visible */
178 RedrawWindow( hWnd
, NULL
, 0, RDW_ALLCHILDREN
| RDW_VALIDATE
);
179 Style
&= ~WS_VISIBLE
;
180 SetWindowLong(hWnd
, GWL_STYLE
, Style
); /* clear bits */
188 DefWndHandleSetCursor(HWND hWnd
, WPARAM wParam
, LPARAM lParam
, ULONG Style
)
190 /* Not for child windows. */
191 if (hWnd
!= (HWND
)wParam
)
196 switch((INT_PTR
) LOWORD(lParam
))
200 WORD Msg
= HIWORD(lParam
);
201 if (Msg
== WM_LBUTTONDOWN
|| Msg
== WM_MBUTTONDOWN
||
202 Msg
== WM_RBUTTONDOWN
|| Msg
== WM_XBUTTONDOWN
)
211 HICON hCursor
= (HICON
)GetClassLongW(hWnd
, GCL_HCURSOR
);
223 if (Style
& WS_MAXIMIZE
)
227 return((LRESULT
)SetCursor(LoadCursorW(0, IDC_SIZEWE
)));
233 if (Style
& WS_MAXIMIZE
)
237 return((LRESULT
)SetCursor(LoadCursorW(0, IDC_SIZENS
)));
243 if (Style
& WS_MAXIMIZE
)
247 return((LRESULT
)SetCursor(LoadCursorW(0, IDC_SIZENWSE
)));
253 if (GetWindowLongW(hWnd
, GWL_STYLE
) & WS_MAXIMIZE
)
257 return((LRESULT
)SetCursor(LoadCursorW(0, IDC_SIZENESW
)));
260 return((LRESULT
)SetCursor(LoadCursorW(0, IDC_ARROW
)));
264 DefWndStartSizeMove(HWND hWnd
, PWINDOW Wnd
, WPARAM wParam
, POINT
*capturePoint
)
270 ULONG Style
= Wnd
->Style
;
272 rectWindow
= Wnd
->WindowRect
;
274 if ((wParam
& 0xfff0) == SC_MOVE
)
276 /* Move pointer at the center of the caption */
278 UserGetInsideRectNC(Wnd
, &rect
);
279 if (Style
& WS_SYSMENU
)
280 rect
.left
+= GetSystemMetrics(SM_CXSIZE
) + 1;
281 if (Style
& WS_MINIMIZEBOX
)
282 rect
.right
-= GetSystemMetrics(SM_CXSIZE
) + 1;
283 if (Style
& WS_MAXIMIZEBOX
)
284 rect
.right
-= GetSystemMetrics(SM_CXSIZE
) + 1;
285 pt
.x
= rectWindow
.left
+ (rect
.right
- rect
.left
) / 2;
286 pt
.y
= rectWindow
.top
+ rect
.top
+ GetSystemMetrics(SM_CYSIZE
)/2;
295 if (GetMessageW(&msg
, NULL
, 0, 0) <= 0)
300 hittest
= DefWndNCHitTest(hWnd
, msg
.pt
);
301 if ((hittest
< HTLEFT
) || (hittest
> HTBOTTOMRIGHT
))
313 pt
.x
=(rectWindow
.left
+rectWindow
.right
)/2;
314 pt
.y
= rectWindow
.top
+ GetSystemMetrics(SM_CYFRAME
) / 2;
318 pt
.x
=(rectWindow
.left
+rectWindow
.right
)/2;
319 pt
.y
= rectWindow
.bottom
- GetSystemMetrics(SM_CYFRAME
) / 2;
323 pt
.x
= rectWindow
.left
+ GetSystemMetrics(SM_CXFRAME
) / 2;
324 pt
.y
=(rectWindow
.top
+rectWindow
.bottom
)/2;
328 pt
.x
= rectWindow
.right
- GetSystemMetrics(SM_CXFRAME
) / 2;
329 pt
.y
=(rectWindow
.top
+rectWindow
.bottom
)/2;
332 case VK_ESCAPE
: return 0;
338 SetCursorPos( pt
.x
, pt
.y
);
339 DefWndHandleSetCursor(hWnd
, (WPARAM
)hWnd
, MAKELONG(hittest
, WM_MOUSEMOVE
), Style
);
343 #define ON_LEFT_BORDER(hit) \
344 (((hit) == HTLEFT) || ((hit) == HTTOPLEFT) || ((hit) == HTBOTTOMLEFT))
345 #define ON_RIGHT_BORDER(hit) \
346 (((hit) == HTRIGHT) || ((hit) == HTTOPRIGHT) || ((hit) == HTBOTTOMRIGHT))
347 #define ON_TOP_BORDER(hit) \
348 (((hit) == HTTOP) || ((hit) == HTTOPLEFT) || ((hit) == HTTOPRIGHT))
349 #define ON_BOTTOM_BORDER(hit) \
350 (((hit) == HTBOTTOM) || ((hit) == HTBOTTOMLEFT) || ((hit) == HTBOTTOMRIGHT))
353 UserDrawWindowFrame(HDC hdc
, const RECT
*rect
,
354 ULONG width
, ULONG height
)
356 static HBRUSH hDraggingRectBrush
= NULL
;
359 if(!hDraggingRectBrush
)
361 static HBITMAP hDraggingPattern
= NULL
;
362 const DWORD Pattern
[4] = {0x5555AAAA, 0x5555AAAA, 0x5555AAAA, 0x5555AAAA};
364 hDraggingPattern
= CreateBitmap(8, 8, 1, 1, Pattern
);
365 hDraggingRectBrush
= CreatePatternBrush(hDraggingPattern
);
368 hbrush
= SelectObject( hdc
, hDraggingRectBrush
);
369 PatBlt( hdc
, rect
->left
, rect
->top
,
370 rect
->right
- rect
->left
- width
, height
, PATINVERT
);
371 PatBlt( hdc
, rect
->left
, rect
->top
+ height
, width
,
372 rect
->bottom
- rect
->top
- height
, PATINVERT
);
373 PatBlt( hdc
, rect
->left
+ width
, rect
->bottom
- 1,
374 rect
->right
- rect
->left
- width
, -height
, PATINVERT
);
375 PatBlt( hdc
, rect
->right
- 1, rect
->top
, -width
,
376 rect
->bottom
- rect
->top
- height
, PATINVERT
);
377 SelectObject( hdc
, hbrush
);
381 UserDrawMovingFrame(HDC hdc
, RECT
*rect
, BOOL thickframe
)
385 UserDrawWindowFrame(hdc
, rect
, GetSystemMetrics(SM_CXFRAME
), GetSystemMetrics(SM_CYFRAME
));
389 UserDrawWindowFrame(hdc
, rect
, 1, 1);
394 DefWndDoSizeMove(HWND hwnd
, WORD wParam
)
398 RECT sizingRect
, mouseRect
, origRect
, clipRect
, unmodRect
;
400 LONG hittest
= (LONG
)(wParam
& 0x0f);
401 HCURSOR hDragCursor
= 0, hOldCursor
= 0;
402 POINT minTrack
, maxTrack
;
403 POINT capturePoint
, pt
;
404 ULONG Style
, ExStyle
;
408 DWORD dwPoint
= GetMessagePos();
409 BOOL DragFullWindows
= FALSE
;
410 HWND hWndParent
= NULL
;
413 Wnd
= ValidateHwnd(hwnd
);
418 ExStyle
= Wnd
->ExStyle
;
419 iconic
= (Style
& WS_MINIMIZE
) != 0;
421 SystemParametersInfoA(SPI_GETDRAGFULLWINDOWS
, 0, &DragFullWindows
, 0);
423 pt
.x
= GET_X_LPARAM(dwPoint
);
424 pt
.y
= GET_Y_LPARAM(dwPoint
);
427 if ((Style
& WS_MAXIMIZE
) || !IsWindowVisible(hwnd
))
432 thickframe
= UserHasThickFrameStyle(Style
, ExStyle
) && !(Style
& WS_MINIMIZE
);
433 if ((wParam
& 0xfff0) == SC_MOVE
)
437 hittest
= DefWndStartSizeMove(hwnd
, Wnd
, wParam
, &capturePoint
);
450 if (hittest
&& ((wParam
& 0xfff0) != SC_MOUSEMENU
))
452 hittest
+= (HTLEFT
- WMSZ_LEFT
);
457 hittest
= DefWndStartSizeMove(hwnd
, Wnd
, wParam
, &capturePoint
);
466 /* Get min/max info */
468 WinPosGetMinMaxInfo(hwnd
, NULL
, NULL
, &minTrack
, &maxTrack
);
469 sizingRect
= Wnd
->WindowRect
;
470 if (Style
& WS_CHILD
)
472 hWndParent
= GetParent(hwnd
);
473 MapWindowPoints( 0, hWndParent
, (LPPOINT
)&sizingRect
, 2 );
474 unmodRect
= sizingRect
;
475 GetClientRect(hWndParent
, &mouseRect
);
476 clipRect
= mouseRect
;
477 MapWindowPoints(hWndParent
, HWND_DESKTOP
, (LPPOINT
)&clipRect
, 2);
481 if(!(ExStyle
& WS_EX_TOPMOST
))
483 SystemParametersInfoW(SPI_GETWORKAREA
, 0, &clipRect
, 0);
484 mouseRect
= clipRect
;
488 SetRect(&mouseRect
, 0, 0, GetSystemMetrics(SM_CXSCREEN
), GetSystemMetrics(SM_CYSCREEN
));
489 clipRect
= mouseRect
;
491 unmodRect
= sizingRect
;
493 ClipCursor(&clipRect
);
495 origRect
= sizingRect
;
496 if (ON_LEFT_BORDER(hittest
))
498 mouseRect
.left
= max( mouseRect
.left
, sizingRect
.right
-maxTrack
.x
);
499 mouseRect
.right
= min( mouseRect
.right
, sizingRect
.right
-minTrack
.x
);
501 else if (ON_RIGHT_BORDER(hittest
))
503 mouseRect
.left
= max( mouseRect
.left
, sizingRect
.left
+minTrack
.x
);
504 mouseRect
.right
= min( mouseRect
.right
, sizingRect
.left
+maxTrack
.x
);
506 if (ON_TOP_BORDER(hittest
))
508 mouseRect
.top
= max( mouseRect
.top
, sizingRect
.bottom
-maxTrack
.y
);
509 mouseRect
.bottom
= min( mouseRect
.bottom
,sizingRect
.bottom
-minTrack
.y
);
511 else if (ON_BOTTOM_BORDER(hittest
))
513 mouseRect
.top
= max( mouseRect
.top
, sizingRect
.top
+minTrack
.y
);
514 mouseRect
.bottom
= min( mouseRect
.bottom
, sizingRect
.top
+maxTrack
.y
);
516 if (Style
& WS_CHILD
)
518 MapWindowPoints( hWndParent
, 0, (LPPOINT
)&mouseRect
, 2 );
521 SendMessageA( hwnd
, WM_ENTERSIZEMOVE
, 0, 0 );
522 (void)NtUserSetGUIThreadHandle(MSQ_STATE_MOVESIZE
, hwnd
);
523 if (GetCapture() != hwnd
) SetCapture( hwnd
);
525 if (Style
& WS_CHILD
)
527 /* Retrieve a default cache DC (without using the window style) */
528 hdc
= GetDCEx(hWndParent
, 0, DCX_CACHE
);
534 DesktopRgn
= CreateRectRgnIndirect(&clipRect
);
537 SelectObject(hdc
, DesktopRgn
);
539 if( iconic
) /* create a cursor for dragging */
541 HICON hIcon
= (HICON
)GetClassLongW(hwnd
, GCL_HICON
);
542 if(!hIcon
) hIcon
= (HICON
)SendMessageW( hwnd
, WM_QUERYDRAGICON
, 0, 0L);
543 if( hIcon
) hDragCursor
= CursorIconToCursor( hIcon
, TRUE
);
544 if( !hDragCursor
) iconic
= FALSE
;
547 /* invert frame if WIN31_LOOK to indicate mouse click on caption */
548 if( !iconic
&& !DragFullWindows
)
550 UserDrawMovingFrame( hdc
, &sizingRect
, thickframe
);
557 if (GetMessageW(&msg
, 0, 0, 0) <= 0)
560 /* Exit on button-up, Return, or Esc */
561 if ((msg
.message
== WM_LBUTTONUP
) ||
562 ((msg
.message
== WM_KEYDOWN
) &&
563 ((msg
.wParam
== VK_RETURN
) || (msg
.wParam
== VK_ESCAPE
)))) break;
565 if (msg
.message
== WM_PAINT
)
567 if(!iconic
&& !DragFullWindows
) UserDrawMovingFrame( hdc
, &sizingRect
, thickframe
);
568 UpdateWindow( msg
.hwnd
);
569 if(!iconic
&& !DragFullWindows
) UserDrawMovingFrame( hdc
, &sizingRect
, thickframe
);
573 if ((msg
.message
!= WM_KEYDOWN
) && (msg
.message
!= WM_MOUSEMOVE
))
574 continue; /* We are not interested in other messages */
578 if (msg
.message
== WM_KEYDOWN
) switch(msg
.wParam
)
580 case VK_UP
: pt
.y
-= 8; break;
581 case VK_DOWN
: pt
.y
+= 8; break;
582 case VK_LEFT
: pt
.x
-= 8; break;
583 case VK_RIGHT
: pt
.x
+= 8; break;
586 pt
.x
= max( pt
.x
, mouseRect
.left
);
587 pt
.x
= min( pt
.x
, mouseRect
.right
);
588 pt
.y
= max( pt
.y
, mouseRect
.top
);
589 pt
.y
= min( pt
.y
, mouseRect
.bottom
);
591 dx
= pt
.x
- capturePoint
.x
;
592 dy
= pt
.y
- capturePoint
.y
;
600 if( iconic
) /* ok, no system popup tracking */
602 hOldCursor
= SetCursor(hDragCursor
);
607 if (msg
.message
== WM_KEYDOWN
) SetCursorPos( pt
.x
, pt
.y
);
610 RECT newRect
= unmodRect
;
611 WPARAM wpSizingHit
= 0;
613 if (hittest
== HTCAPTION
) OffsetRect( &newRect
, dx
, dy
);
614 if (ON_LEFT_BORDER(hittest
)) newRect
.left
+= dx
;
615 else if (ON_RIGHT_BORDER(hittest
)) newRect
.right
+= dx
;
616 if (ON_TOP_BORDER(hittest
)) newRect
.top
+= dy
;
617 else if (ON_BOTTOM_BORDER(hittest
)) newRect
.bottom
+= dy
;
618 if(!iconic
&& !DragFullWindows
) UserDrawMovingFrame( hdc
, &sizingRect
, thickframe
);
621 /* determine the hit location */
622 if (hittest
>= HTLEFT
&& hittest
<= HTBOTTOMRIGHT
)
623 wpSizingHit
= WMSZ_LEFT
+ (hittest
- HTLEFT
);
625 SendMessageA( hwnd
, WM_SIZING
, wpSizingHit
, (LPARAM
)&newRect
);
630 UserDrawMovingFrame( hdc
, &newRect
, thickframe
);
632 /* To avoid any deadlocks, all the locks on the windows
633 structures must be suspended before the SetWindowPos */
634 SetWindowPos( hwnd
, 0, newRect
.left
, newRect
.top
,
635 newRect
.right
- newRect
.left
,
636 newRect
.bottom
- newRect
.top
,
637 ( hittest
== HTCAPTION
) ? SWP_NOSIZE
: 0 );
640 sizingRect
= newRect
;
649 if( moved
) /* restore cursors, show icon title later on */
652 SetCursor( hOldCursor
);
654 DestroyCursor( hDragCursor
);
656 else if(!DragFullWindows
)
657 UserDrawMovingFrame( hdc
, &sizingRect
, thickframe
);
659 if (Style
& WS_CHILD
)
660 ReleaseDC( hWndParent
, hdc
);
666 DeleteObject(DesktopRgn
);
669 (void)NtUserSetGUIThreadHandle(MSQ_STATE_MOVESIZE
, NULL
);
670 SendMessageA( hwnd
, WM_EXITSIZEMOVE
, 0, 0 );
671 SendMessageA( hwnd
, WM_SETVISIBLE
, !IsIconic(hwnd
), 0L);
673 /* window moved or resized */
676 /* if the moving/resizing isn't canceled call SetWindowPos
677 * with the new position or the new size of the window
679 if (!((msg
.message
== WM_KEYDOWN
) && (msg
.wParam
== VK_ESCAPE
)) )
681 /* NOTE: SWP_NOACTIVATE prevents document window activation in Word 6 */
683 SetWindowPos( hwnd
, 0, sizingRect
.left
, sizingRect
.top
,
684 sizingRect
.right
- sizingRect
.left
,
685 sizingRect
.bottom
- sizingRect
.top
,
686 ( hittest
== HTCAPTION
) ? SWP_NOSIZE
: 0 );
688 else { /* restore previous size/position */
690 SetWindowPos( hwnd
, 0, origRect
.left
, origRect
.top
,
691 origRect
.right
- origRect
.left
,
692 origRect
.bottom
- origRect
.top
,
693 ( hittest
== HTCAPTION
) ? SWP_NOSIZE
: 0 );
698 if( Style
& WS_MINIMIZE
)
700 /* Single click brings up the system menu when iconized */
704 if( Style
& WS_SYSMENU
)
705 SendMessageA( hwnd
, WM_SYSCOMMAND
,
706 SC_MOUSEMENU
+ HTSYSMENU
, MAKELONG(pt
.x
,pt
.y
));
712 /***********************************************************************
713 * DefWndTrackScrollBar
715 * Track a mouse button press on the horizontal or vertical scroll-bar.
718 DefWndTrackScrollBar(HWND Wnd
, WPARAM wParam
, POINT Pt
)
722 if (SC_HSCROLL
== (wParam
& 0xfff0))
724 if (HTHSCROLL
!= (wParam
& 0x0f))
730 else /* SC_VSCROLL */
732 if (HTVSCROLL
!= (wParam
& 0x0f))
738 ScrollTrackScrollBar(Wnd
, ScrollBar
, Pt
);
743 DefWndHandleSysCommand(HWND hWnd
, WPARAM wParam
, LPARAM lParam
)
748 switch (wParam
& 0xfff0)
752 DefWndDoSizeMove(hWnd
, wParam
);
755 wp
.length
= sizeof(WINDOWPLACEMENT
);
756 if(GetWindowPlacement(hWnd
, &wp
))
758 wp
.showCmd
= SW_MINIMIZE
;
759 SetWindowPlacement(hWnd
, &wp
);
763 wp
.length
= sizeof(WINDOWPLACEMENT
);
764 if(GetWindowPlacement(hWnd
, &wp
))
766 wp
.showCmd
= SW_MAXIMIZE
;
767 SetWindowPlacement(hWnd
, &wp
);
771 wp
.length
= sizeof(WINDOWPLACEMENT
);
772 if(GetWindowPlacement(hWnd
, &wp
))
774 wp
.showCmd
= SW_RESTORE
;
775 SetWindowPlacement(hWnd
, &wp
);
779 SendMessageA(hWnd
, WM_CLOSE
, 0, 0);
783 Pt
.x
= (short)LOWORD(lParam
);
784 Pt
.y
= (short)HIWORD(lParam
);
785 MenuTrackMouseMenuBar(hWnd
, wParam
& 0x000f, Pt
);
789 MenuTrackKbdMenuBar(hWnd
, wParam
, (WCHAR
)lParam
);
794 Pt
.x
= (short)LOWORD(lParam
);
795 Pt
.y
= (short)HIWORD(lParam
);
796 DefWndTrackScrollBar(hWnd
, wParam
, Pt
);
801 /* FIXME: Implement */
810 DefWndHandleWindowPosChanging(HWND hWnd
, WINDOWPOS
* Pos
)
812 POINT maxTrack
, minTrack
;
813 LONG style
= GetWindowLongA(hWnd
, GWL_STYLE
);
815 if (Pos
->flags
& SWP_NOSIZE
) return 0;
816 if ((style
& WS_THICKFRAME
) || ((style
& (WS_POPUP
| WS_CHILD
)) == 0))
818 WinPosGetMinMaxInfo(hWnd
, NULL
, NULL
, &minTrack
, &maxTrack
);
819 Pos
->cx
= min(Pos
->cx
, maxTrack
.x
);
820 Pos
->cy
= min(Pos
->cy
, maxTrack
.y
);
821 if (!(style
& WS_MINIMIZE
))
823 if (Pos
->cx
< minTrack
.x
) Pos
->cx
= minTrack
.x
;
824 if (Pos
->cy
< minTrack
.y
) Pos
->cy
= minTrack
.y
;
829 Pos
->cx
= max(Pos
->cx
, 0);
830 Pos
->cy
= max(Pos
->cy
, 0);
835 /* Undocumented flags. */
836 #define SWP_NOCLIENTMOVE 0x0800
837 #define SWP_NOCLIENTSIZE 0x1000
840 DefWndHandleWindowPosChanged(HWND hWnd
, WINDOWPOS
* Pos
)
844 GetClientRect(hWnd
, &Rect
);
845 MapWindowPoints(hWnd
, (GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CHILD
?
846 GetParent(hWnd
) : NULL
), (LPPOINT
) &Rect
, 2);
848 if (! (Pos
->flags
& SWP_NOCLIENTMOVE
))
850 SendMessageW(hWnd
, WM_MOVE
, 0, MAKELONG(Rect
.left
, Rect
.top
));
853 if (! (Pos
->flags
& SWP_NOCLIENTSIZE
))
855 WPARAM wp
= SIZE_RESTORED
;
860 else if (IsIconic(hWnd
))
864 SendMessageW(hWnd
, WM_SIZE
, wp
,
865 MAKELONG(Rect
.right
- Rect
.left
, Rect
.bottom
- Rect
.top
));
871 /***********************************************************************
874 * Default colors for control painting.
877 DefWndControlColor(HDC hDC
, UINT ctlType
)
879 if (CTLCOLOR_SCROLLBAR
== ctlType
)
881 HBRUSH hb
= GetSysColorBrush(COLOR_SCROLLBAR
);
882 COLORREF bk
= GetSysColor(COLOR_3DHILIGHT
);
883 SetTextColor(hDC
, GetSysColor(COLOR_3DFACE
));
886 /* if COLOR_WINDOW happens to be the same as COLOR_3DHILIGHT
887 * we better use 0x55aa bitmap brush to make scrollbar's background
888 * look different from the window background.
890 if (bk
== GetSysColor(COLOR_WINDOW
))
892 static const WORD wPattern55AA
[] =
894 0x5555, 0xaaaa, 0x5555, 0xaaaa,
895 0x5555, 0xaaaa, 0x5555, 0xaaaa
897 static HBITMAP hPattern55AABitmap
= NULL
;
898 static HBRUSH hPattern55AABrush
= NULL
;
899 if (hPattern55AABrush
== NULL
)
901 hPattern55AABitmap
= CreateBitmap(8, 8, 1, 1, wPattern55AA
);
902 hPattern55AABrush
= CreatePatternBrush(hPattern55AABitmap
);
904 return hPattern55AABrush
;
910 SetTextColor(hDC
, GetSysColor(COLOR_WINDOWTEXT
));
912 if ((CTLCOLOR_EDIT
== ctlType
) || (CTLCOLOR_LISTBOX
== ctlType
))
914 SetBkColor(hDC
, GetSysColor(COLOR_WINDOW
));
918 SetBkColor(hDC
, GetSysColor(COLOR_3DFACE
));
919 return GetSysColorBrush(COLOR_3DFACE
);
922 return GetSysColorBrush(COLOR_WINDOW
);
925 static void DefWndPrint( HWND hwnd
, HDC hdc
, ULONG uFlags
)
930 if ( (uFlags
& PRF_CHECKVISIBLE
) &&
931 !IsWindowVisible(hwnd
) )
935 * Unimplemented flags.
937 if ( (uFlags
& PRF_CHILDREN
) ||
938 (uFlags
& PRF_OWNED
) ||
939 (uFlags
& PRF_NONCLIENT
) )
941 FIXME("WM_PRINT message with unsupported flags\n");
947 if ( uFlags
& PRF_ERASEBKGND
)
948 SendMessageW(hwnd
, WM_ERASEBKGND
, (WPARAM
)hdc
, 0);
953 if ( uFlags
& PRF_CLIENT
)
954 SendMessageW(hwnd
, WM_PRINTCLIENT
, (WPARAM
)hdc
, PRF_CLIENT
);
958 UserSendUiUpdateMsg(HWND hwnd
, LPARAM lParam
)
960 SendMessageW(hwnd
, WM_UPDATEUISTATE
, (WPARAM
)lParam
, 0);
966 DefWndScreenshot(HWND hWnd
)
978 hdc
= GetWindowDC(hWnd
);
979 GetWindowRect(hWnd
, &rect
);
980 w
= rect
.right
- rect
.left
;
981 h
= rect
.bottom
- rect
.top
;
983 hbitmap
= CreateCompatibleBitmap(hdc
, w
, h
);
984 hdc2
= CreateCompatibleDC(hdc
);
985 SelectObject(hdc2
, hbitmap
);
987 BitBlt(hdc2
, 0, 0, w
, h
,
991 SetClipboardData(CF_BITMAP
, hbitmap
);
993 ReleaseDC(hWnd
, hdc
);
994 ReleaseDC(hWnd
, hdc2
);
1003 User32DefWindowProc(HWND hWnd
,
1013 return DefWndNCPaint(hWnd
, (HRGN
)wParam
, -1);
1018 return DefWndNCCalcSize(hWnd
, (BOOL
)wParam
, (RECT
*)lParam
);
1023 return DefWndNCActivate(hWnd
, wParam
);
1029 Point
.x
= GET_X_LPARAM(lParam
);
1030 Point
.y
= GET_Y_LPARAM(lParam
);
1031 return (DefWndNCHitTest(hWnd
, Point
));
1034 case WM_LBUTTONDOWN
:
1035 case WM_RBUTTONDOWN
:
1036 case WM_MBUTTONDOWN
:
1037 iF10Key
= iMenuSysKey
= 0;
1040 case WM_NCLBUTTONDOWN
:
1042 return (DefWndNCLButtonDown(hWnd
, wParam
, lParam
));
1045 case WM_LBUTTONDBLCLK
:
1046 return (DefWndNCLButtonDblClk(hWnd
, HTCLIENT
, lParam
));
1048 case WM_NCLBUTTONDBLCLK
:
1050 return (DefWndNCLButtonDblClk(hWnd
, wParam
, lParam
));
1053 case WM_WINDOWPOSCHANGING
:
1055 return (DefWndHandleWindowPosChanging(hWnd
, (WINDOWPOS
*)lParam
));
1058 case WM_WINDOWPOSCHANGED
:
1060 return (DefWndHandleWindowPosChanged(hWnd
, (WINDOWPOS
*)lParam
));
1063 case WM_NCRBUTTONDOWN
:
1065 /* in Windows, capture is taken when right-clicking on the caption bar */
1066 if (wParam
== HTCAPTION
)
1076 if (hWnd
== GetCapture())
1080 Pt
.x
= GET_X_LPARAM(lParam
);
1081 Pt
.y
= GET_Y_LPARAM(lParam
);
1082 ClientToScreen(hWnd
, &Pt
);
1083 lParam
= MAKELPARAM(Pt
.x
, Pt
.y
);
1086 SendMessageW(hWnd
, WM_CONTEXTMENU
, (WPARAM
)hWnd
, lParam
);
1090 SendMessageA(hWnd
, WM_CONTEXTMENU
, (WPARAM
)hWnd
, lParam
);
1095 case WM_NCRBUTTONUP
:
1097 * FIXME : we must NOT send WM_CONTEXTMENU on a WM_NCRBUTTONUP (checked
1098 * in Windows), but what _should_ we do? According to MSDN :
1099 * "If it is appropriate to do so, the system sends the WM_SYSCOMMAND
1100 * message to the window". When is it appropriate?
1104 case WM_CONTEXTMENU
:
1106 if (GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CHILD
)
1110 SendMessageW(GetParent(hWnd
), Msg
, wParam
, lParam
);
1114 SendMessageA(GetParent(hWnd
), WM_CONTEXTMENU
, wParam
, lParam
);
1123 Style
= GetWindowLongW(hWnd
, GWL_STYLE
);
1125 Pt
.x
= GET_X_LPARAM(lParam
);
1126 Pt
.y
= GET_Y_LPARAM(lParam
);
1127 if (Style
& WS_CHILD
)
1129 ScreenToClient(GetParent(hWnd
), &Pt
);
1132 HitCode
= DefWndNCHitTest(hWnd
, Pt
);
1134 if (HitCode
== HTCAPTION
|| HitCode
== HTSYSMENU
)
1139 if((SystemMenu
= GetSystemMenu(hWnd
, FALSE
)))
1141 MenuInitSysMenuPopup(SystemMenu
, GetWindowLongW(hWnd
, GWL_STYLE
),
1142 GetClassLongW(hWnd
, GCL_STYLE
), HitCode
);
1144 if(HitCode
== HTCAPTION
)
1145 Flags
= TPM_LEFTBUTTON
| TPM_RIGHTBUTTON
;
1147 Flags
= TPM_LEFTBUTTON
;
1149 TrackPopupMenu(SystemMenu
, Flags
,
1150 Pt
.x
, Pt
.y
, 0, hWnd
, NULL
);
1159 DefWndPrint(hWnd
, (HDC
)wParam
, lParam
);
1167 HDC hDC
= BeginPaint(hWnd
, &Ps
);
1171 if (GetWindowLongW(hWnd
, GWL_STYLE
) & WS_MINIMIZE
&&
1172 (hIcon
= (HICON
)GetClassLongW(hWnd
, GCL_HICON
)) != NULL
)
1176 GetClientRect(hWnd
, &ClientRect
);
1177 x
= (ClientRect
.right
- ClientRect
.left
-
1178 GetSystemMetrics(SM_CXICON
)) / 2;
1179 y
= (ClientRect
.bottom
- ClientRect
.top
-
1180 GetSystemMetrics(SM_CYICON
)) / 2;
1181 DrawIcon(hDC
, x
, y
, hIcon
);
1183 EndPaint(hWnd
, &Ps
);
1191 hRgn
= CreateRectRgn(0, 0, 0, 0);
1192 if (GetUpdateRgn(hWnd
, hRgn
, FALSE
) != NULLREGION
)
1194 RedrawWindow(hWnd
, NULL
, hRgn
,
1195 RDW_ERASENOW
| RDW_ERASE
| RDW_FRAME
|
1204 DefWndSetRedraw(hWnd
, wParam
);
1210 DestroyWindow(hWnd
);
1214 case WM_MOUSEACTIVATE
:
1216 if (GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CHILD
)
1221 Ret
= SendMessageW(GetParent(hWnd
), WM_MOUSEACTIVATE
,
1226 Ret
= SendMessageA(GetParent(hWnd
), WM_MOUSEACTIVATE
,
1234 return ((LOWORD(lParam
) >= HTCLIENT
) ? MA_ACTIVATE
: MA_NOACTIVATE
);
1239 /* Check if the window is minimized. */
1240 if (LOWORD(wParam
) != WA_INACTIVE
&&
1241 !(GetWindowLongW(hWnd
, GWL_STYLE
) & WS_MINIMIZE
))
1250 if (GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CHILD
)
1254 return (SendMessageW(GetParent(hWnd
), WM_MOUSEWHEEL
,
1259 return (SendMessageA(GetParent(hWnd
), WM_MOUSEWHEEL
,
1267 case WM_ICONERASEBKGND
:
1270 HBRUSH hBrush
= (HBRUSH
)GetClassLongW(hWnd
, GCL_HBRBACKGROUND
);
1276 if (GetClassLongW(hWnd
, GCL_STYLE
) & CS_PARENTDC
)
1278 /* can't use GetClipBox with a parent DC or we fill the whole parent */
1279 GetClientRect(hWnd
, &Rect
);
1280 DPtoLP((HDC
)wParam
, (LPPOINT
)&Rect
, 2);
1284 GetClipBox((HDC
)wParam
, &Rect
);
1286 FillRect((HDC
)wParam
, &Rect
, hBrush
);
1290 case WM_CTLCOLORMSGBOX
:
1291 case WM_CTLCOLOREDIT
:
1292 case WM_CTLCOLORLISTBOX
:
1293 case WM_CTLCOLORBTN
:
1294 case WM_CTLCOLORDLG
:
1295 case WM_CTLCOLORSTATIC
:
1296 case WM_CTLCOLORSCROLLBAR
:
1297 return (LRESULT
) DefWndControlColor((HDC
)wParam
, Msg
- WM_CTLCOLORMSGBOX
);
1300 return (LRESULT
) DefWndControlColor((HDC
)wParam
, HIWORD(lParam
));
1304 ULONG Style
= GetWindowLongW(hWnd
, GWL_STYLE
);
1306 if (Style
& WS_CHILD
)
1308 if (LOWORD(lParam
) < HTLEFT
|| LOWORD(lParam
) > HTBOTTOMRIGHT
)
1313 bResult
= SendMessageW(GetParent(hWnd
), WM_SETCURSOR
,
1318 bResult
= SendMessageA(GetParent(hWnd
), WM_SETCURSOR
,
1327 return (DefWndHandleSetCursor(hWnd
, wParam
, lParam
, Style
));
1331 return (DefWndHandleSysCommand(hWnd
, wParam
, lParam
));
1334 if(wParam
== VK_F10
) iF10Key
= VK_F10
;
1337 /* FIXME: This is also incomplete. */
1340 if (HIWORD(lParam
) & KEYDATA_ALT
)
1342 /* if( HIWORD(lParam) & ~KEYDATA_PREVSTATE ) */
1343 if ( (wParam
== VK_MENU
|| wParam
== VK_LMENU
1344 || wParam
== VK_RMENU
) && !iMenuSysKey
)
1351 if (wParam
== VK_F4
) /* Try to close the window */
1353 HWND top
= GetAncestor(hWnd
, GA_ROOT
);
1354 if (!(GetClassLongW(top
, GCL_STYLE
) & CS_NOCLOSE
))
1357 PostMessageW(top
, WM_SYSCOMMAND
, SC_CLOSE
, 0);
1359 PostMessageA(top
, WM_SYSCOMMAND
, SC_CLOSE
, 0);
1362 else if (wParam
== VK_SNAPSHOT
)
1365 while (GetParent(hwnd
) != NULL
)
1367 hwnd
= GetParent(hwnd
);
1369 DefWndScreenshot(hwnd
);
1372 else if( wParam
== VK_F10
)
1374 else if( wParam
== VK_ESCAPE
&& (GetKeyState(VK_SHIFT
) & 0x8000))
1375 SendMessageW( hWnd
, WM_SYSCOMMAND
, SC_KEYMENU
, ' ' );
1382 /* Press and release F10 or ALT */
1383 if (((wParam
== VK_MENU
|| wParam
== VK_LMENU
|| wParam
== VK_RMENU
)
1384 && iMenuSysKey
) || ((wParam
== VK_F10
) && iF10Key
))
1385 SendMessageW( GetAncestor( hWnd
, GA_ROOT
), WM_SYSCOMMAND
, SC_KEYMENU
, 0L );
1386 iMenuSysKey
= iF10Key
= 0;
1393 if (wParam
== '\r' && IsIconic(hWnd
))
1395 PostMessageW( hWnd
, WM_SYSCOMMAND
, SC_RESTORE
, 0L );
1398 if ((HIWORD(lParam
) & KEYDATA_ALT
) && wParam
)
1400 if (wParam
== '\t' || wParam
== '\x1b') break;
1401 if (wParam
== ' ' && (GetWindowLongW( hWnd
, GWL_STYLE
) & WS_CHILD
))
1402 SendMessageW( GetParent(hWnd
), Msg
, wParam
, lParam
);
1404 SendMessageW( hWnd
, WM_SYSCOMMAND
, SC_KEYMENU
, wParam
);
1406 else /* check for Ctrl-Esc */
1407 if (wParam
!= '\x1b') MessageBeep(0);
1413 NtUserMessageCall( hWnd
, Msg
, wParam
, lParam
, 0, NUMC_DEFWINDOWPROC
, FALSE
);
1420 /* FIXME: Check for a desktop. */
1421 if (!(GetWindowLongW( hWnd
, GWL_STYLE
) & WS_CHILD
)) EndMenu();
1422 if (GetCapture() == hWnd
)
1436 case WM_QUERYDROPOBJECT
:
1438 if (GetWindowLongW(hWnd
, GWL_EXSTYLE
) & WS_EX_ACCEPTFILES
)
1445 case WM_QUERYDRAGICON
:
1450 hIcon
= (HICON
)GetClassLongW(hWnd
, GCL_HICON
);
1453 return ((LRESULT
)hIcon
);
1455 for (Len
= 1; Len
< 64; Len
++)
1457 if ((hIcon
= LoadIconW(NULL
, MAKEINTRESOURCEW(Len
))) != NULL
)
1459 return((LRESULT
)hIcon
);
1462 return ((LRESULT
)LoadIconW(0, IDI_APPLICATION
));
1465 /* FIXME: WM_ISACTIVEICON */
1467 case WM_NOTIFYFORMAT
:
1469 if (lParam
== NF_QUERY
)
1470 return IsWindowUnicode(hWnd
) ? NFR_UNICODE
: NFR_ANSI
;
1476 INT Index
= (wParam
!= 0) ? GCL_HICON
: GCL_HICONSM
;
1477 HICON hOldIcon
= (HICON
)GetClassLongW(hWnd
, Index
);
1478 SetClassLongW(hWnd
, Index
, lParam
);
1479 SetWindowPos(hWnd
, 0, 0, 0, 0, 0,
1480 SWP_FRAMECHANGED
| SWP_NOSIZE
| SWP_NOMOVE
|
1481 SWP_NOACTIVATE
| SWP_NOZORDER
);
1482 return ((LRESULT
)hOldIcon
);
1487 INT Index
= (wParam
== ICON_BIG
) ? GCL_HICON
: GCL_HICONSM
;
1488 return (GetClassLongW(hWnd
, Index
));
1495 SendMessageW(GetParent(hWnd
), Msg
, wParam
, lParam
);
1499 SendMessageA(GetParent(hWnd
), Msg
, wParam
, lParam
);
1506 THRDCARETINFO CaretInfo
;
1509 case 0xffff: /* Caret timer */
1510 /* switch showing byte in win32k and get information about the caret */
1511 if(NtUserSwitchCaretShowing(&CaretInfo
) && (CaretInfo
.hWnd
== hWnd
))
1513 DrawCaret(hWnd
, &CaretInfo
);
1521 case WM_QUERYENDSESSION
:
1526 case WM_INPUTLANGCHANGEREQUEST
:
1530 if(wParam
& INPUTLANGCHANGE_BACKWARD
1531 && wParam
& INPUTLANGCHANGE_FORWARD
)
1536 //FIXME: What to do with INPUTLANGCHANGE_SYSCHARSET ?
1538 if(wParam
& INPUTLANGCHANGE_BACKWARD
) NewHkl
= (HKL
) HKL_PREV
;
1539 else if(wParam
& INPUTLANGCHANGE_FORWARD
) NewHkl
= (HKL
) HKL_NEXT
;
1540 else NewHkl
= (HKL
) lParam
;
1542 NtUserActivateKeyboardLayout(NewHkl
, 0);
1547 case WM_INPUTLANGCHANGE
:
1549 //FIXME: What to do?
1554 if (wParam
) PostQuitMessage(0);
1557 case WM_QUERYUISTATE
:
1560 PWINDOW Wnd
= ValidateHwnd(hWnd
);
1564 Ret
|= UISF_HIDEFOCUS
;
1566 Ret
|= UISF_HIDEACCEL
;
1571 case WM_CHANGEUISTATE
:
1573 BOOL AlwaysShowCues
= TRUE
;
1574 WORD Action
= LOWORD(wParam
);
1575 WORD Flags
= HIWORD(wParam
);
1578 SystemParametersInfoW(SPI_GETKEYBOARDCUES
, 0, &AlwaysShowCues
, 0);
1582 Wnd
= ValidateHwnd(hWnd
);
1583 if (!Wnd
|| lParam
!= 0)
1586 if (Flags
& ~(UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
))
1589 if (Flags
& UISF_ACTIVE
)
1591 WARN("WM_CHANGEUISTATE does not yet support UISF_ACTIVE!\n");
1594 if (Action
== UIS_INITIALIZE
)
1596 PDESKTOP Desk
= GetThreadDesktopInfo();
1600 Action
= Desk
->LastInputWasKbd
? UIS_CLEAR
: UIS_SET
;
1601 Flags
= UISF_HIDEFOCUS
| UISF_HIDEACCEL
;
1603 /* We need to update wParam in case we need to send out messages */
1604 wParam
= MAKEWPARAM(Action
, Flags
);
1610 /* See if we actually need to change something */
1611 if ((Flags
& UISF_HIDEFOCUS
) && !Wnd
->HideFocus
)
1613 if ((Flags
& UISF_HIDEACCEL
) && !Wnd
->HideAccel
)
1616 /* Don't need to do anything... */
1620 /* See if we actually need to change something */
1621 if ((Flags
& UISF_HIDEFOCUS
) && Wnd
->HideFocus
)
1623 if ((Flags
& UISF_HIDEACCEL
) && Wnd
->HideAccel
)
1626 /* Don't need to do anything... */
1630 WARN("WM_CHANGEUISTATE: Unsupported Action 0x%x\n", Action
);
1634 if ((Wnd
->Style
& WS_CHILD
) && Wnd
->Parent
!= NULL
)
1636 /* We're a child window and we need to pass this message down until
1637 we reach the root */
1638 hWnd
= UserHMGetHandle((PWINDOW
)DesktopPtrToUser(Wnd
->Parent
));
1642 /* We're a top level window, we need to change the UI state */
1643 Msg
= WM_UPDATEUISTATE
;
1647 return SendMessageW(hWnd
, Msg
, wParam
, lParam
);
1649 return SendMessageA(hWnd
, Msg
, wParam
, lParam
);
1652 case WM_UPDATEUISTATE
:
1655 BOOL AlwaysShowCues
= TRUE
;
1656 WORD Action
= LOWORD(wParam
);
1657 WORD Flags
= HIWORD(wParam
);
1660 SystemParametersInfoW(SPI_GETKEYBOARDCUES
, 0, &AlwaysShowCues
, 0);
1664 Wnd
= ValidateHwnd(hWnd
);
1665 if (!Wnd
|| lParam
!= 0)
1668 if (Flags
& ~(UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
))
1671 if (Flags
& UISF_ACTIVE
)
1673 WARN("WM_UPDATEUISTATE does not yet support UISF_ACTIVE!\n");
1676 if (Action
== UIS_INITIALIZE
)
1678 PDESKTOP Desk
= GetThreadDesktopInfo();
1682 Action
= Desk
->LastInputWasKbd
? UIS_CLEAR
: UIS_SET
;
1683 Flags
= UISF_HIDEFOCUS
| UISF_HIDEACCEL
;
1685 /* We need to update wParam for broadcasting the update */
1686 wParam
= MAKEWPARAM(Action
, Flags
);
1692 /* See if we actually need to change something */
1693 if ((Flags
& UISF_HIDEFOCUS
) && !Wnd
->HideFocus
)
1695 if ((Flags
& UISF_HIDEACCEL
) && !Wnd
->HideAccel
)
1698 /* Don't need to do anything... */
1703 /* See if we actually need to change something */
1704 if ((Flags
& UISF_HIDEFOCUS
) && Wnd
->HideFocus
)
1706 if ((Flags
& UISF_HIDEACCEL
) && Wnd
->HideAccel
)
1709 /* Don't need to do anything... */
1714 WARN("WM_UPDATEUISTATE: Unsupported Action 0x%x\n", Action
);
1718 /* Pack the information and call win32k */
1721 if (!NtUserCallTwoParam((DWORD
)hWnd
, (DWORD
)Flags
| ((DWORD
)Action
<< 3), TWOPARAM_ROUTINE_ROS_UPDATEUISTATE
))
1725 /* Always broadcast the update to all children */
1726 EnumChildWindows(hWnd
,
1727 UserSendUiUpdateMsg
,
1739 DefWindowProcA(HWND hWnd
,
1747 SPY_EnterMessage(SPY_DEFWNDPROC
, hWnd
, Msg
, wParam
, lParam
);
1752 ANSI_STRING AnsiString
;
1753 UNICODE_STRING UnicodeString
;
1754 LPCREATESTRUCTA cs
= (LPCREATESTRUCTA
)lParam
;
1755 /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
1756 * may have child window IDs instead of window name */
1760 RtlInitAnsiString(&AnsiString
, (LPSTR
)cs
->lpszName
);
1761 RtlAnsiStringToUnicodeString(&UnicodeString
, &AnsiString
, TRUE
);
1762 NtUserDefSetText(hWnd
, &UnicodeString
);
1763 RtlFreeUnicodeString(&UnicodeString
);
1766 NtUserDefSetText(hWnd
, NULL
);
1772 case WM_GETTEXTLENGTH
:
1777 Wnd
= ValidateHwnd(hWnd
);
1778 if (Wnd
!= NULL
&& Wnd
->WindowName
.Length
!= 0)
1780 buf
= DesktopPtrToUser(Wnd
->WindowName
.Buffer
);
1782 NT_SUCCESS(RtlUnicodeToMultiByteSize(&len
,
1784 Wnd
->WindowName
.Length
)))
1786 Result
= (LRESULT
)len
;
1795 PSTR outbuf
= (PSTR
)lParam
;
1798 Wnd
= ValidateHwnd(hWnd
);
1799 if (Wnd
!= NULL
&& wParam
!= 0)
1801 if (Wnd
->WindowName
.Buffer
!= NULL
)
1802 buf
= DesktopPtrToUser(Wnd
->WindowName
.Buffer
);
1808 if (Wnd
->WindowName
.Length
!= 0)
1810 copy
= min(Wnd
->WindowName
.Length
/ sizeof(WCHAR
), wParam
- 1);
1811 Result
= WideCharToMultiByte(CP_ACP
,
1819 outbuf
[Result
] = '\0';
1830 ANSI_STRING AnsiString
;
1831 UNICODE_STRING UnicodeString
;
1835 RtlInitAnsiString(&AnsiString
, (LPSTR
)lParam
);
1836 RtlAnsiStringToUnicodeString(&UnicodeString
, &AnsiString
, TRUE
);
1837 NtUserDefSetText(hWnd
, &UnicodeString
);
1838 RtlFreeUnicodeString(&UnicodeString
);
1841 NtUserDefSetText(hWnd
, NULL
);
1843 if ((GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CAPTION
) == WS_CAPTION
)
1845 DefWndNCPaint(hWnd
, (HRGN
)1, -1);
1852 /* FIXME: Implement these. */
1854 case WM_IME_KEYDOWN
:
1856 case WM_IME_STARTCOMPOSITION
:
1857 case WM_IME_COMPOSITION
:
1858 case WM_IME_ENDCOMPOSITION
:
1860 case WM_IME_SETCONTEXT
:
1861 FIXME("FIXME: WM_IME_* conversion isn't implemented yet!");
1864 Result
= User32DefWindowProc(hWnd
, Msg
, wParam
, lParam
, FALSE
);
1867 SPY_ExitMessage(SPY_RESULT_DEFWND
, hWnd
, Msg
, Result
, wParam
, lParam
);
1873 DefWindowProcW(HWND hWnd
,
1881 SPY_EnterMessage(SPY_DEFWNDPROC
, hWnd
, Msg
, wParam
, lParam
);
1886 UNICODE_STRING UnicodeString
;
1887 LPCREATESTRUCTW cs
= (LPCREATESTRUCTW
)lParam
;
1888 /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
1889 * may have child window IDs instead of window name */
1892 RtlInitUnicodeString(&UnicodeString
, (LPWSTR
)cs
->lpszName
);
1894 NtUserDefSetText( hWnd
, (cs
->lpszName
? &UnicodeString
: NULL
));
1899 case WM_GETTEXTLENGTH
:
1904 Wnd
= ValidateHwnd(hWnd
);
1905 if (Wnd
!= NULL
&& Wnd
->WindowName
.Length
!= 0)
1907 buf
= DesktopPtrToUser(Wnd
->WindowName
.Buffer
);
1909 NT_SUCCESS(RtlUnicodeToMultiByteSize(&len
,
1911 Wnd
->WindowName
.Length
)))
1913 Result
= (LRESULT
)len
;
1922 PWSTR outbuf
= (PWSTR
)lParam
;
1924 Wnd
= ValidateHwnd(hWnd
);
1925 if (Wnd
!= NULL
&& wParam
!= 0)
1927 if (Wnd
->WindowName
.Buffer
!= NULL
)
1928 buf
= DesktopPtrToUser(Wnd
->WindowName
.Buffer
);
1934 if (Wnd
->WindowName
.Length
!= 0)
1936 Result
= min(Wnd
->WindowName
.Length
/ sizeof(WCHAR
), wParam
- 1);
1937 RtlCopyMemory(outbuf
,
1939 Result
* sizeof(WCHAR
));
1940 outbuf
[Result
] = L
'\0';
1951 UNICODE_STRING UnicodeString
;
1954 RtlInitUnicodeString(&UnicodeString
, (LPWSTR
)lParam
);
1956 NtUserDefSetText(hWnd
, (lParam
? &UnicodeString
: NULL
));
1958 if ((GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CAPTION
) == WS_CAPTION
)
1960 DefWndNCPaint(hWnd
, (HRGN
)1, -1);
1968 SendMessageW(hWnd
, WM_CHAR
, wParam
, lParam
);
1973 case WM_IME_SETCONTEXT
:
1976 FIXME("FIXME: WM_IME_SETCONTEXT is not implemented!");
1982 Result
= User32DefWindowProc(hWnd
, Msg
, wParam
, lParam
, TRUE
);
1984 SPY_ExitMessage(SPY_RESULT_DEFWND
, hWnd
, Msg
, Result
, wParam
, lParam
);