added LR_SHARED flag support for LoadIcon() and LoadCursor()

svn path=/trunk/; revision=6689
This commit is contained in:
Thomas Bluemel 2003-11-18 19:59:51 +00:00
parent 7fd98f181c
commit 69a485aba7
4 changed files with 100 additions and 39 deletions

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: bitmap.c,v 1.19 2003/11/10 17:44:49 weiden Exp $
/* $Id: bitmap.c,v 1.20 2003/11/18 19:59:50 weiden Exp $
*
* PROJECT: ReactOS user32.dll
* FILE: lib/user32/windows/input.c
@ -80,6 +80,7 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad)
{
HANDLE hResource;
HANDLE h2Resource;
HANDLE hfRes;
HANDLE hFile;
HANDLE hSection;
CURSORICONDIR* IconDIR;
@ -93,21 +94,25 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad)
GRPCURSORICONDIR* IconResDir;
INT id;
ICONIMAGE *ResIcon;
if (fuLoad & LR_SHARED)
DbgPrint("FIXME: need LR_SHARED support Loading cursor images\n");
if (!(fuLoad & LR_LOADFROMFILE))
{
if (hinst == NULL)
{
hinst = GetModuleHandleW(L"USER32");
}
hResource = FindResourceW(hinst, lpszName, RT_GROUP_CURSOR);
hResource = hfRes = FindResourceW(hinst, lpszName, RT_GROUP_CURSOR);
if (hResource == NULL)
{
return(NULL);
}
if (fuLoad & LR_SHARED)
{
hIcon = (HANDLE)NtUserFindExistingCursorIcon(hinst, (HRSRC)hfRes);
if(hIcon)
return hIcon;
}
hResource = LoadResource(hinst, hResource);
if (hResource == NULL)
@ -139,12 +144,23 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad)
{
return(NULL);
}
return CreateIconFromResourceEx((PBYTE) ResIcon,
SizeofResource(hinst, h2Resource), FALSE, 0x00030000,
32, 32, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
hIcon = (HANDLE)CreateIconFromResourceEx((PBYTE) ResIcon,
SizeofResource(hinst, h2Resource), FALSE, 0x00030000,
32, 32, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
if(hIcon)
{
NtUserSetCursorIconData((HICON)hIcon, NULL, NULL, hinst, (HRSRC)hfRes,
(HRSRC)NULL);
}
return hIcon;
}
else
{
if (fuLoad & LR_SHARED)
{
DbgPrint("FIXME: need LR_SHARED support loading cursor images from files\n");
}
hFile = CreateFileW(lpszName,
GENERIC_READ,
FILE_SHARE_READ,
@ -246,6 +262,7 @@ LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuL
{
HANDLE hResource;
HANDLE h2Resource;
HANDLE hfRes;
HANDLE hFile;
HANDLE hSection;
CURSORICONDIR* IconDIR;
@ -259,21 +276,25 @@ LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuL
GRPCURSORICONDIR* IconResDir;
INT id;
ICONIMAGE *ResIcon;
if (fuLoad & LR_SHARED)
DbgPrint("FIXME: need LR_SHARED support Loading icon images\n");
if (!(fuLoad & LR_LOADFROMFILE))
{
if (hinst == NULL)
{
hinst = GetModuleHandleW(L"USER32");
}
hResource = FindResourceW(hinst, lpszName, RT_GROUP_ICON);
hResource = hfRes = FindResourceW(hinst, lpszName, RT_GROUP_ICON);
if (hResource == NULL)
{
return(NULL);
}
if (fuLoad & LR_SHARED)
{
hIcon = NtUserFindExistingCursorIcon(hinst, (HRSRC)hfRes);
if(hIcon)
return hIcon;
}
hResource = LoadResource(hinst, hResource);
if (hResource == NULL)
@ -305,12 +326,23 @@ LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuL
{
return(NULL);
}
return CreateIconFromResourceEx((PBYTE) ResIcon,
SizeofResource(hinst, h2Resource), TRUE, 0x00030000,
width, height, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
hIcon = (HANDLE)CreateIconFromResourceEx((PBYTE) ResIcon,
SizeofResource(hinst, h2Resource), TRUE, 0x00030000,
width, height, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
if(hIcon)
{
NtUserSetCursorIconData((HICON)hIcon, NULL, NULL, hinst, (HRSRC)hfRes,
(HRSRC)NULL);
}
return hIcon;
}
else
{
if (fuLoad & LR_SHARED)
{
DbgPrint("FIXME: need LR_SHARED support for loading icon images from files\n");
}
hFile = CreateFileW(lpszName,
GENERIC_READ,
FILE_SHARE_READ,

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: cursor.c,v 1.14 2003/11/10 17:44:49 weiden Exp $
/* $Id: cursor.c,v 1.15 2003/11/18 19:59:51 weiden Exp $
*
* PROJECT: ReactOS user32.dll
* FILE: lib/user32/windows/cursor.c
@ -176,7 +176,7 @@ LoadCursorA(HINSTANCE hInstance,
LPCSTR lpCursorName)
{
return(LoadImageA(hInstance, lpCursorName, IMAGE_CURSOR, 0, 0,
LR_DEFAULTSIZE));
LR_SHARED | LR_DEFAULTSIZE));
}
@ -215,7 +215,7 @@ LoadCursorW(HINSTANCE hInstance,
LPCWSTR lpCursorName)
{
return(LoadImageW(hInstance, lpCursorName, IMAGE_CURSOR, 0, 0,
LR_DEFAULTSIZE));
LR_SHARED | LR_DEFAULTSIZE));
}

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: icon.c,v 1.13 2003/11/10 17:44:49 weiden Exp $
/* $Id: icon.c,v 1.14 2003/11/18 19:59:51 weiden Exp $
*
* PROJECT: ReactOS user32.dll
* FILE: lib/user32/windows/icon.c
@ -242,6 +242,15 @@ CreateIconFromResourceEx(
HDC hScreenDc;
WORD wXHotspot;
WORD wYHotspot;
/*
FIXME - does win support LR_SHARED? According to msdn it does but we don't
have useful information to identify the icon
if (uFlags & LR_SHARED)
{
DbgPrint("FIXME: need LR_SHARED support in CreateIconFromResourceEx()\n");
}
*/
DPRINT("dwVersion, cxDesired, cyDesired are all ignored in this implementation!\n");

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: cursoricon.c,v 1.19 2003/11/15 12:43:25 weiden Exp $ */
/* $Id: cursoricon.c,v 1.20 2003/11/18 19:59:51 weiden Exp $ */
#undef WIN32_LEAN_AND_MEAN
@ -469,8 +469,8 @@ NtUserCreateCursorIconHandle(PICONINFO IconInfo, BOOL Indirect)
CurIconObject->IconInfo.hbmMask = IntCopyBitmap(CurIconObject->IconInfo.hbmMask);
CurIconObject->IconInfo.hbmColor = IntCopyBitmap(CurIconObject->IconInfo.hbmColor);
}
bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmColor);
if(bmp)
if(CurIconObject->IconInfo.hbmColor &&
(bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmColor)))
{
CurIconObject->Size.cx = bmp->size.cx;
CurIconObject->Size.cy = bmp->size.cy;
@ -478,8 +478,8 @@ NtUserCreateCursorIconHandle(PICONINFO IconInfo, BOOL Indirect)
}
else
{
bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmMask);
if(bmp)
if(CurIconObject->IconInfo.hbmMask &&
(bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmMask)))
{
CurIconObject->Size.cx = bmp->size.cx;
CurIconObject->Size.cy = bmp->size.cy / 2;
@ -830,7 +830,7 @@ NtUserFindExistingCursorIcon(
ObDereferenceObject(WinStaObject);
return Ret;
}
SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
ObDereferenceObject(WinStaObject);
return (HICON)0;
@ -1036,26 +1036,46 @@ NtUserSetCursorIconData(
if(CurIconObject)
{
/* Copy fields */
Status = MmCopyFromCaller(&CurIconObject->IconInfo.fIcon, fIcon, sizeof(BOOL));
if(!NT_SUCCESS(Status))
if(fIcon)
{
SetLastNtError(Status);
goto done;
Status = MmCopyFromCaller(&CurIconObject->IconInfo.fIcon, fIcon, sizeof(BOOL));
if(!NT_SUCCESS(Status))
{
SetLastNtError(Status);
goto done;
}
}
Status = MmCopyFromCaller(&SafeHotspot, Hotspot, sizeof(POINT));
if(NT_SUCCESS(Status))
else
{
if(!Hotspot)
Ret = TRUE;
}
if(Hotspot)
{
Status = MmCopyFromCaller(&SafeHotspot, Hotspot, sizeof(POINT));
if(NT_SUCCESS(Status))
{
CurIconObject->IconInfo.xHotspot = SafeHotspot.x;
CurIconObject->IconInfo.yHotspot = SafeHotspot.y;
CurIconObject->hModule = hModule;
CurIconObject->hRsrc = hRsrc;
CurIconObject->hGroupRsrc = hGroupRsrc;
Ret = TRUE;
}
else
SetLastNtError(Status);
}
if(!fIcon && !Hotspot)
{
CurIconObject->IconInfo.xHotspot = SafeHotspot.x;
CurIconObject->IconInfo.yHotspot = SafeHotspot.y;
CurIconObject->hModule = hModule;
CurIconObject->hRsrc = hRsrc;
CurIconObject->hGroupRsrc = hGroupRsrc;
Ret = TRUE;
}
else
SetLastNtError(Status);
done:
IntReleaseCurIconObject(WinStaObject);