https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1e91a1690d554c771d703…
commit 1e91a1690d554c771d703f12416321bbe4c5b53f
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Thu Jul 25 01:40:33 2019 +0900
Commit: GitHub <noreply(a)github.com>
CommitDate: Thu Jul 25 01:40:33 2019 +0900
[USER32][NTUSER] Fix menu arrow drawing (of DrawFrameControl) (#1752)
CORE-13211
user32!DrawFrameControl drawed invalid menu arrow when the width is shorter than the
height.
- Use the squared rectangle.
- Draw it in the transparent background mode.
- Save the old background mode of HDC.
This PR will fix UltraISO's bug.
---
win32ss/user/ntuser/draw.c | 46 ++++++++++++++++++++++++--------------
win32ss/user/user32/windows/draw.c | 12 +++++++---
2 files changed, 38 insertions(+), 20 deletions(-)
diff --git a/win32ss/user/ntuser/draw.c b/win32ss/user/ntuser/draw.c
index f648287c554..4b30a325a86 100644
--- a/win32ss/user/ntuser/draw.c
+++ b/win32ss/user/ntuser/draw.c
@@ -666,7 +666,10 @@ BOOL FASTCALL UITOOLS95_DFC_ButtonCheckRadio(HDC dc, LPRECT r, UINT
uFlags, BOOL
HFONT hFont, hOldFont;
int i;
WCHAR OutRight, OutLeft, InRight, InLeft, Center;
+ RECT myr;
+ INT cxy, nBkMode;
+ cxy = UITOOLS_MakeSquareRect(r, &myr);
if (Radio)
{
OutRight = 'j'; // Outer right
@@ -684,7 +687,7 @@ BOOL FASTCALL UITOOLS95_DFC_ButtonCheckRadio(HDC dc, LPRECT r, UINT
uFlags, BOOL
}
RtlZeroMemory(&lf, sizeof(LOGFONTW));
- lf.lfHeight = r->top - r->bottom;
+ lf.lfHeight = cxy;
lf.lfWidth = 0;
lf.lfWeight = FW_NORMAL;
lf.lfCharSet = DEFAULT_CHARSET;
@@ -692,16 +695,18 @@ BOOL FASTCALL UITOOLS95_DFC_ButtonCheckRadio(HDC dc, LPRECT r, UINT
uFlags, BOOL
hFont = GreCreateFontIndirectW(&lf);
hOldFont = NtGdiSelectFont(dc, hFont);
+ nBkMode = GreGetBkMode(dc);
+
if(Radio && ((uFlags & 0xff) == DFCS_BUTTONRADIOMASK))
{
IntGdiSetBkMode(dc, OPAQUE);
IntGdiSetTextColor(dc, IntGetSysColor(COLOR_WINDOWFRAME));
- GreTextOutW(dc, r->left, r->top, &Center, 1);
+ GreTextOutW(dc, myr.left, myr.top, &Center, 1);
IntGdiSetBkMode(dc, TRANSPARENT);
IntGdiSetTextColor(dc, IntGetSysColor(COLOR_WINDOWFRAME));
- GreTextOutW(dc, r->left, r->top, &OutRight, 1);
+ GreTextOutW(dc, myr.left, myr.top, &OutRight, 1);
IntGdiSetTextColor(dc, IntGetSysColor(COLOR_WINDOWFRAME));
- GreTextOutW(dc, r->left, r->top, &OutLeft, 1);
+ GreTextOutW(dc, myr.left, myr.top, &OutLeft, 1);
}
else
{
@@ -710,26 +715,26 @@ BOOL FASTCALL UITOOLS95_DFC_ButtonCheckRadio(HDC dc, LPRECT r, UINT
uFlags, BOOL
/* Center section, white for active, grey for inactive */
i= !(uFlags & (DFCS_INACTIVE|DFCS_PUSHED)) ? COLOR_WINDOW : COLOR_BTNFACE;
IntGdiSetTextColor(dc, IntGetSysColor(i));
- GreTextOutW(dc, r->left, r->top, &Center, 1);
+ GreTextOutW(dc, myr.left, myr.top, &Center, 1);
if(uFlags & (DFCS_FLAT | DFCS_MONO))
{
IntGdiSetTextColor(dc, IntGetSysColor(COLOR_WINDOWFRAME));
- GreTextOutW(dc, r->left, r->top, &OutRight, 1);
- GreTextOutW(dc, r->left, r->top, &OutLeft, 1);
- GreTextOutW(dc, r->left, r->top, &InRight, 1);
- GreTextOutW(dc, r->left, r->top, &InLeft, 1);
+ GreTextOutW(dc, myr.left, myr.top, &OutRight, 1);
+ GreTextOutW(dc, myr.left, myr.top, &OutLeft, 1);
+ GreTextOutW(dc, myr.left, myr.top, &InRight, 1);
+ GreTextOutW(dc, myr.left, myr.top, &InLeft, 1);
}
else
{
IntGdiSetTextColor(dc, IntGetSysColor(COLOR_BTNSHADOW));
- GreTextOutW(dc, r->left, r->top, &OutRight, 1);
+ GreTextOutW(dc, myr.left, myr.top, &OutRight, 1);
IntGdiSetTextColor(dc, IntGetSysColor(COLOR_BTNHIGHLIGHT));
- GreTextOutW(dc, r->left, r->top, &OutLeft, 1);
+ GreTextOutW(dc, myr.left, myr.top, &OutLeft, 1);
IntGdiSetTextColor(dc, IntGetSysColor(COLOR_3DDKSHADOW));
- GreTextOutW(dc, r->left, r->top, &InRight, 1);
+ GreTextOutW(dc, myr.left, myr.top, &InRight, 1);
IntGdiSetTextColor(dc, IntGetSysColor(COLOR_3DLIGHT));
- GreTextOutW(dc, r->left, r->top, &InLeft, 1);
+ GreTextOutW(dc, myr.left, myr.top, &InLeft, 1);
}
}
@@ -738,12 +743,13 @@ BOOL FASTCALL UITOOLS95_DFC_ButtonCheckRadio(HDC dc, LPRECT r, UINT
uFlags, BOOL
WCHAR Check = (Radio) ? 'i' : 'b';
IntGdiSetTextColor(dc, IntGetSysColor(COLOR_WINDOWTEXT));
- GreTextOutW(dc, r->left, r->top, &Check, 1);
+ GreTextOutW(dc, myr.left, myr.top, &Check, 1);
}
IntGdiSetTextColor(dc, IntGetSysColor(COLOR_WINDOWTEXT));
NtGdiSelectFont(dc, hOldFont);
GreDeleteObject(hFont);
+ IntGdiSetBkMode(dc, nBkMode);
return TRUE;
}
@@ -944,9 +950,13 @@ 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;
+ RECT myr;
+ INT cxy, nBkMode;
+ cxy = UITOOLS_MakeSquareRect(r, &myr);
switch(uFlags & 0xff)
{
case DFCS_MENUARROWUP:
@@ -981,7 +991,7 @@ BOOL FASTCALL UITOOLS95_DrawFrameMenu(HDC dc, LPRECT r, UINT uFlags)
}
/* acquire ressources only if valid menu */
RtlZeroMemory(&lf, sizeof(LOGFONTW));
- lf.lfHeight = r->bottom - r->top;
+ lf.lfHeight = cxy;
lf.lfWidth = 0;
lf.lfWeight = FW_NORMAL;
lf.lfCharSet = DEFAULT_CHARSET;
@@ -998,13 +1008,15 @@ BOOL FASTCALL UITOOLS95_DrawFrameMenu(HDC dc, LPRECT r, UINT
uFlags)
{
/* draw shadow */
IntGdiSetTextColor(dc, IntGetSysColor(COLOR_BTNHIGHLIGHT));
- GreTextOutW(dc, r->left + 1, r->top + 1, &Symbol, 1);
+ GreTextOutW(dc, myr.left + 1, myr.top + 1, &Symbol, 1);
}
#endif
IntGdiSetTextColor(dc, IntGetSysColor((uFlags & DFCS_INACTIVE) ?
COLOR_BTNSHADOW : COLOR_BTNTEXT));
}
/* draw selected symbol */
- GreTextOutW(dc, r->left, r->top, &Symbol, 1);
+ nBkMode = IntGdiSetBkMode(dc, TRANSPARENT);
+ GreTextOutW(dc, myr.left, myr.top, &Symbol, 1);
+ IntGdiSetBkMode(dc, nBkMode);
/* restore previous settings */
NtGdiSelectFont(dc, hOldFont);
GreDeleteObject(hFont);
diff --git a/win32ss/user/user32/windows/draw.c b/win32ss/user/user32/windows/draw.c
index 40e65db6e70..65bacc848d8 100644
--- a/win32ss/user/user32/windows/draw.c
+++ b/win32ss/user/user32/windows/draw.c
@@ -972,9 +972,13 @@ 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;
+ RECT myr;
+ INT cxy, nBkMode;
+ cxy = UITOOLS_MakeSquareRect(r, &myr);
switch(uFlags & 0xff)
{
case DFCS_MENUARROWUP:
@@ -1007,7 +1011,7 @@ static BOOL UITOOLS95_DrawFrameMenu(HDC dc, LPRECT r, UINT uFlags)
}
/* acquire ressources only if valid menu */
ZeroMemory(&lf, sizeof(LOGFONTW));
- lf.lfHeight = r->bottom - r->top;
+ lf.lfHeight = cxy;
lf.lfWidth = 0;
lf.lfWeight = FW_NORMAL;
lf.lfCharSet = DEFAULT_CHARSET;
@@ -1024,13 +1028,15 @@ static BOOL UITOOLS95_DrawFrameMenu(HDC dc, LPRECT r, UINT
uFlags)
{
/* draw shadow */
SetTextColor(dc, GetSysColor(COLOR_BTNHIGHLIGHT));
- TextOut(dc, r->left + 1, r->top + 1, &Symbol, 1);
+ TextOut(dc, myr.left + 1, myr.top + 1, &Symbol, 1);
}
#endif
SetTextColor(dc, GetSysColor((uFlags & DFCS_INACTIVE) ? COLOR_BTNSHADOW :
COLOR_BTNTEXT));
}
/* draw selected symbol */
- TextOut(dc, r->left, r->top, &Symbol, 1);
+ nBkMode = SetBkMode(dc, TRANSPARENT);
+ TextOut(dc, myr.left, myr.top, &Symbol, 1);
+ SetBkMode(dc, nBkMode);
/* restore previous settings */
SelectObject(dc, hOldFont);
DeleteObject(hFont);