From c1d35ccd9b243da7b4c205cad6c1fc2e54ef1e71 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 24 Jan 2001 19:47:57 +0000 Subject: [PATCH] Use DrawFrameControl() instead of OEM bitmaps to paint caption buttons and menu check marks. --- controls/menu.c | 71 +++++++-------- controls/uitools.c | 19 ++-- windows/nonclient.c | 203 ++++++++++++------------------------------- windows/sysmetrics.c | 4 +- 4 files changed, 96 insertions(+), 201 deletions(-) diff --git a/controls/menu.c b/controls/menu.c index 43936be1c2f..6a79f6f9abf 100644 --- a/controls/menu.c +++ b/controls/menu.c @@ -146,11 +146,8 @@ typedef struct #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 @@ BOOL MENU_Init() 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 @@ BOOL MENU_Init() 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 @@ static void MENU_CalcItemSize( HDC hdc, MENUITEM *lpitem, HWND hwndOwner, 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 @@ static void MENU_DrawMenuItem( HWND hwnd, HMENU hmenu, HWND hwndOwner, HDC hdc, 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 @@ static void MENU_DrawMenuItem( HWND hwnd, HMENU hmenu, HWND hwndOwner, HDC hdc, * 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 @@ HMENU WINAPI CreatePopupMenu(void) */ 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 2f7332918da..0c0df3241c9 100644 --- a/controls/uitools.c +++ b/controls/uitools.c @@ -1044,15 +1044,18 @@ static BOOL UITOOLS95_DrawFrameCaption(HDC dc, LPRECT r, UINT uFlags) } /* 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 02dbfa21ea6..7501c396b2f 100644 --- a/windows/nonclient.c +++ b/windows/nonclient.c @@ -30,16 +30,15 @@ DECLARE_DEBUG_CHANNEL(shell); 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 @@ NC_DrawSysButton95 (HWND hwnd, HDC hdc, BOOL down) 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 @@ static void NC_DrawCaption( HDC hdc, RECT *rect, HWND hwnd, 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 @@ static void NC_DrawCaption95( 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 9fc7fd2eb4f..cdf59c07a1a 100644 --- a/windows/sysmetrics.c +++ b/windows/sysmetrics.c @@ -154,8 +154,8 @@ void SYSMETRICS_Init(void) 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;