On 3/19/07, Mikołaj Zalewski mikolaj@zalewski.pl wrote:
As can be seen in Spy++ and by the attached tests, CreateToolbarEx sends TB_SETBITMAPSIZE twice instead of TB_SETBITMAPSIZE and TB_SETBUTTONSIZE. ShellExViewer depends on this bug. The patch contains also some tests and fixes for d[xy]Button <= 0.
From c8a84900ae5d9ca7d77d443990e935b8c268bf4c Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Miko=C5=82aj_Zalewski?= mikolaj@zalewski.pl Date: Mon, 19 Mar 2007 10:40:53 +0100 Subject: [PATCH] comctl32: CreateToolbarEx should send TB_SETBITMAPSIZE twice (fixes bug #6392)
dlls/comctl32/commctrl.c | 13 +++++++------ dlls/comctl32/tests/toolbar.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 6 deletions(-)
diff --git a/dlls/comctl32/commctrl.c b/dlls/comctl32/commctrl.c index c21cae3..7e44e03 100644 --- a/dlls/comctl32/commctrl.c +++ b/dlls/comctl32/commctrl.c @@ -693,12 +693,13 @@ CreateToolbarEx (HWND hwnd, DWORD style, UINT wID, INT nBitmaps, SendMessageW (hwndTB, TB_SETBITMAPSIZE, 0, MAKELPARAM((WORD)dxBitmap, (WORD)dyBitmap));
if (dxButton <= 0)
dxButton = 24;
if (dyButton <= 0)
dyButton = 22;
SendMessageW (hwndTB, TB_SETBUTTONSIZE, 0,
MAKELPARAM((WORD)dxButton, (WORD)dyButton));
if (dxButton < 0)
dxButton = dxBitmap;
if (dyButton < 0)
dyButton = dyBitmap;
/* TB_SETBUTTONSIZE -> TB_SETBITMAPSIZE bug introduced for Windows compatibility */
if (dxButton != 0 && dyButton != 0)
SendMessageW(hwndTB, TB_SETBITMAPSIZE, 0, MAKELPARAM(dxButton, dyButton)); /* add bitmaps */
diff --git a/dlls/comctl32/tests/toolbar.c b/dlls/comctl32/tests/toolbar.c index 164644e..b583295 100644 --- a/dlls/comctl32/tests/toolbar.c +++ b/dlls/comctl32/tests/toolbar.c @@ -869,6 +869,45 @@ static void test_sizes(void) DestroyWindow(hToolbar); }
+static void test_createtoolbarex() +{
- HWND hToolbar;
- TBBUTTON btns[3];
- ZeroMemory(&btns, sizeof(btns));
- hToolbar = CreateToolbarEx(hMainWnd, WS_VISIBLE, 1, 16, GetModuleHandle(NULL), IDB_BITMAP_128x15, btns,
3, 20, 20, 16, 16, sizeof(TBBUTTON));
- CHECK_IMAGELIST(16, 20, 20);
- compare((int)SendMessage(hToolbar, TB_GETBUTTONSIZE, 0, 0), 0x1a001b, "%x");
- DestroyWindow(hToolbar);
- hToolbar = CreateToolbarEx(hMainWnd, WS_VISIBLE, 1, 16, GetModuleHandle(NULL), IDB_BITMAP_128x15, btns,
3, 4, 4, 16, 16, sizeof(TBBUTTON));
- CHECK_IMAGELIST(32, 4, 4);
- compare((int)SendMessage(hToolbar, TB_GETBUTTONSIZE, 0, 0), 0xa000b, "%x");
- DestroyWindow(hToolbar);
- hToolbar = CreateToolbarEx(hMainWnd, WS_VISIBLE, 1, 16, GetModuleHandle(NULL), IDB_BITMAP_128x15, btns,
3, 0, 8, 12, 12, sizeof(TBBUTTON));
- CHECK_IMAGELIST(16, 12, 12);
- compare((int)SendMessage(hToolbar, TB_GETBUTTONSIZE, 0, 0), 0x120013, "%x");
- DestroyWindow(hToolbar);
- hToolbar = CreateToolbarEx(hMainWnd, WS_VISIBLE, 1, 16, GetModuleHandle(NULL), IDB_BITMAP_128x15, btns,
3, -1, 8, 12, 12, sizeof(TBBUTTON));
- CHECK_IMAGELIST(16, 12, 8);
- compare((int)SendMessage(hToolbar, TB_GETBUTTONSIZE, 0, 0), 0xe0013, "%x");
- DestroyWindow(hToolbar);
- hToolbar = CreateToolbarEx(hMainWnd, WS_VISIBLE, 1, 16, GetModuleHandle(NULL), IDB_BITMAP_128x15, btns,
3, -1, 8, -1, 12, sizeof(TBBUTTON));
- CHECK_IMAGELIST(16, 16, 8);
- compare((int)SendMessage(hToolbar, TB_GETBUTTONSIZE, 0, 0), 0xe0017, "%x");
- DestroyWindow(hToolbar);
+}
START_TEST(toolbar) { WNDCLASSA wc; @@ -899,6 +938,7 @@ START_TEST(toolbar) test_add_string(); test_hotitem(); test_sizes();
test_createtoolbarex();
PostQuitMessage(0); while(GetMessageA(&msg,0,0,0)) {
-- 1.4.4.2
If you're testing what message is sent, why not use the message sequence testing code?
If you're testing what message is sent, why not use the message sequence testing code?
That's true that a message sequence test would be better. I haven't thought about it.
Mikolaj Zalewski