Author: gadamopoulos
Date: Sun May 22 15:37:32 2011
New Revision: 51847
URL: 
http://svn.reactos.org/svn/reactos?rev=51847&view=rev
Log:
[uxtheme]
- Implement DrawClassicFrame, heavily based on user32
Modified:
    branches/GSoC_2011/ThemesSupport/dll/win32/uxtheme/nonclient.c
Modified: branches/GSoC_2011/ThemesSupport/dll/win32/uxtheme/nonclient.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/ThemesSupport/dll/win…
==============================================================================
--- branches/GSoC_2011/ThemesSupport/dll/win32/uxtheme/nonclient.c [iso-8859-1] (original)
+++ branches/GSoC_2011/ThemesSupport/dll/win32/uxtheme/nonclient.c [iso-8859-1] Sun May 22
15:37:32 2011
@@ -69,6 +69,22 @@
     }
     return ret;
+}
+
+static BOOL
+UserHasWindowEdge(DWORD Style, DWORD ExStyle)
+{
+    if (Style & WS_MINIMIZE)
+        return TRUE;
+    if (ExStyle & WS_EX_DLGMODALFRAME)
+        return TRUE;
+    if (ExStyle & WS_EX_STATICEDGE)
+        return FALSE;
+    if (Style & WS_THICKFRAME)
+        return TRUE;
+    if (Style == WS_DLGFRAME || Style == WS_CAPTION)
+        return TRUE;
+   return FALSE;
 }
 HICON
@@ -395,7 +411,71 @@
 static void
 DrawClassicFrame(PDRAW_CONTEXT context, RECT* prcCurrent)
 {
-
+    /* Draw outer edge */
+    if (UserHasWindowEdge(context->wi.dwStyle, context->wi.dwExStyle))
+    {
+        DrawEdge(context->hDC, prcCurrent, EDGE_RAISED, BF_RECT | BF_ADJUST);
+    }
+    else if (context->wi.dwExStyle & WS_EX_STATICEDGE)
+    {
+        DrawEdge(context->hDC, prcCurrent, BDR_SUNKENINNER, BF_RECT | BF_ADJUST |
BF_FLAT);
+    }
+
+    /* Firstly the "thick" frame */
+    if ((context->wi.dwStyle & WS_THICKFRAME) && !(context->wi.dwStyle
& WS_MINIMIZE))
+    {
+        INT Width =
+            (GetSystemMetrics(SM_CXFRAME) - GetSystemMetrics(SM_CXDLGFRAME)) *
+            GetSystemMetrics(SM_CXBORDER);
+        INT Height =
+            (GetSystemMetrics(SM_CYFRAME) - GetSystemMetrics(SM_CYDLGFRAME)) *
+            GetSystemMetrics(SM_CYBORDER);
+
+        SelectObject(context->hDC, GetSysColorBrush(
+                     context->Active ? COLOR_ACTIVEBORDER : COLOR_INACTIVEBORDER));
+
+        /* Draw frame */
+        PatBlt(context->hDC, prcCurrent->left, prcCurrent->top,
+               prcCurrent->right - prcCurrent->left, Height, PATCOPY);
+        PatBlt(context->hDC, prcCurrent->left, prcCurrent->top,
+               Width, prcCurrent->bottom - prcCurrent->top, PATCOPY);
+        PatBlt(context->hDC, prcCurrent->left, prcCurrent->bottom,
+               prcCurrent->right - prcCurrent->left, -Height, PATCOPY);
+        PatBlt(context->hDC, prcCurrent->right, prcCurrent->top,
+               -Width, prcCurrent->bottom - prcCurrent->top, PATCOPY);
+
+        InflateRect(prcCurrent, -Width, -Height);
+    }
+
+    /* Now the other bit of the frame */
+    if (context->wi.dwStyle & (WS_DLGFRAME | WS_BORDER) ||
context->wi.dwExStyle & WS_EX_DLGMODALFRAME)
+    {
+        INT Width = GetSystemMetrics(SM_CXBORDER);
+        INT Height = GetSystemMetrics(SM_CYBORDER);
+
+        SelectObject(context->hDC, GetSysColorBrush(
+            (context->wi.dwExStyle & (WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE)) ?
COLOR_3DFACE :
+            (context->wi.dwExStyle & WS_EX_STATICEDGE) ? COLOR_WINDOWFRAME :
+            (context->wi.dwStyle & (WS_DLGFRAME | WS_THICKFRAME)) ? COLOR_3DFACE :
+            COLOR_WINDOWFRAME));
+
+        /* Draw frame */
+        PatBlt(context->hDC, prcCurrent->left, prcCurrent->top,
+               prcCurrent->right - prcCurrent->left, Height, PATCOPY);
+        PatBlt(context->hDC, prcCurrent->left, prcCurrent->top,
+               Width, prcCurrent->bottom - prcCurrent->top, PATCOPY);
+        PatBlt(context->hDC, prcCurrent->left, prcCurrent->bottom,
+               prcCurrent->right - prcCurrent->left, -Height, PATCOPY);
+        PatBlt(context->hDC, prcCurrent->right, prcCurrent->top,
+              -Width, prcCurrent->bottom - prcCurrent->top, PATCOPY);
+
+        InflateRect(prcCurrent, -Width, -Height);
+    }
+
+    if (context->wi.dwExStyle & WS_EX_CLIENTEDGE)
+    {
+        DrawEdge(context->hDC, prcCurrent, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
+    }
 }
 static void