Zhiyi Zhang : comctl32/button: Implement BCM_{GET, SET}IMAGELIST message.

Alexandre Julliard julliard at winehq.org
Wed Apr 4 15:08:02 CDT 2018


Module: wine
Branch: master
Commit: 0d4940b732f40ad7325b8ab61baee001b5d5e69e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=0d4940b732f40ad7325b8ab61baee001b5d5e69e

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Wed Apr  4 10:50:18 2018 +0800

comctl32/button: Implement BCM_{GET,SET}IMAGELIST message.

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/comctl32/button.c       | 42 +++++++++++++++-------
 dlls/comctl32/tests/button.c | 86 ++++++++++++++++++++++++++++++++++++++++++++
 include/commctrl.h           |  4 +++
 3 files changed, 119 insertions(+), 13 deletions(-)

diff --git a/dlls/comctl32/button.c b/dlls/comctl32/button.c
index 46a6ff4..1c6fd62 100644
--- a/dlls/comctl32/button.c
+++ b/dlls/comctl32/button.c
@@ -29,9 +29,7 @@
  *  - WM_NCCREATE: Turns any BS_OWNERDRAW button into a BS_PUSHBUTTON button.
  *  - WM_SYSKEYUP
  *  - BCM_GETIDEALSIZE
- *  - BCM_GETIMAGELIST
  *  - BCM_GETTEXTMARGIN
- *  - BCM_SETIMAGELIST
  *  - BCM_SETTEXTMARGIN
  *
  *  Notifications
@@ -45,12 +43,9 @@
  *  - NM_CUSTOMDRAW
  *
  *  Structures/Macros/Definitions
- *  - BUTTON_IMAGELIST
  *  - NMBCHOTITEM
  *  - Button_GetIdealSize
- *  - Button_GetImageList
  *  - Button_GetTextMargin
- *  - Button_SetImageList
  *  - Button_SetTextMargin
  */
 
@@ -89,14 +84,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(button);
 
 typedef struct _BUTTON_INFO
 {
-    HWND        hwnd;
-    HWND        parent;
-    LONG        style;
-    LONG        state;
-    HFONT       font;
-    WCHAR      *note;
-    INT         note_length;
-    DWORD       image_type; /* IMAGE_BITMAP or IMAGE_ICON */
+    HWND             hwnd;
+    HWND             parent;
+    LONG             style;
+    LONG             state;
+    HFONT            font;
+    WCHAR           *note;
+    INT              note_length;
+    DWORD            image_type; /* IMAGE_BITMAP or IMAGE_ICON */
+    BUTTON_IMAGELIST imagelist;
     union
     {
         HICON   icon;
@@ -728,6 +724,26 @@ static LRESULT CALLBACK BUTTON_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, L
     case BM_GETIMAGE:
         return (LRESULT)infoPtr->u.image;
 
+    case BCM_SETIMAGELIST:
+    {
+        BUTTON_IMAGELIST *imagelist = (BUTTON_IMAGELIST *)lParam;
+
+        if (!imagelist) return FALSE;
+
+        infoPtr->imagelist = *imagelist;
+        return TRUE;
+    }
+
+    case BCM_GETIMAGELIST:
+    {
+        BUTTON_IMAGELIST *imagelist = (BUTTON_IMAGELIST *)lParam;
+
+        if (!imagelist) return FALSE;
+
+        *imagelist = infoPtr->imagelist;
+        return TRUE;
+    }
+
     case BM_GETCHECK:
         return infoPtr->state & 3;
 
diff --git a/dlls/comctl32/tests/button.c b/dlls/comctl32/tests/button.c
index 3e705f1..d8489db 100644
--- a/dlls/comctl32/tests/button.c
+++ b/dlls/comctl32/tests/button.c
@@ -33,6 +33,8 @@
 static BOOL (WINAPI *pSetWindowSubclass)(HWND, SUBCLASSPROC, UINT_PTR, DWORD_PTR);
 static BOOL (WINAPI *pRemoveWindowSubclass)(HWND, SUBCLASSPROC, UINT_PTR);
 static LRESULT (WINAPI *pDefSubclassProc)(HWND, UINT, WPARAM, LPARAM);
+static HIMAGELIST(WINAPI *pImageList_Create)(int, int, UINT, int, int);
+static int(WINAPI *pImageList_Add)(HIMAGELIST, HBITMAP, HBITMAP);
 
 /****************** button message test *************************/
 #define ID_BUTTON 0x000e
@@ -77,6 +79,11 @@ static void init_functions(void)
     MAKEFUNC_ORD(RemoveWindowSubclass, 412);
     MAKEFUNC_ORD(DefSubclassProc, 413);
 #undef MAKEFUNC_ORD
+
+#define X(f) p##f = (void *)GetProcAddress(hmod, #f);
+    X(ImageList_Create);
+    X(ImageList_Add);
+#undef X
 }
 
 /* try to make sure pending X events have been processed before continuing */
@@ -1270,6 +1277,84 @@ static void test_button_data(void)
     DestroyWindow(parent);
 }
 
+static void test_get_set_imagelist(void)
+{
+    HWND hwnd;
+    HIMAGELIST himl;
+    BUTTON_IMAGELIST biml = {0};
+    HDC hdc;
+    HBITMAP hbmp;
+    INT width = 16;
+    INT height = 16;
+    INT index;
+    DWORD type;
+    BOOL ret;
+
+    hdc = GetDC(0);
+    hbmp = CreateCompatibleBitmap(hdc, width, height);
+    ok(hbmp != NULL, "Expect hbmp not null\n");
+
+    himl = pImageList_Create(width, height, ILC_COLOR, 1, 0);
+    ok(himl != NULL, "Expect himl not null\n");
+    index = pImageList_Add(himl, hbmp, NULL);
+    ok(index == 0, "Expect index == 0\n");
+    DeleteObject(hbmp);
+    ReleaseDC(0, hdc);
+
+    for (type = BS_PUSHBUTTON; type <= BS_DEFCOMMANDLINK; type++)
+    {
+        hwnd = create_button(type, NULL);
+        ok(hwnd != NULL, "Expect hwnd not null\n");
+
+        /* Get imagelist when imagelist is unset yet */
+        ret = SendMessageA(hwnd, BCM_GETIMAGELIST, 0, (LPARAM)&biml);
+        ok(ret, "Expect BCM_GETIMAGELIST return true\n");
+        ok(biml.himl == 0 && IsRectEmpty(&biml.margin) && biml.uAlign == 0,
+           "Expect BUTTON_IMAGELIST is empty\n");
+
+        /* Set imagelist with himl null */
+        biml.himl = 0;
+        biml.uAlign = BUTTON_IMAGELIST_ALIGN_CENTER;
+        ret = SendMessageA(hwnd, BCM_SETIMAGELIST, 0, (LPARAM)&biml);
+        ok(ret || broken(!ret), /* xp or 2003 */
+           "Expect BCM_SETIMAGELIST return true\n");
+
+        /* Set imagelist with uAlign invalid */
+        biml.himl = himl;
+        biml.uAlign = -1;
+        ret = SendMessageA(hwnd, BCM_SETIMAGELIST, 0, (LPARAM)&biml);
+        ok(ret, "Expect BCM_SETIMAGELIST return true\n");
+
+        /* Successful get and set imagelist */
+        biml.himl = himl;
+        biml.uAlign = BUTTON_IMAGELIST_ALIGN_CENTER;
+        ret = SendMessageA(hwnd, BCM_SETIMAGELIST, 0, (LPARAM)&biml);
+        ok(ret, "Expect BCM_SETIMAGELIST return true\n");
+        ret = SendMessageA(hwnd, BCM_GETIMAGELIST, 0, (LPARAM)&biml);
+        ok(ret, "Expect BCM_GETIMAGELIST return true\n");
+        ok(biml.himl == himl, "Expect himl to be same\n");
+        ok(biml.uAlign == BUTTON_IMAGELIST_ALIGN_CENTER, "Expect uAlign to be %x\n",
+           BUTTON_IMAGELIST_ALIGN_CENTER);
+
+        /* BCM_SETIMAGELIST null pointer handling */
+        ret = SendMessageA(hwnd, BCM_SETIMAGELIST, 0, 0);
+        ok(!ret, "Expect BCM_SETIMAGELIST return false\n");
+        ret = SendMessageA(hwnd, BCM_GETIMAGELIST, 0, (LPARAM)&biml);
+        ok(ret, "Expect BCM_GETIMAGELIST return true\n");
+        ok(biml.himl == himl, "Expect himl to be same\n");
+
+        /* BCM_GETIMAGELIST null pointer handling */
+        biml.himl = himl;
+        biml.uAlign = BUTTON_IMAGELIST_ALIGN_CENTER;
+        ret = SendMessageA(hwnd, BCM_SETIMAGELIST, 0, (LPARAM)&biml);
+        ok(ret, "Expect BCM_SETIMAGELIST return true\n");
+        ret = SendMessageA(hwnd, BCM_GETIMAGELIST, 0, 0);
+        ok(!ret, "Expect BCM_GETIMAGELIST return false\n");
+
+        DestroyWindow(hwnd);
+    }
+}
+
 START_TEST(button)
 {
     ULONG_PTR ctx_cookie;
@@ -1288,6 +1373,7 @@ START_TEST(button)
     test_note();
     test_button_data();
     test_bm_get_set_image();
+    test_get_set_imagelist();
 
     unload_v6_module(ctx_cookie, hCtx);
 }
diff --git a/include/commctrl.h b/include/commctrl.h
index 3898f3b..a0e0eca 100644
--- a/include/commctrl.h
+++ b/include/commctrl.h
@@ -1100,6 +1100,10 @@ typedef struct tagNMBCHOTITEM
   (BOOL)SNDMSG(button, BCM_GETNOTE, (WPARAM)(size), (LPARAM)(buffer))
 #define Button_GetNoteLength(button)  \
   (LRESULT)SNDMSG(button, BCM_GETNOTELENGTH, 0, 0)
+#define Button_GetImageList(button, image_list)  \
+  (BOOL)SNDMSG(button, BCM_GETIMAGELIST, 0, (LPARAM)(image_list))
+#define Button_SetImageList(button, image_list)  \
+  (BOOL)SNDMSG(button, BCM_SETIMAGELIST, 0, (LPARAM)(image_list))
 
 /* Toolbar */
 




More information about the wine-cvs mailing list