[NTUSER][USER32] Improve DrawFrameControl:DFC_MENU and DFC_BUTTON (#4783)

A retrial of 13868ee (#4779).
- Fill the background if necessary, and set the text color and the back mode in DrawFrameControl:DFC_MENU.
- Use UITOOLS95_DrawFrameMenu in menu drawing instead of DrawFrameControl.
CORE-18515, CORE-18417
This commit is contained in:
Katayama Hirofumi MZ 2022-10-17 13:28:56 +09:00 committed by GitHub
parent 227e596f68
commit ac0a0adc51
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 70 additions and 17 deletions

View file

@ -769,13 +769,18 @@ BOOL FASTCALL UITOOLS95_DrawFrameButton(HDC hdc, LPRECT rc, UINT uState)
case DFCS_BUTTONRADIOIMAGE:
case DFCS_BUTTONRADIOMASK:
if (uState & DFCS_BUTTONRADIOIMAGE)
FillRect(hdc, rc, (HBRUSH)NtGdiGetStockObject(BLACK_BRUSH)); /* Fill by black */
else
FillRect(hdc, rc, (HBRUSH)NtGdiGetStockObject(WHITE_BRUSH)); /* Fill by white */
return UITOOLS95_DFC_ButtonCheckRadio(hdc, rc, uState, TRUE);
case DFCS_BUTTONRADIO:
return UITOOLS95_DFC_ButtonCheckRadio(hdc, rc, uState, TRUE);
default:
ERR("Invalid button state=0x%04x\n", uState);
}
return FALSE;
}
@ -953,7 +958,6 @@ BOOL FASTCALL UITOOLS95_DrawFrameScroll(HDC dc, LPRECT r, UINT uFlags)
BOOL FASTCALL UITOOLS95_DrawFrameMenu(HDC dc, LPRECT r, UINT uFlags)
{
// TODO: DFCS_TRANSPARENT upon DFCS_MENUARROWUP or DFCS_MENUARROWDOWN
LOGFONTW lf;
HFONT hFont, hOldFont;
WCHAR Symbol;
@ -983,6 +987,7 @@ BOOL FASTCALL UITOOLS95_DrawFrameMenu(HDC dc, LPRECT r, UINT uFlags)
break;
case DFCS_MENUCHECK:
case DFCS_MENUCHECK | DFCS_MENUBULLET:
Symbol = 'a';
break;
@ -1098,7 +1103,28 @@ DrawFrameControl(HDC hDC, LPRECT rc, UINT uType, UINT uState)
case DFC_CAPTION:
return UITOOLS95_DrawFrameCaption(hDC, rc, uState);
case DFC_MENU:
return UITOOLS95_DrawFrameMenu(hDC, rc, uState);
{
BOOL ret;
COLORREF rgbOldText;
INT iOldBackMode;
if (uState & (DFCS_MENUARROWUP | DFCS_MENUARROWDOWN))
{
if (!(uState & DFCS_TRANSPARENT))
FillRect(hDC, rc, IntGetSysColorBrush(COLOR_MENU)); /* Fill by menu color */
}
else
{
FillRect(hDC, rc, (HBRUSH)NtGdiGetStockObject(WHITE_BRUSH)); /* Fill by white */
}
rgbOldText = IntGdiSetTextColor(hDC, RGB(0, 0, 0)); /* Draw by black */
iOldBackMode = IntGdiSetBkMode(hDC, TRANSPARENT);
ret = UITOOLS95_DrawFrameMenu(hDC, rc, uState);
IntGdiSetBkMode(hDC, iOldBackMode);
IntGdiSetTextColor(hDC, rgbOldText);
return ret;
}
#if 0
case DFC_POPUPMENU:
UNIMPLEMENTED;

View file

@ -11,6 +11,8 @@ DBG_DEFAULT_CHANNEL(UserMenu);
/* INTERNAL ******************************************************************/
BOOL FASTCALL UITOOLS95_DrawFrameMenu(HDC dc, LPRECT r, UINT uFlags); /* draw.c */
HFONT ghMenuFont = NULL;
HFONT ghMenuFontBold = NULL;
static SIZE MenuCharSize;
@ -2186,14 +2188,14 @@ static void MENU_DrawScrollArrows(PMENU lppop, HDC hdc)
rect.right = lppop->cxMenu;
rect.bottom = arrow_bitmap_height;
FillRect(hdc, &rect, IntGetSysColorBrush(COLOR_MENU));
DrawFrameControl(hdc, &rect, DFC_MENU, (lppop->iTop ? 0 : DFCS_INACTIVE)|DFCS_MENUARROWUP);
UITOOLS95_DrawFrameMenu(hdc, &rect, (lppop->iTop ? 0 : DFCS_INACTIVE) | DFCS_MENUARROWUP);
rect.top = lppop->cyMenu - arrow_bitmap_height;
rect.bottom = lppop->cyMenu;
FillRect(hdc, &rect, IntGetSysColorBrush(COLOR_MENU));
if (!(lppop->iTop < lppop->iMaxTop - (MENU_GetMaxPopupHeight(lppop) - 2 * arrow_bitmap_height)))
Flags = DFCS_INACTIVE;
DrawFrameControl(hdc, &rect, DFC_MENU, Flags|DFCS_MENUARROWDOWN);
UITOOLS95_DrawFrameMenu(hdc, &rect, Flags | DFCS_MENUARROWDOWN);
}
/***********************************************************************
@ -2308,7 +2310,7 @@ static void FASTCALL MENU_DrawMenuItem(PWND Wnd, PMENU Menu, PWND WndOwner, HDC
RECT rectTemp;
RtlCopyMemory(&rectTemp, &rect, sizeof(RECT));
rectTemp.left = rectTemp.right - UserGetSystemMetrics(SM_CXMENUCHECK);
DrawFrameControl(hdc, &rectTemp, DFC_MENU, DFCS_MENUARROW);
UITOOLS95_DrawFrameMenu(hdc, &rectTemp, DFCS_MENUARROW);
}
return;
}
@ -2452,9 +2454,9 @@ static void FASTCALL MENU_DrawMenuItem(PWND Wnd, PMENU Menu, PWND WndOwner, HDC
RECT r;
r = rect;
r.right = r.left + check_bitmap_width;
DrawFrameControl( hdc, &r, DFC_MENU,
(lpitem->fType & MFT_RADIOCHECK) ?
DFCS_MENUBULLET : DFCS_MENUCHECK);
UITOOLS95_DrawFrameMenu(hdc, &r,
(lpitem->fType & MFT_RADIOCHECK) ?
DFCS_MENUBULLET : DFCS_MENUCHECK);
checked = TRUE;
}
}
@ -2475,7 +2477,7 @@ static void FASTCALL MENU_DrawMenuItem(PWND Wnd, PMENU Menu, PWND WndOwner, HDC
RECT rectTemp;
RtlCopyMemory(&rectTemp, &rect, sizeof(RECT));
rectTemp.left = rectTemp.right - check_bitmap_width;
DrawFrameControl(hdc, &rectTemp, DFC_MENU, DFCS_MENUARROW);
UITOOLS95_DrawFrameMenu(hdc, &rectTemp, DFCS_MENUARROW);
}
rect.left += 4;
if( !((Menu->fFlags & MNS_STYLE_MASK) & MNS_NOCHECK))

View file

@ -6,7 +6,7 @@
* Copyright 2003 Andrew Greenwood
* Copyright 2003 Filip Navara
* Copyright 2009 Matthias Kupfer
* Copyright 2017 Katayama Hirofumi MZ
* Copyright 2017-2022 Katayama Hirofumi MZ
*
* Based on Wine code.
*
@ -704,7 +704,6 @@ static BOOL UITOOLS95_DFC_ButtonCheckRadio(HDC dc, LPRECT r, UINT uFlags, BOOL R
// FIXME: improve font rendering
RECT Rect;
HGDIOBJ hbrOld, hpenOld;
FillRect(dc, r, (HBRUSH)GetStockObject(WHITE_BRUSH));
SetRect(&Rect, X, Y, X + Shorter, Y + Shorter);
InflateRect(&Rect, -(Shorter * 8) / 54, -(Shorter * 8) / 54);
hbrOld = SelectObject(dc, GetStockObject(BLACK_BRUSH));
@ -788,13 +787,18 @@ static BOOL UITOOLS95_DrawFrameButton(HDC hdc, LPRECT rc, UINT uState)
case DFCS_BUTTONRADIOIMAGE:
case DFCS_BUTTONRADIOMASK:
if (uState & DFCS_BUTTONRADIOIMAGE)
FillRect(hdc, rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); /* Fill by black */
else
FillRect(hdc, rc, (HBRUSH)GetStockObject(WHITE_BRUSH)); /* Fill by white */
return UITOOLS95_DFC_ButtonCheckRadio(hdc, rc, uState, TRUE);
case DFCS_BUTTONRADIO:
return UITOOLS95_DFC_ButtonCheckRadio(hdc, rc, uState, TRUE);
default:
ERR("Invalid button state=0x%04x\n", uState);
}
return FALSE;
@ -972,7 +976,6 @@ static BOOL UITOOLS95_DrawFrameScroll(HDC dc, LPRECT r, UINT uFlags)
static BOOL UITOOLS95_DrawFrameMenu(HDC dc, LPRECT r, UINT uFlags)
{
// TODO: DFCS_TRANSPARENT upon DFCS_MENUARROWUP or DFCS_MENUARROWDOWN
LOGFONTW lf;
HFONT hFont, hOldFont;
TCHAR Symbol;
@ -1002,6 +1005,7 @@ static BOOL UITOOLS95_DrawFrameMenu(HDC dc, LPRECT r, UINT uFlags)
break;
case DFCS_MENUCHECK:
case DFCS_MENUCHECK | DFCS_MENUBULLET:
Symbol = 'a';
break;
@ -1428,7 +1432,28 @@ RealDrawFrameControl(HDC hDC, LPRECT rc, UINT uType, UINT uState)
case DFC_CAPTION:
return UITOOLS95_DrawFrameCaption(hDC, rc, uState);
case DFC_MENU:
return UITOOLS95_DrawFrameMenu(hDC, rc, uState);
{
BOOL ret;
COLORREF rgbOldText;
INT iOldBackMode;
if (uState & (DFCS_MENUARROWUP | DFCS_MENUARROWDOWN))
{
if (!(uState & DFCS_TRANSPARENT))
FillRect(hDC, rc, (HBRUSH)(COLOR_MENU + 1)); /* Fill by menu color */
}
else
{
FillRect(hDC, rc, (HBRUSH)GetStockObject(WHITE_BRUSH)); /* Fill by white */
}
rgbOldText = SetTextColor(hDC, RGB(0, 0, 0)); /* Draw by black */
iOldBackMode = SetBkMode(hDC, TRANSPARENT);
ret = UITOOLS95_DrawFrameMenu(hDC, rc, uState);
SetBkMode(hDC, iOldBackMode);
SetTextColor(hDC, rgbOldText);
return ret;
}
#if 0
case DFC_POPUPMENU:
UNIMPLEMENTED;