Zhiyi Zhang : comctl32/button: Support image list margin for buttons with BS_CENTER or BS_VCENTER.

Alexandre Julliard julliard at winehq.org
Tue Apr 12 13:38:03 CDT 2022


Module: wine
Branch: oldstable
Commit: d0b9ab2b91bc202df03691efa479fd8100b18914
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=d0b9ab2b91bc202df03691efa479fd8100b18914

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Thu Dec  9 16:13:13 2021 +0800

comctl32/button: Support image list margin for buttons with BS_CENTER or BS_VCENTER.

WinSCP uses image list margin to adjust image position on a button when theming is on.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52076
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit feb0b73a3c7281dee923cdcfb5ebf4ae954cdc7b)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/comctl32/button.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/dlls/comctl32/button.c b/dlls/comctl32/button.c
index 67bf5ceae48..5e16fdb0e08 100644
--- a/dlls/comctl32/button.c
+++ b/dlls/comctl32/button.c
@@ -1125,7 +1125,10 @@ static void BUTTON_PositionRect(LONG style, const RECT *outerRect, RECT *innerRe
     switch (style & BS_CENTER)
     {
     case BS_CENTER:
-        innerRect->left = outerRect->left + (outerRect->right - outerRect->left - width) / 2;
+        /* The left and right margins are added to the inner rectangle to get a new rectangle. Then
+         * the new rectangle is adjusted to be in the horizontal center */
+        innerRect->left = outerRect->left + (outerRect->right - outerRect->left - width
+                                             + margin->left - margin->right) / 2;
         innerRect->right = innerRect->left + width;
         break;
     case BS_RIGHT:
@@ -1151,7 +1154,10 @@ static void BUTTON_PositionRect(LONG style, const RECT *outerRect, RECT *innerRe
         break;
     case BS_VCENTER:
     default:
-        innerRect->top = outerRect->top + (outerRect->bottom - outerRect->top - height) / 2;
+        /* The top and bottom margins are added to the inner rectangle to get a new rectangle. Then
+         * the new rectangle is adjusted to be in the vertical center */
+        innerRect->top = outerRect->top + (outerRect->bottom - outerRect->top - height
+                                           + margin->top - margin->bottom) / 2;
         innerRect->bottom = innerRect->top + height;
         break;
     }




More information about the wine-cvs mailing list