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;