Use DrawFrameControl() instead of OEM bitmaps to paint caption buttons
and menu check marks.

diff --git a/controls/menu.c b/controls/menu.c
index 43936be..6a79f6f 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -146,11 +146,8 @@
 #define STATE_MASK (~TYPE_MASK)
 
   /* Dimension of the menu bitmaps */
-static WORD check_bitmap_width = 0, check_bitmap_height = 0;
 static WORD arrow_bitmap_width = 0, arrow_bitmap_height = 0;
 
-static HBITMAP hStdRadioCheck = 0;
-static HBITMAP hStdCheck = 0;
 static HBITMAP hStdMnArrow = 0;
 
 /* Minimze/restore/close buttons to be inserted in menubar */
@@ -421,8 +418,6 @@
 					    0x55, 0, 0xAA, 0 };
 
     /* Load menu bitmaps */
-    hStdCheck = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_CHECK));
-    hStdRadioCheck = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_RADIOCHECK));
     hStdMnArrow = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_MNARROW));
     /* Load system buttons bitmaps */
     hBmpMinimize = LoadBitmapA(0,MAKEINTRESOURCEA(OBM_REDUCE));
@@ -432,19 +427,6 @@
     hBmpClose = LoadBitmapA(0,MAKEINTRESOURCEA(OBM_CLOSE));
     hBmpCloseD = LoadBitmapA(0,MAKEINTRESOURCEA(OBM_CLOSED));
 
-    if (hStdCheck)
-    {
-	BITMAP bm;
-	GetObjectA( hStdCheck, sizeof(bm), &bm );
-	check_bitmap_width = bm.bmWidth;
-	check_bitmap_height = bm.bmHeight;
-    } else
-	 return FALSE;
-
-    /* Assume that radio checks have the same size as regular checks.  */
-    if (!hStdRadioCheck)
-	 return FALSE;
-
     if (hStdMnArrow)
     {
 	BITMAP bm;
@@ -791,6 +773,7 @@
 			       INT orgX, INT orgY, BOOL menuBar )
 {
     WCHAR *p;
+    UINT check_bitmap_width = GetSystemMetrics( SM_CXMENUCHECK );
 
     TRACE("dc=0x%04x owner=0x%04x (%d,%d)\n", hdc, hwndOwner, orgX, orgY);
     debug_print_menuitem("MENU_CalcItemSize: menuitem:", lpitem, 
@@ -1240,6 +1223,8 @@
     if (!menuBar)
     {
 	INT	y = rect.top + rect.bottom;
+        UINT check_bitmap_width = GetSystemMetrics( SM_CXMENUCHECK );
+        UINT check_bitmap_height = GetSystemMetrics( SM_CYMENUCHECK );
 
         if (!(lpitem->fType & MF_OWNERDRAW))
         {
@@ -1248,29 +1233,31 @@
 	       * FIXME:
 	       * Custom checkmark bitmaps are monochrome but not always 1bpp. 
 	       */
-
-	    if (lpitem->fState & MF_CHECKED)
-	    {
-	        HBITMAP bm = lpitem->hCheckBit ? lpitem->hCheckBit :
-			    ((lpitem->fType & MFT_RADIOCHECK) ? hStdRadioCheck : hStdCheck);
-	        HDC hdcMem = CreateCompatibleDC( hdc );
-
-	        SelectObject( hdcMem, bm );
-	        BitBlt( hdc, rect.left, (y - check_bitmap_height) / 2,
-		          check_bitmap_width, check_bitmap_height,
-		          hdcMem, 0, 0, SRCCOPY );
-	        DeleteDC( hdcMem );
-	    } 
-	    else if (lpitem->hUnCheckBit) 
-	    {
-	        HDC hdcMem = CreateCompatibleDC( hdc );
-
-	        SelectObject( hdcMem, lpitem->hUnCheckBit );
-	        BitBlt( hdc, rect.left, (y - check_bitmap_height) / 2,
-		          check_bitmap_width, check_bitmap_height,
-		          hdcMem, 0, 0, SRCCOPY );
-	        DeleteDC( hdcMem );
-	    }
+            HBITMAP bm = (lpitem->fState & MF_CHECKED) ? lpitem->hCheckBit : lpitem->hUnCheckBit;
+            if (bm)  /* we have a custom bitmap */
+            {
+                HDC hdcMem = CreateCompatibleDC( hdc );
+                SelectObject( hdcMem, bm );
+                BitBlt( hdc, rect.left, (y - check_bitmap_height) / 2,
+                        check_bitmap_width, check_bitmap_height,
+                        hdcMem, 0, 0, SRCCOPY );
+                DeleteDC( hdcMem );
+            }
+            else if (lpitem->fState & MF_CHECKED)  /* standard bitmaps */
+            {
+                RECT r;
+                HBITMAP bm = CreateBitmap( check_bitmap_width, check_bitmap_height, 1, 1, NULL );
+                HDC hdcMem = CreateCompatibleDC( hdc );
+                SelectObject( hdcMem, bm );
+                SetRect( &r, 0, 0, check_bitmap_width, check_bitmap_height );
+                DrawFrameControl( hdcMem, &r, DFC_MENU,
+                                  (lpitem->fType & MFT_RADIOCHECK) ?
+                                  DFCS_MENUBULLET : DFCS_MENUCHECK );
+                BitBlt( hdc, rect.left, (y - r.bottom) / 2, r.right, r.bottom,
+                        hdcMem, 0, 0, SRCCOPY );
+                DeleteDC( hdcMem );
+                DeleteObject( bm );
+            }
         }
 	
 	  /* Draw the popup-menu arrow */
@@ -3858,7 +3845,7 @@
  */
 DWORD WINAPI GetMenuCheckMarkDimensions(void)
 {
-    return MAKELONG( check_bitmap_width, check_bitmap_height );
+    return MAKELONG( GetSystemMetrics(SM_CXMENUCHECK), GetSystemMetrics(SM_CYMENUCHECK) );
 }
 
 
diff --git a/controls/uitools.c b/controls/uitools.c
index 2f73329..0c0df32 100644
--- a/controls/uitools.c
+++ b/controls/uitools.c
@@ -1044,15 +1044,18 @@
     }
 
     /* Correct for the shadow shift */
-    for(i = 0; i < Line1N; i++)
+    if (!(uFlags & DFCS_PUSHED))
     {
-        Line1[i].x--;
-        Line1[i].y--;
-    }
-    for(i = 0; i < Line2N; i++)
-    {
-        Line2[i].x--;
-        Line2[i].y--;
+        for(i = 0; i < Line1N; i++)
+        {
+            Line1[i].x--;
+            Line1[i].y--;
+        }
+        for(i = 0; i < Line2N; i++)
+        {
+            Line2[i].x--;
+            Line2[i].y--;
+        }
     }
 
     /* Make the final picture */
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 02dbfa2..7501c39 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -30,16 +30,15 @@
 
 BOOL NC_DrawGrayButton(HDC hdc, int x, int y);
 
-static HBITMAP16 hbitmapClose = 0;
-static HBITMAP16 hbitmapCloseD = 0;
-static HBITMAP16 hbitmapMinimize = 0;
-static HBITMAP16 hbitmapMinimizeD = 0;
-static HBITMAP16 hbitmapMaximize = 0;
-static HBITMAP16 hbitmapMaximizeD = 0;
-static HBITMAP16 hbitmapRestore = 0;
-static HBITMAP16 hbitmapRestoreD = 0;
+static HBITMAP hbitmapClose;
+static HBITMAP hbitmapMinimize;
+static HBITMAP hbitmapMinimizeD;
+static HBITMAP hbitmapMaximize;
+static HBITMAP hbitmapMaximizeD;
+static HBITMAP hbitmapRestore;
+static HBITMAP hbitmapRestoreD;
 
-BYTE lpGrayMask[] = { 0xAA, 0xA0,
+static const BYTE lpGrayMask[] = { 0xAA, 0xA0,
 		      0x55, 0x50,  
 		      0xAA, 0xA0,
 		      0x55, 0x50,  
@@ -1104,174 +1103,93 @@
 static void NC_DrawCloseButton95 (HWND hwnd, HDC hdc, BOOL down, BOOL bGrayed)
 {
     RECT rect;
-    HDC hdcMem;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
     if( !(wndPtr->dwExStyle & WS_EX_MANAGED) )
     {
-	BITMAP bmp;
-	HBITMAP hBmp, hOldBmp;
-
-	NC_GetInsideRect95( hwnd, &rect );
+        NC_GetInsideRect95( hwnd, &rect );
 
 	/* A tool window has a smaller Close button */
 	if(wndPtr->dwExStyle & WS_EX_TOOLWINDOW)
 	{
-            RECT toolRect;	     
             INT iBmpHeight = 11; /* Windows does not use SM_CXSMSIZE and SM_CYSMSIZE   */
-            INT iBmpWidth = 11;  /* it uses 11x11 for  the close button in tool window */ 	  	 
+            INT iBmpWidth = 11;  /* it uses 11x11 for  the close button in tool window */
             INT iCaptionHeight = GetSystemMetrics(SM_CYSMCAPTION);
 
-            toolRect.top = rect.top + (iCaptionHeight - 1 - iBmpHeight) / 2;
-            toolRect.left = rect.right - (iCaptionHeight + 1 + iBmpWidth) / 2;
-            toolRect.bottom = toolRect.top + iBmpHeight;
-            toolRect.right = toolRect.left + iBmpWidth;
-            DrawFrameControl(hdc,&toolRect,
-                             DFC_CAPTION,DFCS_CAPTIONCLOSE | 
-                             down ? DFCS_PUSHED : 0 | 
-                             bGrayed ? DFCS_INACTIVE : 0);
-	}
-	else
-	{
-            hdcMem = CreateCompatibleDC( hdc );
-            hBmp = down ? hbitmapCloseD : hbitmapClose;
-            hOldBmp = SelectObject (hdcMem, hBmp);
-            GetObjectA (hBmp, sizeof(BITMAP), &bmp);
-
-            BitBlt (hdc, rect.right - (GetSystemMetrics(SM_CYCAPTION) + 1 + bmp.bmWidth) / 2,
-                    rect.top + (GetSystemMetrics(SM_CYCAPTION) - 1 - bmp.bmHeight) / 2,
-                    bmp.bmWidth, bmp.bmHeight, hdcMem, 0, 0, SRCCOPY);
-
-            if(bGrayed)
-                NC_DrawGrayButton(hdc,rect.right - (GetSystemMetrics(SM_CYCAPTION) + 1 + bmp.bmWidth) / 2 + 2,
-                                  rect.top + (GetSystemMetrics(SM_CYCAPTION) - 1 - bmp.bmHeight) / 2 + 2);
-
-            SelectObject (hdcMem, hOldBmp);
-            DeleteDC (hdcMem);
-	}
+            rect.top = rect.top + (iCaptionHeight - 1 - iBmpHeight) / 2;
+            rect.left = rect.right - (iCaptionHeight + 1 + iBmpWidth) / 2;
+            rect.bottom = rect.top + iBmpHeight;
+            rect.right = rect.left + iBmpWidth;
+        }
+        else
+        {
+            rect.left = rect.right - GetSystemMetrics(SM_CXSIZE) - 1;
+            rect.bottom = rect.top + GetSystemMetrics(SM_CYSIZE) - 1;
+            rect.top += 2;
+            rect.right -= 2;
+        }
+        DrawFrameControl( hdc, &rect, DFC_CAPTION,
+                          (DFCS_CAPTIONCLOSE |
+                           (down ? DFCS_PUSHED : 0) |
+                           (bGrayed ? DFCS_INACTIVE : 0)) );
     }
     WIN_ReleaseWndPtr(wndPtr);
 }
 
 /******************************************************************************
- *
- *   NC_DrawMaxButton95(
- *      HWND  hwnd,
- *      HDC16  hdc,
- *      BOOL  down 
- *      BOOL    bGrayed )
+ *   NC_DrawMaxButton95
  *
  *   Draws the maximize button for Win95 style windows.
- *
  *   If bGrayed is true, then draw a disabled Maximize button
- *
- *   Bugs
- *        Many.  Spacing might still be incorrect.  Need to fit a close
- *        button between the max button and the edge.
- *        Should scale the image with the title bar.  And more...
- *
- *   Revision history
- *        05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
- *             Original implementation.
- *
- *****************************************************************************/
-
+ */
 static void NC_DrawMaxButton95(HWND hwnd,HDC16 hdc,BOOL down, BOOL bGrayed)
 {
     RECT rect;
-    HDC hdcMem;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
     if( !(wndPtr->dwExStyle & WS_EX_MANAGED))
     {
-        BITMAP  bmp;
-        HBITMAP  hBmp,hOldBmp;
-
-	NC_GetInsideRect95( hwnd, &rect );
-	hdcMem = CreateCompatibleDC( hdc );
-	hBmp = IsZoomed(hwnd) ?
-	    (down ? hbitmapRestoreD : hbitmapRestore ) :
-	    (down ? hbitmapMaximizeD: hbitmapMaximize);
-	hOldBmp=SelectObject( hdcMem, hBmp );
-	GetObjectA (hBmp, sizeof(BITMAP), &bmp);
-	
-	if (wndPtr->dwStyle & WS_SYSMENU)
-	    rect.right -= GetSystemMetrics(SM_CYCAPTION) + 1;
-	
-	BitBlt( hdc, rect.right - (GetSystemMetrics(SM_CXSIZE) + bmp.bmWidth) / 2,
-		  rect.top + (GetSystemMetrics(SM_CYCAPTION) - 1 - bmp.bmHeight) / 2,
-		  bmp.bmWidth, bmp.bmHeight, hdcMem, 0, 0, SRCCOPY );
-	
-	if(bGrayed)
-	    NC_DrawGrayButton(hdc, rect.right - (GetSystemMetrics(SM_CXSIZE) + bmp.bmWidth) / 2 + 2,
-			      rect.top + (GetSystemMetrics(SM_CYCAPTION) - 1 - bmp.bmHeight) / 2 + 2);
-	    
-	
-	SelectObject (hdcMem, hOldBmp);
-	DeleteDC( hdcMem );
+        UINT flags = IsZoomed(hwnd) ? DFCS_CAPTIONRESTORE : DFCS_CAPTIONMAX;
+        NC_GetInsideRect95( hwnd, &rect );
+        if (wndPtr->dwStyle & WS_SYSMENU)
+            rect.right -= GetSystemMetrics(SM_CXSIZE) + 1;
+        rect.left = rect.right - GetSystemMetrics(SM_CXSIZE);
+        rect.bottom = rect.top + GetSystemMetrics(SM_CYSIZE) - 1;
+        rect.top += 2;
+        rect.right -= 2;
+        if (down) flags |= DFCS_PUSHED;
+        if (bGrayed) flags |= DFCS_INACTIVE;
+        DrawFrameControl( hdc, &rect, DFC_CAPTION, flags );
     }
     WIN_ReleaseWndPtr(wndPtr);
 }
 
 /******************************************************************************
- *
- *   NC_DrawMinButton95(
- *      HWND  hwnd,
- *      HDC16  hdc,
- *      BOOL  down,
- *      BOOL    bGrayed )
+ *   NC_DrawMinButton95
  *
  *   Draws the minimize button for Win95 style windows.
- *
  *   If bGrayed is true, then draw a disabled Minimize button
- *
- *   Bugs
- *        Many.  Spacing is still incorrect.  Should scale the image with the
- *        title bar.  And more...
- *
- *   Revision history
- *        05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
- *             Original implementation.
- *
- *****************************************************************************/
-
+ */
 static void  NC_DrawMinButton95(HWND hwnd,HDC16 hdc,BOOL down, BOOL bGrayed)
 {
     RECT rect;
-    HDC hdcMem;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
     if( !(wndPtr->dwExStyle & WS_EX_MANAGED))
-        
     {
-       BITMAP  bmp;
-       HBITMAP  hBmp,hOldBmp;
-	
-	NC_GetInsideRect95( hwnd, &rect );
-
-       hdcMem = CreateCompatibleDC( hdc );
-       hBmp = down ? hbitmapMinimizeD : hbitmapMinimize;
-       hOldBmp= SelectObject( hdcMem, hBmp );
-	GetObjectA (hBmp, sizeof(BITMAP), &bmp);
-
-	if (wndPtr->dwStyle & WS_SYSMENU)
-	    rect.right -= GetSystemMetrics(SM_CYCAPTION) + 1;
-
-	/* In win 95 there is always a Maximize box when there is a Minimize one */
-	if ((wndPtr->dwStyle & WS_MAXIMIZEBOX) || (wndPtr->dwStyle & WS_MINIMIZEBOX)) 
-	    rect.right += -1 - (GetSystemMetrics(SM_CXSIZE) + bmp.bmWidth) / 2;
-
-	BitBlt( hdc, rect.right - (GetSystemMetrics(SM_CXSIZE) + bmp.bmWidth) / 2,
-		  rect.top + (GetSystemMetrics(SM_CYCAPTION) - 1 - bmp.bmHeight) / 2,
-		  bmp.bmWidth, bmp.bmHeight, hdcMem, 0, 0, SRCCOPY );
-
-	if(bGrayed)
-	    NC_DrawGrayButton(hdc, rect.right - (GetSystemMetrics(SM_CXSIZE) + bmp.bmWidth) / 2 + 2,
-			      rect.top + (GetSystemMetrics(SM_CYCAPTION) - 1 - bmp.bmHeight) / 2 + 2);
-			  
-	
-       SelectObject (hdcMem, hOldBmp);
-       DeleteDC( hdcMem );
+        UINT flags = DFCS_CAPTIONMIN;
+        NC_GetInsideRect95( hwnd, &rect );
+        if (wndPtr->dwStyle & WS_SYSMENU)
+            rect.right -= GetSystemMetrics(SM_CXSIZE) + 1;
+        if (wndPtr->dwStyle & (WS_MAXIMIZEBOX|WS_MINIMIZEBOX))
+            rect.right -= GetSystemMetrics(SM_CXSIZE) - 2;
+        rect.left = rect.right - GetSystemMetrics(SM_CXSIZE);
+        rect.bottom = rect.top + GetSystemMetrics(SM_CYSIZE) - 1;
+        rect.top += 2;
+        rect.right -= 2;
+        if (down) flags |= DFCS_PUSHED;
+        if (bGrayed) flags |= DFCS_INACTIVE;
+        DrawFrameControl( hdc, &rect, DFC_CAPTION, flags );
     }
     WIN_ReleaseWndPtr(wndPtr);
 }
@@ -1468,7 +1386,6 @@
             WIN_ReleaseWndPtr(wndPtr);
 	    return;
         }
-	hbitmapCloseD    = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_CLOSED) );
 	hbitmapMinimize  = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_REDUCE) );
 	hbitmapMinimizeD = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_REDUCED) );
 	hbitmapMaximize  = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_ZOOM) );
@@ -1577,18 +1494,6 @@
     FillRect( hdc, &r, GetSysColorBrush(active ? COLOR_ACTIVECAPTION :
 					    COLOR_INACTIVECAPTION) );
 
-    if (!hbitmapClose) {
-	if (!(hbitmapClose = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_CLOSE) )))
-	    return;
-        hbitmapCloseD = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_CLOSED));
-	hbitmapMinimize  = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_REDUCE) );
-	hbitmapMinimizeD = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_REDUCED) );
-	hbitmapMaximize  = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_ZOOM) );
-	hbitmapMaximizeD = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_ZOOMD) );
-	hbitmapRestore   = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_RESTORE) );
-	hbitmapRestoreD  = LoadBitmapA( 0, MAKEINTRESOURCEA(OBM_RESTORED) );
-    }
-    
     if ((style & WS_SYSMENU) && !(exStyle & WS_EX_TOOLWINDOW)) {
 	if (NC_DrawSysButton95 (hwnd, hdc, FALSE))
 	    r.left += GetSystemMetrics(SM_CYCAPTION) - 1;
diff --git a/windows/sysmetrics.c b/windows/sysmetrics.c
index 9fc7fd2..cdf59c0 100644
--- a/windows/sysmetrics.c
+++ b/windows/sysmetrics.c
@@ -154,8 +154,8 @@
     sysMetrics[SM_CXDRAG] = 2;
     sysMetrics[SM_CYDRAG] = 2;
     sysMetrics[SM_SHOWSOUNDS] = 0;
-    sysMetrics[SM_CXMENUCHECK] = 2;
-    sysMetrics[SM_CYMENUCHECK] = 2;
+    sysMetrics[SM_CXMENUCHECK] = 14;
+    sysMetrics[SM_CYMENUCHECK] = 14;
 
     /* FIXME: Should check the type of processor for the following */
     sysMetrics[SM_SLOWMACHINE] = 0;