Module: wine Branch: master Commit: 0d4940b732f40ad7325b8ab61baee001b5d5e69e URL: https://source.winehq.org/git/wine.git/?a=commit;h=0d4940b732f40ad7325b8ab61...
Author: Zhiyi Zhang zzhang@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@codeweavers.com Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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 */