https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1e91a1690d554c771d703f12416321bbe4c5b53f

commit 1e91a1690d554c771d703f12416321bbe4c5b53f
Author:     Katayama Hirofumi MZ <[email protected]>
AuthorDate: Thu Jul 25 01:40:33 2019 +0900
Commit:     GitHub <[email protected]>
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);

Reply via email to