static BOOL (WINAPI *pGetLayeredWindowAttributes)(HWND,COLORREF*,BYTE*,DWORD*);
static BOOL (WINAPI *pSetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD);
static BOOL (WINAPI *pUpdateLayeredWindow)(HWND,HDC,POINT*,SIZE*,HDC,POINT*,COLORREF,BLENDFUNCTION*,DWORD);
+static BOOL (WINAPI *pUpdateLayeredWindowIndirect)(HWND,const UPDATELAYEREDWINDOWINFO*);
static BOOL (WINAPI *pGetMonitorInfoA)(HMONITOR,LPMONITORINFO);
static HMONITOR (WINAPI *pMonitorFromPoint)(POINT,DWORD);
static int (WINAPI *pGetWindowRgnBox)(HWND,LPRECT);
ok( !ret, "GetLayeredWindowAttributes should fail on layered but not initialized window\n" );
ret = pUpdateLayeredWindow( hwnd, 0, NULL, &sz, hdc, &pt, 0, NULL, ULW_OPAQUE );
ok( ret, "UpdateLayeredWindow should succeed on layered window\n" );
+ ret = pUpdateLayeredWindow( hwnd, 0, NULL, &sz, hdc, &pt, 0, NULL, ULW_OPAQUE | ULW_EX_NORESIZE );
+ ok( !ret, "UpdateLayeredWindow should fail with ex flag\n" );
+ ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
+ if (pUpdateLayeredWindowIndirect)
+ {
+ UPDATELAYEREDWINDOWINFO info;
+ info.cbSize = sizeof(info);
+ info.hdcDst = 0;
+ info.pptDst = NULL;
+ info.psize = &sz;
+ info.hdcSrc = hdc;
+ info.pptSrc = &pt;
+ info.crKey = 0;
+ info.pblend = NULL;
+ info.dwFlags = ULW_OPAQUE | ULW_EX_NORESIZE;
+ info.prcDirty = NULL;
+ ret = pUpdateLayeredWindowIndirect( hwnd, &info );
+ ok( ret, "UpdateLayeredWindowIndirect should succeed on layered window\n" );
+ sz.cx--;
+ ret = pUpdateLayeredWindowIndirect( hwnd, &info );
+ ok( !ret, "UpdateLayeredWindowIndirect should fail\n" );
+ ok( GetLastError() == ERROR_INCORRECT_SIZE || broken(GetLastError() == ERROR_MR_MID_NOT_FOUND),
+ "wrong error %u\n", GetLastError() );
+ info.dwFlags = ULW_OPAQUE;
+ ret = pUpdateLayeredWindowIndirect( hwnd, &info );
+ ok( ret, "UpdateLayeredWindowIndirect should succeed on layered window\n" );
+ sz.cx++;
+ info.dwFlags = ULW_OPAQUE | 0xf00;
+ ret = pUpdateLayeredWindowIndirect( hwnd, &info );
+ ok( !ret, "UpdateLayeredWindowIndirect should fail\n" );
+ ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
+ info.cbSize--;
+ info.dwFlags = ULW_OPAQUE;
+ ret = pUpdateLayeredWindowIndirect( hwnd, &info );
+ ok( !ret, "UpdateLayeredWindowIndirect should fail\n" );
+ ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
+ ret = pUpdateLayeredWindowIndirect( hwnd, NULL );
+ ok( !ret, "UpdateLayeredWindowIndirect should fail\n" );
+ ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
+ }
+
ret = pSetLayeredWindowAttributes( hwnd, 0x654321, 22, LWA_COLORKEY | LWA_ALPHA );
ok( ret, "SetLayeredWindowAttributes should succeed on layered window\n" );
ret = pGetLayeredWindowAttributes( hwnd, &key, &alpha, &flags );
pGetLayeredWindowAttributes = (void *)GetProcAddress( user32, "GetLayeredWindowAttributes" );
pSetLayeredWindowAttributes = (void *)GetProcAddress( user32, "SetLayeredWindowAttributes" );
pUpdateLayeredWindow = (void *)GetProcAddress( user32, "UpdateLayeredWindow" );
+ pUpdateLayeredWindowIndirect = (void *)GetProcAddress( user32, "UpdateLayeredWindowIndirect" );
pGetMonitorInfoA = (void *)GetProcAddress( user32, "GetMonitorInfoA" );
pMonitorFromPoint = (void *)GetProcAddress( user32, "MonitorFromPoint" );
pGetWindowRgnBox = (void *)GetProcAddress( user32, "GetWindowRgnBox" );
*/
BOOL WINAPI UpdateLayeredWindowIndirect( HWND hwnd, const UPDATELAYEREDWINDOWINFO *info )
{
+ DWORD flags = SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW;
+ RECT window_rect, client_rect;
+ SIZE offset;
BYTE alpha = 0xff;
- if (!(GetWindowLongW( hwnd, GWL_EXSTYLE ) & WS_EX_LAYERED) ||
+ if (!info ||
+ info->cbSize != sizeof(*info) ||
+ info->dwFlags & ~(ULW_COLORKEY | ULW_ALPHA | ULW_OPAQUE | ULW_EX_NORESIZE) ||
+ !(GetWindowLongW( hwnd, GWL_EXSTYLE ) & WS_EX_LAYERED) ||
GetLayeredWindowAttributes( hwnd, NULL, NULL, NULL ))
{
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
- if (!(info->dwFlags & ULW_EX_NORESIZE) && (info->pptDst || info->psize))
- {
- DWORD flags = SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE;
- RECT window_rect, client_rect;
- SIZE offset;
-
- WIN_GetRectangles( hwnd, COORDS_PARENT, &window_rect, &client_rect );
+ WIN_GetRectangles( hwnd, COORDS_PARENT, &window_rect, &client_rect );
- if (info->pptDst)
+ if (info->pptDst)
+ {
+ offset.cx = info->pptDst->x - window_rect.left;
+ offset.cy = info->pptDst->y - window_rect.top;
+ OffsetRect( &client_rect, offset.cx, offset.cy );
+ OffsetRect( &window_rect, offset.cx, offset.cy );
+ flags &= ~SWP_NOMOVE;
+ }
+ if (info->psize)
+ {
+ offset.cx = info->psize->cx - (window_rect.right - window_rect.left);
+ offset.cy = info->psize->cy - (window_rect.bottom - window_rect.top);
+ if (info->psize->cx <= 0 || info->psize->cy <= 0)
{
- offset.cx = info->pptDst->x - window_rect.left;
- offset.cy = info->pptDst->y - window_rect.top;
- OffsetRect( &client_rect, offset.cx, offset.cy );
- OffsetRect( &window_rect, offset.cx, offset.cy );
- flags &= ~SWP_NOMOVE;
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
}
- if (info->psize)
+ if ((info->dwFlags & ULW_EX_NORESIZE) && (offset.cx || offset.cy))
{
- if (info->psize->cx <= 0 || info->psize->cy <= 0)
- {
- SetLastError( ERROR_INVALID_PARAMETER );
- return FALSE;
- }
- offset.cx = info->psize->cx - (window_rect.right - window_rect.left);
- offset.cy = info->psize->cy - (window_rect.bottom - window_rect.top);
- client_rect.right += offset.cx;
- client_rect.bottom += offset.cy;
- window_rect.right += offset.cx;
- window_rect.bottom += offset.cy;
- flags &= ~SWP_NOSIZE;
+ SetLastError( ERROR_INCORRECT_SIZE );
+ return FALSE;
}
- TRACE( "moving window %p win %s client %s\n", hwnd,
- wine_dbgstr_rect(&window_rect), wine_dbgstr_rect(&client_rect) );
- set_window_pos( hwnd, 0, flags, &window_rect, &client_rect, NULL );
+ client_rect.right += offset.cx;
+ client_rect.bottom += offset.cy;
+ window_rect.right += offset.cx;
+ window_rect.bottom += offset.cy;
+ flags &= ~SWP_NOSIZE;
}
+ TRACE( "window %p win %s client %s\n", hwnd,
+ wine_dbgstr_rect(&window_rect), wine_dbgstr_rect(&client_rect) );
+ set_window_pos( hwnd, 0, flags, &window_rect, &client_rect, NULL );
+
if (info->hdcSrc)
{
HDC hdc = GetWindowDC( hwnd );
*/
BOOL WINAPI UpdateLayeredWindow( HWND hwnd, HDC hdcDst, POINT *pptDst, SIZE *psize,
HDC hdcSrc, POINT *pptSrc, COLORREF crKey, BLENDFUNCTION *pblend,
- DWORD dwFlags)
+ DWORD flags)
{
UPDATELAYEREDWINDOWINFO info;
+ if (flags & ULW_EX_NORESIZE) /* only valid for UpdateLayeredWindowIndirect */
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
+ }
info.cbSize = sizeof(info);
info.hdcDst = hdcDst;
info.pptDst = pptDst;
info.pptSrc = pptSrc;
info.crKey = crKey;
info.pblend = pblend;
- info.dwFlags = dwFlags;
+ info.dwFlags = flags;
info.prcDirty = NULL;
return UpdateLayeredWindowIndirect( hwnd, &info );
}
#define ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION 1459
#define ERROR_TIMEOUT 1460
#define ERROR_INVALID_MONITOR_HANDLE 1461
+#define ERROR_INCORRECT_SIZE 1462
+#define ERROR_SYMLINK_CLASS_DISABLED 1463
+#define ERROR_SYMLINK_NOT_SUPPORTED 1464
+#define ERROR_XML_PARSE_ERROR 1465
+#define ERROR_XMLDSIG_ERROR 1466
+#define ERROR_RESTART_APPLICATION 1467
+#define ERROR_WRONG_COMPARTMENT 1468
+#define ERROR_AUTHIP_FAILURE 1469
+#define ERROR_NO_NVRAM_RESOURCES 1470
#define ERROR_EVENTLOG_FILE_CORRUPT 1500
#define ERROR_EVENTLOG_CANT_START 1501
#define ERROR_LOG_FILE_FULL 1502