Author: cwittich
Date: Tue Apr 17 21:15:33 2007
New Revision: 26378
URL:
http://svn.reactos.org/svn/reactos?rev=26378&view=rev
Log:
implemented NtUserDrawCaptionTemp (doesn't support all flags yet but enough to get the
desk.cpl working)
Modified:
trunk/reactos/dll/win32/user32/windows/nonclient.c
trunk/reactos/include/reactos/win32k/ntuser.h
trunk/reactos/subsystems/win32/win32k/ntuser/ntstubs.c
trunk/reactos/subsystems/win32/win32k/ntuser/painting.c
Modified: trunk/reactos/dll/win32/user32/windows/nonclient.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/n…
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/nonclient.c (original)
+++ trunk/reactos/dll/win32/user32/windows/nonclient.c Tue Apr 17 21:15:33 2007
@@ -1116,7 +1116,9 @@
UINT uFlags
)
{
- return NtUserDrawCaptionTemp(hWnd, hDC, rect, hFont, hIcon, str, uFlags);
+ UNICODE_STRING Text = {0};
+ RtlInitUnicodeString(&Text, str);
+ return NtUserDrawCaptionTemp(hWnd, hDC, rect, hFont, hIcon, &Text, uFlags);
}
/*
Modified: trunk/reactos/include/reactos/win32k/ntuser.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/win32k/ntu…
==============================================================================
--- trunk/reactos/include/reactos/win32k/ntuser.h (original)
+++ trunk/reactos/include/reactos/win32k/ntuser.h Tue Apr 17 21:15:33 2007
@@ -721,10 +721,10 @@
NtUserDrawCaptionTemp(
HWND hWnd,
HDC hDC,
- const RECT *rect,
+ LPCRECT lpRc,
HFONT hFont,
HICON hIcon,
- LPCWSTR str,
+ const PUNICODE_STRING str,
UINT uFlags);
BOOL
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/ntstubs.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/ntstubs.c (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/ntstubs.c Tue Apr 17 21:15:33 2007
@@ -178,21 +178,6 @@
UNIMPLEMENTED
return 0;
-}
-
-BOOL
-STDCALL
-NtUserDrawCaptionTemp(
- HWND hWnd,
- HDC hDC,
- const RECT *rect,
- HFONT hFont,
- HICON hIcon,
- LPCWSTR str,
- UINT uFlags)
-{
- UNIMPLEMENTED
- return FALSE;
}
BOOL
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/painting.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/painting.c (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/painting.c Tue Apr 17 21:15:33 2007
@@ -1492,6 +1492,9 @@
PWINDOW_OBJECT pWnd,
HDC hDc,
LPCRECT lpRc,
+ HFONT hFont,
+ HICON hIcon,
+ const PUNICODE_STRING str,
UINT uFlags)
{
BOOL Ret = FALSE;
@@ -1504,7 +1507,7 @@
LONG ButtonWidth, IconWidth;
BOOL HasIcon;
- ASSERT(pWnd != NULL);
+ //ASSERT(pWnd != NULL);
hMemBmp = NtGdiCreateCompatibleBitmap(hDc,
lpRc->right - lpRc->left,
@@ -1533,9 +1536,16 @@
Height = UserGetSystemMetrics(SM_CYCAPTION) - 1;
VCenter = (lpRc->bottom - lpRc->top) / 2;
Padding = VCenter - (Height / 2);
- HasIcon = (uFlags & DC_ICON) && (pWnd->Style & WS_SYSMENU)
- && !(uFlags & DC_SMALLCAP) && !(pWnd->ExStyle &
WS_EX_DLGMODALFRAME)
- && !(pWnd->ExStyle & WS_EX_TOOLWINDOW);
+
+ if ((!hIcon) && (pWnd != NULL))
+ {
+ HasIcon = (uFlags & DC_ICON) && (pWnd->Style & WS_SYSMENU)
+ && !(uFlags & DC_SMALLCAP) && !(pWnd->ExStyle &
WS_EX_DLGMODALFRAME)
+ && !(pWnd->ExStyle & WS_EX_TOOLWINDOW);
+ }
+ else
+ HasIcon = (BOOL) hIcon;
+
IconWidth = UserGetSystemMetrics(SM_CXSIZE) + Padding;
r.left = Padding;
@@ -1607,33 +1617,36 @@
COLORREF Colors[2];
PDC pMemDc;
- if(pWnd->Style & WS_SYSMENU)
- {
- r.right -= 3 + ButtonWidth;
- if(!(uFlags & DC_SMALLCAP))
- {
- if(pWnd->Style & (WS_MAXIMIZEBOX | WS_MINIMIZEBOX))
- r.right -= 2 + 2 * ButtonWidth;
- else r.right -= 2;
- r.right -= 2;
- }
-
- //Draw buttons background
- if(!NtGdiSelectObject(hMemDc,
- IntGetSysColorBrush(uFlags & DC_ACTIVE ?
- COLOR_GRADIENTACTIVECAPTION:COLOR_GRADIENTINACTIVECAPTION)))
- {
- DPRINT1("%s: NtGdiSelectObject() failed!\n", __FUNCTION__);
- goto cleanup;
- }
-
- NtGdiPatBlt(hMemDc,
- r.right,
- 0,
- lpRc->right - lpRc->left - r.right,
- lpRc->bottom - lpRc->top,
- PATCOPY);
- }
+ if (pWnd != NULL)
+ {
+ if(pWnd->Style & WS_SYSMENU)
+ {
+ r.right -= 3 + ButtonWidth;
+ if(!(uFlags & DC_SMALLCAP))
+ {
+ if(pWnd->Style & (WS_MAXIMIZEBOX | WS_MINIMIZEBOX))
+ r.right -= 2 + 2 * ButtonWidth;
+ else r.right -= 2;
+ r.right -= 2;
+ }
+
+ //Draw buttons background
+ if(!NtGdiSelectObject(hMemDc,
+ IntGetSysColorBrush(uFlags & DC_ACTIVE ?
+ COLOR_GRADIENTACTIVECAPTION:COLOR_GRADIENTINACTIVECAPTION)))
+ {
+ DPRINT1("%s: NtGdiSelectObject() failed!\n", __FUNCTION__);
+ goto cleanup;
+ }
+
+ NtGdiPatBlt(hMemDc,
+ r.right,
+ 0,
+ lpRc->right - lpRc->left - r.right,
+ lpRc->bottom - lpRc->top,
+ PATCOPY);
+ }
+ }
Colors[0] = IntGetSysColor((uFlags & DC_ACTIVE) ?
COLOR_ACTIVECAPTION : COLOR_INACTIVECAPTION);
@@ -1676,7 +1689,9 @@
{
r.top ++;
r.left -= --IconWidth;
- UserDrawSysMenuButton(pWnd, hMemDc, &r, FALSE);
+ /* FIXME: Draw the Icon when pWnd == NULL but hIcon is valid */
+ if (pWnd != NULL)
+ UserDrawSysMenuButton(pWnd, hMemDc, &r, FALSE);
r.left += IconWidth;
r.top --;
}
@@ -1686,7 +1701,7 @@
r.bottom = r.top + Height;
- if((uFlags & DC_TEXT) && pWnd->WindowName.Length)
+ if((uFlags & DC_TEXT))
{
if(!(uFlags & DC_GRADIENT))
{
@@ -1709,7 +1724,11 @@
}
}
- UserDrawCaptionText(hMemDc, &pWnd->WindowName, &r, uFlags);
+ /* FIXME: hFont isn't handled */
+ if (str)
+ UserDrawCaptionText(hMemDc, str, &r, uFlags);
+ else if (pWnd != NULL)
+ UserDrawCaptionText(hMemDc, &pWnd->WindowName, &r, uFlags);
}
if(!NtGdiBitBlt(hDc, lpRc->left, lpRc->top,
@@ -1732,39 +1751,69 @@
}
+BOOL
+STDCALL
+NtUserDrawCaptionTemp(
+ HWND hWnd,
+ HDC hDC,
+ LPCRECT lpRc,
+ HFONT hFont,
+ HICON hIcon,
+ const PUNICODE_STRING str,
+ UINT uFlags)
+{
+ PWINDOW_OBJECT pWnd = NULL;
+ RECT SafeRect;
+ UNICODE_STRING SafeStr = {0};
+ BOOL Ret = FALSE;
+
+ UserEnterExclusive();
+
+ if (hWnd != NULL)
+ {
+ if(!(pWnd = UserGetWindowObject(hWnd)))
+ {
+ UserLeave();
+ return FALSE;
+ }
+ }
+
+ _SEH_TRY
+ {
+ ProbeForRead(lpRc, sizeof(RECT), sizeof(ULONG));
+ RtlCopyMemory(&SafeRect, lpRc, sizeof(RECT));
+ if (str != NULL)
+ {
+ SafeStr = ProbeForReadUnicodeString(str);
+ if (SafeStr.Length != 0)
+ {
+ ProbeForRead(SafeStr.Buffer,
+ SafeStr.Length,
+ sizeof(WCHAR));
+ }
+ Ret = UserDrawCaption(pWnd, hDC, &SafeRect, hFont, hIcon, &SafeStr, uFlags);
+ }
+ else
+ Ret = UserDrawCaption(pWnd, hDC, &SafeRect, hFont, hIcon, NULL, uFlags);
+ }
+ _SEH_HANDLE
+ {
+ SetLastNtError(_SEH_GetExceptionCode());
+ }
+ _SEH_END;
+
+ UserLeave();
+ return Ret;
+}
+
BOOL
STDCALL
NtUserDrawCaption(HWND hWnd,
- HDC hDc,
+ HDC hDC,
LPCRECT lpRc,
UINT uFlags)
{
- PWINDOW_OBJECT pWnd;
- RECT SafeRect;
- BOOL Ret = FALSE;
-
- UserEnterExclusive();
-
- if(!(pWnd = UserGetWindowObject(hWnd)))
- {
- UserLeave();
- return FALSE;
- }
-
- _SEH_TRY
- {
- ProbeForRead(lpRc, sizeof(RECT), sizeof(ULONG));
- RtlCopyMemory(&SafeRect, lpRc, sizeof(RECT));
- Ret = UserDrawCaption(pWnd, hDc, &SafeRect, uFlags);
- }
- _SEH_HANDLE
- {
- SetLastNtError(_SEH_GetExceptionCode());
- }
- _SEH_END;
-
- UserLeave();
- return Ret;
+ return NtUserDrawCaptionTemp(hWnd, hDC, lpRc, 0, 0, NULL, uFlags);
}
/* EOF */