branch update for HEAD-2003050101
[reactos.git] / lib / user32 / windows / defwnd.c
index d754e3c..8974091 100644 (file)
 
 /* GLOBALS *******************************************************************/
 
-static HBITMAP hbitmapClose;
-static HBITMAP hbitmapMinimize;
-static HBITMAP hbitmapMinimizeD;
-static HBITMAP hbitmapMaximize;
-static HBITMAP hbitmapMaximizeD;
-static HBITMAP hbitmapRestore;
-static HBITMAP hbitmapRestoreD;
-
+static HBITMAP hbSysMenu;
+/* TODO:  widgets will be cached here.
+static HBITMAP hbClose;
+static HBITMAP hbCloseD;
+static HBITMAP hbMinimize;
+static HBITMAP hbMinimizeD;
+static HBITMAP hbRestore;
+static HBITMAP hbRestoreD;
+static HBITMAP hbMaximize;
+static HBITMAP hbScrUp;
+static HBITMAP hbScrDwn;
+static HBITMAP hbScrLeft;
+static HBITMAP hbScrRight;
+*/
 static COLORREF SysColours[] =
   {
     RGB(224, 224, 224) /* COLOR_SCROLLBAR */,
-    RGB(192, 192, 192) /* COLOR_BACKGROUND */,
-    RGB(0, 64, 128) /* COLOR_ACTIVECAPTION */,
-    RGB(255, 255, 255) /* COLOR_INACTIVECAPTION */,
-    RGB(255, 255, 255) /* COLOR_MENU */,
-    RGB(255, 255, 255) /* COLOR_WINDOW */,
-    RGB(0, 0, 0) /* COLOR_WINDOWFRAME */,
+    RGB(58, 110, 165) /* COLOR_BACKGROUND */,
+    RGB(0, 0, 128) /* COLOR_ACTIVECAPTION */,
+    RGB(128, 128, 128) /* COLOR_INACTIVECAPTION */,
+    RGB(192, 192, 192) /* COLOR_MENU */,
+    RGB(192, 192, 192) /* COLOR_WINDOW */,
+    RGB(192, 192, 192) /* COLOR_WINDOWFRAME */,
     RGB(0, 0, 0) /* COLOR_MENUTEXT */,
     RGB(0, 0, 0) /* COLOR_WINDOWTEXT */,
     RGB(255, 255, 255) /* COLOR_CAPTIONTEXT */,
@@ -44,12 +50,12 @@ static COLORREF SysColours[] =
     RGB(255, 255, 255) /* COLOR_INACTIVEBORDER */,
     RGB(255, 255, 232) /* COLOR_APPWORKSPACE */,
     RGB(224, 224, 224) /* COLOR_HILIGHT */,
-    RGB(0, 0, 0) /* COLOR_HILIGHTTEXT */,
+    RGB(0, 0, 128) /* COLOR_HILIGHTTEXT */,
     RGB(192, 192, 192) /* COLOR_BTNFACE */,
     RGB(128, 128, 128) /* COLOR_BTNSHADOW */,
     RGB(192, 192, 192) /* COLOR_GRAYTEXT */,
     RGB(0, 0, 0) /* COLOR_BTNTEXT */,
-    RGB(0, 0, 0) /* COLOR_INACTIVECAPTIONTEXT */,
+    RGB(192, 192, 192) /* COLOR_INACTIVECAPTIONTEXT */,
     RGB(255, 255, 255) /* COLOR_BTNHILIGHT */,
     RGB(32, 32, 32) /* COLOR_3DDKSHADOW */,
     RGB(192, 192, 192) /* COLOR_3DLIGHT */,
@@ -65,37 +71,88 @@ static ATOM AtomInternalPos;
 
 /* FUNCTIONS *****************************************************************/
 
+BOOL IsMaxBoxActive(HWND hWnd)
+{
+    ULONG uStyle = GetWindowLong( hWnd, GWL_STYLE );
+    return (uStyle & WS_MAXIMIZEBOX);
+}
+
+BOOL IsCloseBoxActive( HWND hWnd )
+{
+    ULONG uStyle = GetWindowLong(hWnd, GWL_STYLE );
+    return ( uStyle & WS_SYSMENU );
+}
+
+BOOL IsMinBoxActive( HWND hWnd )
+{
+    ULONG uStyle = GetWindowLong( hWnd, GWL_STYLE );
+    return (uStyle & WS_MINIMIZEBOX);
+}
+
+INT UIGetFrameSizeX( HWND hWnd )
+{
+    ULONG uStyle = GetWindowLong( hWnd, GWL_STYLE );
+    
+    if ( uStyle & WS_THICKFRAME )
+        return GetSystemMetrics( SM_CXSIZEFRAME );
+    else
+        return GetSystemMetrics( SM_CXFRAME );
+}
+
+INT UIGetFrameSizeY( HWND hWnd )
+{
+    ULONG uStyle = GetWindowLong( hWnd, GWL_STYLE );
+    
+    if ( uStyle & WS_THICKFRAME )
+        return GetSystemMetrics( SM_CYSIZEFRAME );
+    else
+        return GetSystemMetrics( SM_CYFRAME );
+}
+
 VOID
-UserSetupInternalPos(VOID)
+UserSetupInternalPos( VOID )
 {
   LPSTR Str = "SysIP";
   AtomInternalPos = GlobalAddAtomA(Str);
 }
 
-/* ReactOS extension */
 HPEN STDCALL
-GetSysColorPen(int nIndex)
+GetSysColorPen( int nIndex )
 {
   return(CreatePen(PS_SOLID, 1, SysColours[nIndex]));
 }
 
 HBRUSH STDCALL
-GetSysColorBrush(int nIndex)
+GetSysColorBrush( int nIndex )
 {
   return(CreateSolidBrush(SysColours[nIndex]));
 }
 
 
 LRESULT STDCALL
-DefFrameProcA(HWND hWnd,
+DefFrameProcA( HWND hWnd,
              HWND hWndMDIClient,
              UINT uMsg,
              WPARAM wParam,
-             LPARAM lParam)
+             LPARAM lParam )
 {
   return((LRESULT)0);
 }
+/*
+static LRESULT WINAPI DefButtonWndProc( HWND hWnd, UINT uMsg,
+                                       WPARAM wParam, LPARAM lParam )
+{
+    return ((LRESULT)0);
+}
+
+
+static LRESULT WINAPI DefDesktopWndProc( HWND hWnd, UINT uMsg,
+                                        WPARAM wParam, LPARAM lParam )
+{
+    return ((LRESULT)0);
+}
 
+*/
 LRESULT STDCALL
 DefFrameProcW(HWND hWnd,
              HWND hWndMDIClient,
@@ -166,15 +223,34 @@ UserHasBigFrameStyle(ULONG Style, ULONG ExStyle)
         (ExStyle & WS_EX_DLGMODALFRAME));
 }
 
-void UserGetInsideRectNC( HWND hwnd, RECT *rect )
+INT GetFrameSize(HWND hWnd)
+{
+    ULONG uStyle;
+    ULONG uExStyle;
+
+    uStyle = GetWindowLong(hWnd, GWL_STYLE);
+    uExStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
+    
+    if (UserHasThinFrameStyle(uStyle, uExStyle))
+    {
+        return GetSystemMetrics( SM_CXBORDER );
+    }
+    else if (UserHasDlgFrameStyle(uStyle, uExStyle))
+    {
+        return GetSystemMetrics( SM_CXDLGFRAME );
+    }
+    return GetSystemMetrics( SM_CXFRAME );
+}
+
+void UserGetInsideRectNC( HWND hWnd, RECT *rect )
 {
   RECT WindowRect;
   ULONG Style;
   ULONG ExStyle;
 
-  Style = GetWindowLong(hwnd, GWL_STYLE);
-  ExStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
-  GetWindowRect(hwnd, &WindowRect);
+  Style = GetWindowLong(hWnd, GWL_STYLE);
+  ExStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
+  GetWindowRect(hWnd, &WindowRect);
   rect->top    = rect->left = 0;
   rect->right  = WindowRect.right - WindowRect.left;
   rect->bottom = WindowRect.bottom - WindowRect.top;
@@ -211,224 +287,187 @@ void UserGetInsideRectNC( HWND hwnd, RECT *rect )
       }
 }
 
-void UserDrawSysButton( HWND hwnd, HDC hdc, BOOL down )
+void UserDrawSysMenuButton( HWND hWnd, HDC hDC, BOOL down )
 {
-    RECT rect;
-    HDC hdcMem;
-    HBITMAP hbitmap;
-    ULONG Style;
-
-    Style = GetWindowLong(hwnd, GWL_STYLE);
-    UserGetInsideRectNC( hwnd, &rect );
-    hdcMem = CreateCompatibleDC( hdc );
-    hbitmap = SelectObject( hdcMem, hbitmapClose );
-    BitBlt(hdc, rect.left, rect.top, GetSystemMetrics(SM_CXSIZE),
-          GetSystemMetrics(SM_CYSIZE), hdcMem,
-          (Style & WS_CHILD) ? GetSystemMetrics(SM_CXSIZE) : 0, 0,
-          down ? NOTSRCCOPY : SRCCOPY );
-    SelectObject( hdcMem, hbitmap );
-    DeleteDC( hdcMem );
+  RECT Rect;
+  HDC hDcMem;
+  HBITMAP hSavedBitmap;
+  
+  hbSysMenu = LoadBitmap(0, MAKEINTRESOURCE(OBM_CLOSE));
+  UserGetInsideRectNC(hWnd, &Rect);
+  hDcMem = CreateCompatibleDC(hDC);
+  hSavedBitmap = SelectObject(hDcMem, hbSysMenu);
+  BitBlt(hDC, Rect.left + 2, Rect.top + 
+         2, 16, 16, hDcMem,
+         (GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD) ?
+        GetSystemMetrics(SM_CXSIZE): 0, 0, SRCCOPY);
+  SelectObject(hDcMem, hSavedBitmap);
+  DeleteDC(hDcMem);
 }
 
-static void UserDrawMaxButton( HWND hwnd, HDC hdc, BOOL down )
+/* FIXME:  Cache bitmaps, then just bitblt instead of calling DFC() (and
+           wasting precious CPU cycles) every time */
+           
+static void UserDrawCloseButton ( HWND hWnd, HDC hDC, BOOL bDown )
 {
     RECT rect;
-    HDC hdcMem;
-
-    UserGetInsideRectNC( hwnd, &rect );
-    hdcMem = CreateCompatibleDC( hdc );
-    SelectObject( hdcMem,  (IsZoomed(hwnd)
-                           ? (down ? hbitmapRestoreD : hbitmapRestore)
-                           : (down ? hbitmapMaximizeD : hbitmapMaximize)) );
-    BitBlt( hdc, rect.right - GetSystemMetrics(SM_CXSMSIZE) - 1, rect.top,
-           GetSystemMetrics(SM_CXSMSIZE) + 1, GetSystemMetrics(SM_CYSMSIZE), hdcMem, 0, 0,
-           SRCCOPY );
-    DeleteDC( hdcMem );
-}
-
-static void UserDrawMinButton( HWND hwnd, HDC hdc, BOOL down)
-{
-  RECT rect;
-  HDC hdcMem;
-
-  UserGetInsideRectNC(hwnd, &rect);
-  hdcMem = CreateCompatibleDC(hdc);
-  SelectObject(hdcMem, (down ? hbitmapMinimizeD : hbitmapMinimize));
-  if (GetWindowLong(hwnd, GWL_STYLE) & WS_MAXIMIZEBOX)
+    
+    BOOL bToolWindow = GetWindowLongA( hWnd, GWL_EXSTYLE ) & WS_EX_TOOLWINDOW;
+    INT iBmpWidth =  (bToolWindow ? GetSystemMetrics(SM_CXSMSIZE) :
+                      GetSystemMetrics(SM_CXSIZE)) - 2;
+    INT iBmpHeight = (bToolWindow ? GetSystemMetrics(SM_CYSMSIZE) :
+                      GetSystemMetrics(SM_CYSIZE) - 4);
+    INT OffsetX = UIGetFrameSizeY( hWnd );
+    INT OffsetY = UIGetFrameSizeY( hWnd );
+    
+    
+    if(!(GetWindowLong( hWnd, GWL_STYLE ) & WS_SYSMENU))
     {
-      rect.right -= GetSystemMetrics(SM_CXSMSIZE)+1;
+        return;
     }
-  BitBlt( hdc, rect.right - GetSystemMetrics(SM_CXSMSIZE) - 1, rect.top,
-         GetSystemMetrics(SM_CXSMSIZE) + 1, GetSystemMetrics(SM_CYSMSIZE),
-         hdcMem, 0, 0,
-         SRCCOPY );
-  DeleteDC( hdcMem );
+    GetWindowRect( hWnd, &rect );
+    
+    rect.right = rect.right - rect.left;
+    rect.bottom = rect.bottom - rect.top;
+    rect.left = rect.top = 0;
+    SetRect(&rect,
+            rect.right - OffsetX - iBmpWidth - 3,
+            OffsetY + 2,
+            rect.right - OffsetX - 3,
+            rect.top + iBmpHeight + OffsetY + 2 );      
+            
+    DrawFrameControl( hDC, &rect, DFC_CAPTION,
+                      (DFCS_CAPTIONCLOSE |
+                       (bDown ? DFCS_PUSHED : 0) |
+                       (IsCloseBoxActive(hWnd) ? 0 : DFCS_INACTIVE)) );
 }
-
-static void UserDrawCaptionNC( HDC hdc, RECT *rect, HWND hwnd,
-                           DWORD style, BOOL active )
+           
+static void UserDrawMaxButton( HWND hWnd, HDC hDC, BOOL bDown )
 {
-  RECT r = *rect;
-  char buffer[256];
 
-  if (!hbitmapClose)
-    {
-      hbitmapClose = LoadBitmapW( 0, MAKEINTRESOURCE(OBM_CLOSE));
-      hbitmapMinimize  = LoadBitmapW( 0, MAKEINTRESOURCE(OBM_REDUCE) );
-      hbitmapMinimizeD = LoadBitmapW( 0, MAKEINTRESOURCE(OBM_REDUCED) );
-      hbitmapMaximize  = LoadBitmapW( 0, MAKEINTRESOURCE(OBM_ZOOM) );
-      hbitmapMaximizeD = LoadBitmapW( 0, MAKEINTRESOURCE(OBM_ZOOMD) );
-      hbitmapRestore   = LoadBitmapW( 0, MAKEINTRESOURCE(OBM_RESTORE) );
-      hbitmapRestoreD  = LoadBitmapW( 0, MAKEINTRESOURCE(OBM_RESTORED) );
-    }
+    RECT rect;
+    INT iBmpWidth = GetSystemMetrics(SM_CXSIZE) - 2;
+    INT iBmpHeight = GetSystemMetrics(SM_CYSIZE) - 4;
+
+    INT OffsetX = UIGetFrameSizeY( hWnd );
+    INT OffsetY = UIGetFrameSizeY( hWnd );
+    
+    GetWindowRect( hWnd, &rect );
+    
+    if (!IsMinBoxActive(hWnd) && !IsMaxBoxActive(hWnd))
+        return;    
+    if ((GetWindowLongA( hWnd, GWL_EXSTYLE ) & WS_EX_TOOLWINDOW) == TRUE)
+        return;   /* ToolWindows don't have min/max buttons */
+        
+    rect.right = rect.right - rect.left;
+    rect.bottom = rect.bottom - rect.top;
+    rect.left = rect.top = 0;
+    SetRect(&rect,
+            rect.right - OffsetX - (iBmpWidth*2) - 5,
+            OffsetY + 2,
+            rect.right - iBmpWidth - OffsetX - 5,
+            rect.top + iBmpHeight + OffsetY + 2 );  
+    
+    DrawFrameControl( hDC, &rect, DFC_CAPTION,
+                     (IsZoomed(hWnd) ? DFCS_CAPTIONRESTORE : DFCS_CAPTIONMAX) |
+                     (bDown ? DFCS_PUSHED : 0) |
+                     (IsMaxBoxActive(hWnd) ? 0 : DFCS_INACTIVE) );
+    
+}
 
-  if (GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_DLGMODALFRAME)
-    {
-      HBRUSH hbrushOld = SelectObject(hdc, GetSysColorBrush(COLOR_WINDOW) );
-      PatBlt( hdc, r.left, r.top, 1, r.bottom-r.top+1,PATCOPY );
-      PatBlt( hdc, r.right-1, r.top, 1, r.bottom-r.top+1, PATCOPY );
-      PatBlt( hdc, r.left, r.top-1, r.right-r.left, 1, PATCOPY );
-      r.left++;
-      r.right--;
-      SelectObject( hdc, hbrushOld );
-    }
+static void UserDrawMinButton( HWND hWnd, HDC hDC, BOOL bDown )
+{
 
-  MoveToEx( hdc, r.left, r.bottom, NULL );
-  LineTo( hdc, r.right, r.bottom );
+    RECT rect;
+    INT iBmpWidth = GetSystemMetrics(SM_CXSIZE) - 2;
+    INT iBmpHeight = GetSystemMetrics(SM_CYSIZE) - 4;
+    
+    INT OffsetX = UIGetFrameSizeX( hWnd );
+    INT OffsetY = UIGetFrameSizeY( hWnd );
+    
+    GetWindowRect( hWnd, &rect );
+    
+    if (!IsMinBoxActive(hWnd) && !IsMaxBoxActive(hWnd))
+        return;    
+    if ((GetWindowLongA( hWnd, GWL_EXSTYLE ) & WS_EX_TOOLWINDOW) == TRUE)
+        return;   /* ToolWindows don't have min/max buttons */
+        
+    rect.right = rect.right - rect.left;
+    rect.bottom = rect.bottom - rect.top;
+    rect.left = rect.top = 0;
+    SetRect(&rect,
+            rect.right - OffsetX - (iBmpWidth*3) - 5,
+            OffsetY + 2,
+            rect.right - (iBmpWidth * 2) - OffsetX - 5,
+            rect.top + iBmpHeight + OffsetY + 2 );  
+    DrawFrameControl( hDC, &rect, DFC_CAPTION,
+                     DFCS_CAPTIONMIN | (bDown ? DFCS_PUSHED : 0) |
+                     (IsMinBoxActive(hWnd) ? 0 : DFCS_INACTIVE) );
+}
 
-  if (style & WS_SYSMENU)
-    {
-      UserDrawSysButton( hwnd, hdc, FALSE );
-      r.left += GetSystemMetrics(SM_CXSIZE) + 1;
-      MoveToEx( hdc, r.left - 1, r.top, NULL );
-      LineTo( hdc, r.left - 1, r.bottom );
-    }
-  if (style & WS_MAXIMIZEBOX)
-    {
-      UserDrawMaxButton( hwnd, hdc, FALSE );
-      r.right -= GetSystemMetrics(SM_CXSMSIZE) + 1;
-    }
-  if (style & WS_MINIMIZEBOX)
+static void UserDrawCaptionNC( HDC hDC, RECT *rect, HWND hWnd,
+                           DWORD style, BOOL active )
+{
+    RECT r = *rect;
+    char buffer[256];
+    /* Implement and Use DrawCaption() */
+    SelectObject( hDC, GetSysColorBrush(active ? COLOR_ACTIVECAPTION : COLOR_INACTIVECAPTION) );
+    PatBlt(hDC,rect->left + GetSystemMetrics(SM_CXFRAME), rect->top +
+           GetSystemMetrics(SM_CYFRAME), rect->right - (GetSystemMetrics(SM_CXFRAME) * 2) - 1, rect->top + 
+           GetSystemMetrics(SM_CYCAPTION) - 1, PATCOPY );
+    
+    if (style & WS_SYSMENU)
     {
-      UserDrawMinButton( hwnd, hdc, FALSE );
-      r.right -= GetSystemMetrics(SM_CXSMSIZE) + 1;
+        UserDrawSysMenuButton( hWnd, hDC, FALSE);
+        r.left += GetSystemMetrics(SM_CXSIZE) + 1;
+        UserDrawCloseButton( hWnd, hDC, FALSE);
+        r.right -= GetSystemMetrics(SM_CXSMSIZE) + 1;
+        UserDrawMinButton(hWnd, hDC, FALSE);
+        UserDrawMaxButton(hWnd, hDC, FALSE);
     }
-
-  FillRect( hdc, &r, GetSysColorBrush(active ? COLOR_ACTIVECAPTION :
-                                           COLOR_INACTIVECAPTION) );
-
-  if (GetWindowTextA( hwnd, buffer, sizeof(buffer) ))
+    if (GetWindowTextA( hWnd, buffer, sizeof(buffer) ))
     {
-      NONCLIENTMETRICS nclm;
-      HFONT hFont, hOldFont;
-
-      nclm.cbSize = sizeof(NONCLIENTMETRICS);
-      SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, 0, &nclm, 0);
-      if (style & WS_EX_TOOLWINDOW)
-        hFont = CreateFontIndirectW(&nclm.lfSmCaptionFont);
-      else
-        hFont = CreateFontIndirectW(&nclm.lfCaptionFont);
-      hOldFont = SelectObject(hdc, hFont);
-
-      if (active) SetTextColor( hdc, GetSysColor( COLOR_CAPTIONTEXT ) );
-      else SetTextColor( hdc, GetSysColor( COLOR_INACTIVECAPTIONTEXT ) );
-      SetBkMode( hdc, TRANSPARENT );
-      /*DrawTextA( hdc, buffer, -1, &r,
-       DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_NOPREFIX );*/
-      TextOutA(hdc, r.left+5, r.top+2, buffer, strlen(buffer));
-      DeleteObject (SelectObject (hdc, hOldFont));
+        NONCLIENTMETRICS nclm;
+        HFONT hFont, hOldFont;
+
+        nclm.cbSize = sizeof(NONCLIENTMETRICS);
+        SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, 0, &nclm, 0);
+        SetTextColor(hDC, SysColours[ active ? COLOR_CAPTIONTEXT : COLOR_INACTIVECAPTIONTEXT]);
+        SetBkMode( hDC, TRANSPARENT );
+        if (style & WS_EX_TOOLWINDOW)
+            hFont = CreateFontIndirectW(&nclm.lfSmCaptionFont);
+        else
+            hFont = CreateFontIndirectW(&nclm.lfCaptionFont);
+        hOldFont = SelectObject(hDC, hFont);
+        TextOutA(hDC, r.left + (GetSystemMetrics(SM_CXDLGFRAME) * 2), (r.top / 2) + (((int) nclm.lfCaptionFont.lfHeight) / 2) + (GetSystemMetrics(SM_CXDLGFRAME) / 2), buffer, strlen(buffer));
+        DeleteObject (SelectObject (hDC, hOldFont));
     }
 }
 
 VOID
-UserDrawFrameNC(HDC hdc, RECT* rect, BOOL dlgFrame, BOOL active)
+UserDrawFrameNC(HDC hDC, RECT* rect, BOOL dlgFrame, BOOL active)
 {
-  INT width, height;
-
-  if (dlgFrame)
-    {
-      width = GetSystemMetrics(SM_CXDLGFRAME) - 1;
-      height = GetSystemMetrics(SM_CYDLGFRAME) - 1;
-      SelectObject( hdc, GetSysColorBrush(active ? COLOR_ACTIVECAPTION :
-                                         COLOR_INACTIVECAPTION) );
-    }
-  else
-    {
-      width = GetSystemMetrics(SM_CXFRAME) - 2;
-      height = GetSystemMetrics(SM_CYFRAME) - 2;
-      SelectObject( hdc, GetSysColorBrush(active ? COLOR_ACTIVEBORDER :
-                                           COLOR_INACTIVEBORDER) );
-    }
-
-  /* Draw frame */
-  PatBlt( hdc, rect->left, rect->top,
-         rect->right - rect->left, height, PATCOPY );
-  PatBlt( hdc, rect->left, rect->top,
-         width, rect->bottom - rect->top, PATCOPY );
-  PatBlt( hdc, rect->left, rect->bottom - 1,
-         rect->right - rect->left, -height, PATCOPY );
-  PatBlt( hdc, rect->right - 1, rect->top,
-         -width, rect->bottom - rect->top, PATCOPY );
-
-  if (dlgFrame)
-    {
-      InflateRect( rect, -width, -height );
-    }
-  else
-    {
-      INT decYOff = GetSystemMetrics(SM_CXFRAME) +
-       GetSystemMetrics(SM_CXSIZE) - 1;
-      INT decXOff = GetSystemMetrics(SM_CYFRAME) +
-       GetSystemMetrics(SM_CYSIZE) - 1;
-
-      /* Draw inner rectangle */
-
-      SelectObject( hdc, GetStockObject(NULL_BRUSH) );
-      Rectangle( hdc, rect->left + width, rect->top + height,
-                rect->right - width , rect->bottom - height );
-
-      /* Draw the decorations */
-
-      MoveToEx( hdc, rect->left, rect->top + decYOff, NULL );
-      LineTo( hdc, rect->left + width, rect->top + decYOff );
-      MoveToEx( hdc, rect->right - 1, rect->top + decYOff, NULL );
-      LineTo( hdc, rect->right - width - 1, rect->top + decYOff );
-      MoveToEx( hdc, rect->left, rect->bottom - decYOff, NULL );
-      LineTo( hdc, rect->left + width, rect->bottom - decYOff );
-      MoveToEx( hdc, rect->right - 1, rect->bottom - decYOff, NULL );
-      LineTo( hdc, rect->right - width - 1, rect->bottom - decYOff );
-
-      MoveToEx( hdc, rect->left + decXOff, rect->top, NULL );
-      LineTo( hdc, rect->left + decXOff, rect->top + height);
-      MoveToEx( hdc, rect->left + decXOff, rect->bottom - 1, NULL );
-      LineTo( hdc, rect->left + decXOff, rect->bottom - height - 1 );
-      MoveToEx( hdc, rect->right - decXOff, rect->top, NULL );
-      LineTo( hdc, rect->right - decXOff, rect->top + height );
-      MoveToEx( hdc, rect->right - decXOff, rect->bottom - 1, NULL );
-      LineTo( hdc, rect->right - decXOff, rect->bottom - height - 1 );
-
-      InflateRect( rect, -width - 1, -height - 1 );
-    }
+    SelectObject( hDC, GetSysColorBrush(COLOR_WINDOW) ); 
+    DrawEdge(hDC, rect,EDGE_RAISED, BF_RECT | BF_MIDDLE);
 }
 
-void SCROLL_DrawScrollBar (HWND hwnd, HDC hdc, INT nBar, BOOL arrows, BOOL interior);
+void SCROLL_DrawScrollBar (HWND hWnd, HDC hDC, INT nBar, BOOL arrows, BOOL interior);
 
 VOID
 DefWndDoPaintNC(HWND hWnd, HRGN clip)
 {
   ULONG Active;
-  HDC hDc;
+  HDC hDC;
   RECT rect;
   ULONG Style;
   ULONG ExStyle;
-
   Active = GetWindowLongW(hWnd, GWL_STYLE) & WIN_NCACTIVATED;
   Style = GetWindowLong(hWnd, GWL_STYLE);
   ExStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
 
-  hDc = GetDCEx(hWnd, (clip > (HRGN)1) ? clip : 0, DCX_USESTYLE | DCX_WINDOW |
+  hDC = GetDCEx(hWnd, (clip > (HRGN)1) ? clip : 0, DCX_USESTYLE | DCX_WINDOW |
                ((clip > (HRGN)1) ? (DCX_INTERSECTRGN | DCX_KEEPCLIPRGN) : 0));
-  if (hDc == 0)
+  if (hDC == 0)
     {
       return;
     }
@@ -439,45 +478,37 @@ DefWndDoPaintNC(HWND hWnd, HRGN clip)
   rect.right = rect.right - rect.left;
   rect.bottom = rect.bottom - rect.top;
   rect.top = rect.left = 0;
-
-  SelectObject(hDc, GetSysColorPen(COLOR_WINDOWFRAME));
-  if (UserHasAnyFrameStyle(Style, ExStyle))
-    {
-      SelectObject(hDc, GetStockObject(NULL_BRUSH));
-      Rectangle(hDc, 0, 0, rect.right, rect.bottom);
-      InflateRect(&rect, -1, -1);
-    }
-
+  SelectObject(hDC, GetSysColorPen(COLOR_WINDOWFRAME));
   if (UserHasThickFrameStyle(Style, ExStyle))
     {
-      UserDrawFrameNC(hDc, &rect, FALSE, Active);
+      UserDrawFrameNC(hDC, &rect, FALSE, Active);
     }
   else if (UserHasDlgFrameStyle(Style, ExStyle))
     {
-      UserDrawFrameNC(hDc, &rect, TRUE, Active);
+      UserDrawFrameNC(hDC, &rect, TRUE, Active);
     }
-
   if (Style & WS_CAPTION)
     {
       RECT r = rect;
       r.bottom = rect.top + GetSystemMetrics(SM_CYSIZE);
       rect.top += GetSystemMetrics(SM_CYSIZE) +
        GetSystemMetrics(SM_CYBORDER);
-      UserDrawCaptionNC(hDc, &r, hWnd, Style, Active);
+      UserDrawCaptionNC(hDC, &r, hWnd, Style, Active);
     }
 
-  /* FIXME: Draw menu bar. */
+/*  FIXME: Draw menu bar.  */
 
-DbgPrint("drawing scrollbars..\n");
-  /* Draw scrollbars */
+  DbgPrint("drawing scrollbars..\n");
+/*  Draw scrollbars */
   if (Style & WS_VSCROLL)
-      SCROLL_DrawScrollBar(hWnd, hDc, SB_VERT, TRUE, TRUE);
+      SCROLL_DrawScrollBar(hWnd, hDC, SB_VERT, TRUE, TRUE);
   if (Style & WS_HSCROLL)
-      SCROLL_DrawScrollBar(hWnd, hDc, SB_HORZ, TRUE, TRUE);
+      SCROLL_DrawScrollBar(hWnd, hDC, SB_HORZ, TRUE, TRUE);
 
-  /* FIXME: Draw size box. */
+  /* FIXME: Draw size box.*/
 
-  ReleaseDC(hWnd, hDc);
+  ReleaseDC(hWnd, hDC);
+  
 }
 
 LRESULT
@@ -505,9 +536,9 @@ DefWndHitTestNC(HWND hWnd, POINT Point)
   ULONG ExStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
 
   GetWindowRect(hWnd, &WindowRect);
-
   if (!PtInRect(&WindowRect, Point))
     {
+      
       return(HTNOWHERE);
     }
   if (Style & WS_MINIMIZE)
@@ -597,15 +628,20 @@ DefWndHitTestNC(HWND hWnd, POINT Point)
          if ((Style & WS_SYSMENU) && !(ExStyle & WS_EX_TOOLWINDOW))
            {
              WindowRect.left += GetSystemMetrics(SM_CXSIZE);
+             WindowRect.right -= GetSystemMetrics(SM_CXSIZE) + 1;
            }
          if (Point.x <= WindowRect.left)
            {
              return(HTSYSMENU);
            }
+         if (WindowRect.right <= Point.x)
+           {
+             return(HTCLOSE);
+           }
 
-         if (Style & WS_MAXIMIZEBOX)
+         if (Style & WS_MAXIMIZEBOX || Style & WS_MINIMIZEBOX)
            {
-             WindowRect.right -= GetSystemMetrics(SM_CXSMSIZE) + 1;
+             WindowRect.right -= GetSystemMetrics(SM_CXSIZE) - 2;
            }
          if (Point.x >= WindowRect.right)
            {
@@ -614,7 +650,7 @@ DefWndHitTestNC(HWND hWnd, POINT Point)
 
          if (Style & WS_MINIMIZEBOX)
            {
-             WindowRect.right -= GetSystemMetrics(SM_CXSMSIZE) + 1;
+             WindowRect.right -= GetSystemMetrics(SM_CXSIZE) - 2;
            }
          if (Point.x >= WindowRect.right)
            {
@@ -667,167 +703,116 @@ DefWndHitTestNC(HWND hWnd, POINT Point)
 }
 
 VOID
-DefWndTrackMinMaxBox(HWND hWnd, WPARAM wParam)
-{
-  HDC hDC = GetWindowDC(hWnd);
-  BOOL Pressed = TRUE;
-  MSG Msg;
-
-  SetCapture(hWnd);
-
-  if (wParam == HTMINBUTTON)
-    {
-      UserDrawMinButton(hWnd, hDC, TRUE);
-    }
-  else
-    {
-      UserDrawMaxButton(hWnd, hDC, TRUE);
-    }
-
-  for(;;)
-    {
-      BOOL OldState = Pressed;
-
-      GetMessageA(hWnd, &Msg, 0, 0);
-      if (Msg.message == WM_LBUTTONUP)
-       {
-         break;
-       }
-      if (Msg.message != WM_MOUSEMOVE)
-       {
-         continue;
-       }
-
-      Pressed = DefWndHitTestNC(hWnd, Msg.pt) == (LRESULT) wParam;
-      if (Pressed != OldState)
-       {
-         if (wParam == HTMINBUTTON)
-           {
-             UserDrawMinButton(hWnd, hDC, Pressed);
-           }
-         else
-           {
-             UserDrawMaxButton(hWnd, hDC, Pressed);
-           }
-       }
-    }
-
-  if (Pressed)
-    {
-      if (wParam == HTMINBUTTON)
-       {
-         UserDrawMinButton(hWnd, hDC, FALSE);
-       }
-      else
-       {
-         UserDrawMaxButton(hWnd, hDC, FALSE);
-       }
-    }
-
-  ReleaseCapture();
-  ReleaseDC(hWnd, hDC);
-
-  if (!Pressed)
-    {
-      return;
-    }
-
-  if (wParam == HTMINBUTTON)
-    {
-      SendMessageA(hWnd, WM_SYSCOMMAND, SC_MINIMIZE,
-                  MAKELONG(Msg.pt.x, Msg.pt.y));
-    }
-  else
-    {
-      SendMessageA(hWnd, WM_SYSCOMMAND,
-                  IsZoomed(hWnd) ? SC_RESTORE : SC_MAXIMIZE,
-                  MAKELONG(Msg.pt.x, Msg.pt.y));
-    }
-}
-
-VOID
 DefWndDrawSysButton(HWND hWnd, HDC hDC, BOOL Down)
 {
-  RECT Rect;
-  HDC hDcMem;
-  HBITMAP hSavedBitmap;
-
-  UserGetInsideRectNC(hWnd, &Rect);
-  hDcMem = CreateCompatibleDC(hDC);
-  hSavedBitmap = SelectObject(hDcMem, hbitmapClose);
-  BitBlt(hDC, Rect.left, Rect.top, GetSystemMetrics(SM_CXSIZE),
-        GetSystemMetrics(SM_CYSIZE), hDcMem,
-        (GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD) ?
-        GetSystemMetrics(SM_CXSIZE): 0, 0, Down ? NOTSRCCOPY : SRCCOPY);
-  SelectObject(hDcMem, hSavedBitmap);
-  DeleteDC(hDcMem);
 }
 
 LRESULT
 DefWndHandleLButtonDownNC(HWND hWnd, WPARAM wParam, LPARAM lParam)
 {
-  switch (wParam)
+    switch (wParam)
     {
-    case HTCAPTION:
-      {
-       HWND hTopWnd = GetAncestor(hWnd, GA_ROOT);
-       if (SetActiveWindow(hTopWnd) || GetActiveWindow() == hTopWnd)
-         {
-           SendMessageA(hWnd, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, lParam);
-         }
-       break;
-      }
-    case HTSYSMENU:
-      {
-       if (GetWindowLong(hWnd, GWL_STYLE) & WS_SYSMENU)
-         {
-           if (!(GetWindowLong(hWnd, GWL_STYLE) & WS_MINIMIZE))
-             {
-               HDC hDC = GetWindowDC(hWnd);
-               DefWndDrawSysButton(hWnd, hDC, TRUE);
-               ReleaseDC(hWnd, hDC);
-             }
-           SendMessageA(hWnd, WM_SYSCOMMAND, SC_MOUSEMENU + HTSYSMENU,
-                        lParam);
-         }
-       break;
-      }
-
-    case HTMENU:
-      SendMessageA(hWnd, WM_SYSCOMMAND, SC_MOUSEMENU, lParam);
-      break;
-
-    case HTHSCROLL:
-      SendMessageA(hWnd, WM_SYSCOMMAND, SC_HSCROLL + HTHSCROLL, lParam);
-      break;
-
-    case HTVSCROLL:
-      SendMessageA(hWnd, WM_SYSCOMMAND, SC_VSCROLL + HTVSCROLL, lParam);
-      break;
-
-    case HTMINBUTTON:
-    case HTMAXBUTTON:
-      DefWndTrackMinMaxBox(hWnd, wParam);
-      break;
-
-    case HTLEFT:
-    case HTRIGHT:
-    case HTTOP:
-    case HTBOTTOM:
-    case HTTOPLEFT:
-    case HTTOPRIGHT:
-    case HTBOTTOMLEFT:
-    case HTBOTTOMRIGHT:
-      SendMessageA(hWnd, WM_SYSCOMMAND, SC_SIZE + wParam - 2, lParam);
-      break;
+        case HTCAPTION:
+        {
+               HWND hTopWnd = GetDesktopWindow(); //GetAncestor(hWnd, GA_ROOT); temp fix.
+               if (SetActiveWindow(hTopWnd) || GetActiveWindow() == hTopWnd)
+               {
+                   SendMessageA(hWnd, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, lParam);
+               }
+               break;
+        }
+        case HTSYSMENU:
+        {
+               if (GetWindowLong(hWnd, GWL_STYLE) & WS_SYSMENU)
+            {
+                   if (!(GetWindowLong(hWnd, GWL_STYLE) & WS_MINIMIZE))
+                   {
+                           HDC hDC = GetWindowDC(hWnd);
+                           DefWndDrawSysButton(hWnd, hDC, TRUE);
+                           ReleaseDC(hWnd, hDC);
+                   }
+               SendMessageA(hWnd, WM_SYSCOMMAND, SC_MOUSEMENU + HTSYSMENU,
+                                    lParam);
+               }
+            break;
+        }
+        case HTMENU:
+        {
+            SendMessageA(hWnd, WM_SYSCOMMAND, SC_MOUSEMENU, lParam);
+            break;
+        }
+        case HTHSCROLL:
+        {
+            SendMessageA(hWnd, WM_SYSCOMMAND, SC_HSCROLL + HTHSCROLL, lParam);
+            break;
+        }
+        case HTVSCROLL:
+        {
+            SendMessageA(hWnd, WM_SYSCOMMAND, SC_VSCROLL + HTVSCROLL, lParam);
+            break;
+        }
+        case HTMINBUTTON:
+        {
+            UserDrawMinButton(hWnd, GetWindowDC(hWnd), IsMinBoxActive(hWnd) );
+            break;
+        }
+        case HTMAXBUTTON:
+        {
+            UserDrawMaxButton(hWnd,GetWindowDC(hWnd), IsMaxBoxActive(hWnd) );
+            break;
+        }
+        case HTCLOSE:
+        {
+            UserDrawCloseButton(hWnd,GetWindowDC(hWnd),TRUE);
+            break;
+        }
+        case HTLEFT:
+        case HTRIGHT:
+        case HTTOP:
+        case HTBOTTOM:
+        case HTTOPLEFT:
+        case HTTOPRIGHT:
+        case HTBOTTOMLEFT:
+        case HTBOTTOMRIGHT:
+        {
+            SendMessageA(hWnd, WM_SYSCOMMAND, SC_SIZE + wParam - 2, lParam);
+            break;
+        }
     }
-  return(0);
+    return(0);
 }
 
 LRESULT
 DefWndHandleLButtonDblClkNC(HWND hWnd, WPARAM wParam, LPARAM lParam)
 {
-  /* FIXME: Implement this. */
+    return(0);
+}
+
+LRESULT
+DefWndHandleLButtonUpNC(HWND hWnd, WPARAM wParam, LPARAM lParam)
+{
+    UserDrawMinButton(hWnd,GetWindowDC(hWnd),FALSE);
+    UserDrawMaxButton(hWnd,GetWindowDC(hWnd),FALSE);
+    UserDrawCloseButton(hWnd,GetWindowDC(hWnd),FALSE);
+    switch (wParam)
+    {
+        case HTMINBUTTON:
+        {
+            SendMessageA(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
+            break;
+        }
+        case HTMAXBUTTON:
+        {
+            SendMessageA(hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
+            break;
+        }
+        case HTCLOSE:
+        {
+            SendMessageA(hWnd, WM_CLOSE, 0, 0);
+            SendMessageA(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0);
+            break;
+        }
+    }
   return(0);
 }
 
@@ -994,8 +979,7 @@ DefWndNCCalcSize(HWND hWnd, RECT* Rect)
 LRESULT
 DefWndHandleWindowPosChanging(HWND hWnd, WINDOWPOS* Pos)
 {
-  /* FIXME: Implement this. */
-  return(0);
+  return 0;
 }
 
 LRESULT STDCALL
@@ -1011,7 +995,10 @@ User32DefWindowProc(HWND hWnd,
       {
        return(DefWndPaintNC(hWnd, (HRGN)wParam));
       }
-
+    case WM_WINDOWPOSCHANGING:
+    {
+         DbgPrint("WM_WINDOWPOSCHANGING\n\n");
+    }
     case WM_NCHITTEST:
       {
        POINT Point;
@@ -1025,6 +1012,11 @@ User32DefWindowProc(HWND hWnd,
        return(DefWndHandleLButtonDownNC(hWnd, wParam, lParam));
       }
 
+    case WM_NCLBUTTONUP:
+      {
+       return(DefWndHandleLButtonUpNC(hWnd, wParam, lParam));
+      }
+
     case WM_LBUTTONDBLCLK:
     case WM_NCLBUTTONDBLCLK:
       {
@@ -1039,7 +1031,10 @@ User32DefWindowProc(HWND hWnd,
          }
        break;
       }
-
+    case WM_LBUTTONUP:
+    {
+        break;
+    }
     case WM_RBUTTONUP:
       {
        POINT Pt;
@@ -1125,9 +1120,10 @@ User32DefWindowProc(HWND hWnd,
     case WM_PAINT:
       {
        PAINTSTRUCT Ps;
-       HDC hDc = BeginPaint(hWnd, &Ps);
-       if (hDc)
+       HDC hDC = BeginPaint(hWnd, &Ps);
+       if (hDC)
          {
+               
            HICON hIcon;
            if (GetWindowLongW(hWnd, GWL_STYLE) & WS_MINIMIZE &&
                (hIcon = (HICON)GetClassLongW(hWnd, GCL_HICON)) != NULL)
@@ -1139,8 +1135,8 @@ User32DefWindowProc(HWND hWnd,
                     GetSystemMetrics(SM_CXICON)) / 2;
                y = (WindowRect.bottom - WindowRect.top -
                     GetSystemMetrics(SM_CYICON)) / 2;
-               DrawIcon(hDc, x, y, hIcon);
-             }
+               DrawIcon(hDC, x, y, hIcon);
+             } 
            EndPaint(hWnd, &Ps);
          }
        return(0);
@@ -1227,6 +1223,7 @@ User32DefWindowProc(HWND hWnd,
     case WM_ERASEBKGND:
     case WM_ICONERASEBKGND:
       {
+       
        RECT Rect;
        HBRUSH hBrush = (HBRUSH)GetClassLongW(hWnd, GCL_HBRBACKGROUND);
        GetClipBox((HDC)wParam, &Rect);
@@ -1283,13 +1280,13 @@ User32DefWindowProc(HWND hWnd,
          {
            return(0);
          }
-       /* FIXME: Check for a popup window. */
+       /* FIXME: Not done correctly */
        if ((GetWindowLongW(hWnd, GWL_STYLE) & WS_VISIBLE && !wParam) ||
            (!(GetWindowLongW(hWnd, GWL_STYLE) & WS_VISIBLE) && wParam))
          {
            return(0);
          }
-       ShowWindow(hWnd, wParam ? SW_SHOWNOACTIVATE : SW_HIDE);
+       ShowWindow(hWnd, wParam ? SW_SHOWNA : SW_HIDE);
        break;
       }
 
@@ -1478,7 +1475,6 @@ DefWindowProcA(HWND hWnd,
          {
            GlobalDeleteAtom((ATOM)(ULONG)WindowTextAtom);
          }
-       /* FIXME: Destroy scroll bars here as well. */
        return(0);
       }
 
@@ -1583,7 +1579,7 @@ DefWindowProcW(HWND hWnd,
          {
            GlobalDeleteAtom((ATOM)(DWORD)WindowTextAtom);
          }
-       /* FIXME: Destroy scroll bars here as well. */
+
        return(0);
       }