https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1e91a1690d554c771d703f...
commit 1e91a1690d554c771d703f12416321bbe4c5b53f Author: Katayama Hirofumi MZ katayama.hirofumi.mz@gmail.com AuthorDate: Thu Jul 25 01:40:33 2019 +0900 Commit: GitHub noreply@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);