From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/static.c | 38 ++++++++++++++++++++++++++++++++------ dlls/user32/tests/static.c | 18 ++++++++++++++++++ 2 files changed, 50 insertions(+), 6 deletions(-)
diff --git a/dlls/user32/static.c b/dlls/user32/static.c index a88203f5716..103767c6852 100644 --- a/dlls/user32/static.c +++ b/dlls/user32/static.c @@ -418,22 +418,48 @@ LRESULT StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam switch (style) { case SS_ICON: { + const WCHAR *name = cs->lpszName; HICON hIcon; - if (unicode || IS_INTRESOURCE(cs->lpszName)) - hIcon = STATIC_LoadIconW(cs->hInstance, cs->lpszName, full_style); + + if (!unicode) + { + const char *nameA = (const char *)name; + if (nameA && nameA[0] == '\xff') + name = nameA[1] ? MAKEINTRESOURCEW(MAKEWORD(nameA[1], nameA[2])) : 0; + } + else if (name && name[0] == 0xffff) + { + name = MAKEINTRESOURCEW(name[1]); + } + + if (unicode || IS_INTRESOURCE(name)) + hIcon = STATIC_LoadIconW(cs->hInstance, name, full_style); else - hIcon = STATIC_LoadIconA(cs->hInstance, (LPCSTR)cs->lpszName, full_style); + hIcon = STATIC_LoadIconA(cs->hInstance, (const char *)name, full_style); STATIC_SetIcon(hwnd, hIcon, full_style); } break; case SS_BITMAP: if ((ULONG_PTR)cs->hInstance >> 16) { + const WCHAR *name = cs->lpszName; HBITMAP hBitmap; - if (unicode || IS_INTRESOURCE(cs->lpszName)) - hBitmap = LoadBitmapW(cs->hInstance, cs->lpszName); + + if (!unicode) + { + const char *nameA = (const char *)name; + if (nameA && nameA[0] == '\xff') + name = nameA[1] ? MAKEINTRESOURCEW(MAKEWORD(nameA[1], nameA[2])) : 0; + } + else if (name && name[0] == 0xffff) + { + name = MAKEINTRESOURCEW(name[1]); + } + + if (unicode || IS_INTRESOURCE(name)) + hBitmap = LoadBitmapW(cs->hInstance, name); else - hBitmap = LoadBitmapA(cs->hInstance, (LPCSTR)cs->lpszName); + hBitmap = LoadBitmapA(cs->hInstance, (const char *)name); STATIC_SetBitmap(hwnd, hBitmap, full_style); } break; diff --git a/dlls/user32/tests/static.c b/dlls/user32/tests/static.c index 09e399990cd..a02cb249d49 100644 --- a/dlls/user32/tests/static.c +++ b/dlls/user32/tests/static.c @@ -197,6 +197,24 @@ static void test_set_image(void)
DestroyWindow(hwnd); DeleteObject(image); + + hwnd = CreateWindowW(L"static", L"\uffff\x65", WS_VISIBLE|WS_CHILD|SS_BITMAP, 5, 5, 100, 100, + hMainWnd, (HMENU)CTRL_ID, GetModuleHandleW(NULL), 0); + + bmp = (HBITMAP)SendMessageW(hwnd, STM_GETIMAGE, IMAGE_BITMAP, 0); + ok(bmp != NULL, "got NULL\n"); + test_image(bmp); + + DestroyWindow(hwnd); + + hwnd = CreateWindowA("static", "\xff\x65\0", WS_VISIBLE|WS_CHILD|SS_BITMAP, 5, 5, 100, 100, + hMainWnd, (HMENU)CTRL_ID, GetModuleHandleW(NULL), 0); + + bmp = (HBITMAP)SendMessageW(hwnd, STM_GETIMAGE, IMAGE_BITMAP, 0); + ok(bmp != NULL, "got NULL\n"); + test_image(bmp); + + DestroyWindow(hwnd); }
static void test_STM_SETIMAGE(void)