317 lines
9.2 KiB
C
317 lines
9.2 KiB
C
|
|
||
|
/****************************************************************************/
|
||
|
/* */
|
||
|
/* RMCREATE.C - */
|
||
|
/* */
|
||
|
/* Resource creating Routines. */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
|
||
|
#define RESOURCESTRINGS
|
||
|
#include "user.h"
|
||
|
|
||
|
#ifdef NOT_USED_ANYMORE
|
||
|
#define NSMOVE 0x0010
|
||
|
|
||
|
HGLOBAL FAR PASCAL DirectResAlloc(HGLOBAL, WORD, WORD);
|
||
|
|
||
|
|
||
|
/******************************************************************************
|
||
|
**
|
||
|
** CreateCursorIconIndirect()
|
||
|
**
|
||
|
** This is the common function called by CreateCursor and
|
||
|
** CreateIcon()
|
||
|
** DirectResAlloc() is called instead of GlobalAlloc() because
|
||
|
** the Icons/Cursors created by one instance of the app can be used in
|
||
|
** a WNDCLASS structure to Register a class which will be used by other
|
||
|
** instances of the app and when the instance that created the icons/
|
||
|
** cursors terminates, the resources SHOULD NOT BE FREED; If GlobalAlloc()
|
||
|
** is used this is what will happen; At the same time, when the last
|
||
|
** instance also dies, the memory SHOULD BE FREED; To achieve this,
|
||
|
** DirectResAlloc() is used instead of GlobalAlloc();
|
||
|
**
|
||
|
******************************************************************************/
|
||
|
|
||
|
HGLOBAL CALLBACK CreateCursorIconIndirect(HINSTANCE hInstance,
|
||
|
LPCURSORSHAPE lpHeader,
|
||
|
CONST VOID FAR* lpANDplane,
|
||
|
CONST VOID FAR* lpXORplane)
|
||
|
{
|
||
|
register WORD ANDmaskSize;
|
||
|
register WORD XORmaskSize;
|
||
|
WORD wTotalSize;
|
||
|
HRSRC hResource;
|
||
|
LPSTR lpRes;
|
||
|
|
||
|
|
||
|
ANDmaskSize = lpHeader -> cbWidth * lpHeader -> cy;
|
||
|
XORmaskSize = (((lpHeader -> cx * lpHeader -> BitsPixel + 0x0F) & ~0x0F)
|
||
|
>> 3) * lpHeader -> cy * lpHeader -> Planes;
|
||
|
|
||
|
/* It is assumed that Cursor/Icon size won't be more than 64K */
|
||
|
wTotalSize = sizeof(CURSORSHAPE) + ANDmaskSize + XORmaskSize;
|
||
|
|
||
|
#ifdef NEVER
|
||
|
/* Allocate the required memory */
|
||
|
if((hResource = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT | GMEM_SHARE,
|
||
|
(DWORD)wTotalSize)) == NULL)
|
||
|
return(NULL);
|
||
|
#else
|
||
|
/* Let us preserve the long pointers */
|
||
|
SwapHandle(&lpANDplane);
|
||
|
SwapHandle(&lpXORplane);
|
||
|
|
||
|
hResource = DirectResAlloc(hInstance, NSMOVE, wTotalSize);
|
||
|
|
||
|
/* Let us restore the long pointers */
|
||
|
SwapHandle(&lpANDplane);
|
||
|
SwapHandle(&lpXORplane);
|
||
|
|
||
|
if(hResource == NULL)
|
||
|
return(NULL);
|
||
|
#endif
|
||
|
|
||
|
if(!(lpRes = GlobalLock(hResource)))
|
||
|
{
|
||
|
GlobalFree(hResource);
|
||
|
return(NULL);
|
||
|
}
|
||
|
|
||
|
LCopyStruct((LPSTR)lpHeader, lpRes, sizeof(CURSORSHAPE));
|
||
|
lpRes += sizeof(CURSORSHAPE);
|
||
|
LCopyStruct(lpANDplane, lpRes, ANDmaskSize);
|
||
|
lpRes += ANDmaskSize;
|
||
|
LCopyStruct(lpXORplane, lpRes, XORmaskSize);
|
||
|
|
||
|
GlobalUnlock(hResource);
|
||
|
return(hResource);
|
||
|
}
|
||
|
|
||
|
/******************************************************************************
|
||
|
**
|
||
|
** CreateCursor()
|
||
|
**
|
||
|
** This is the API call to create a Cursor "on-the-fly";
|
||
|
**
|
||
|
*******************************************************************************/
|
||
|
|
||
|
HCURSOR API ICreateCursor(hInstance, iXhotspot, iYhotspot, iWidth,
|
||
|
iHeight, lpANDplane, lpXORplane)
|
||
|
|
||
|
HINSTANCE hInstance;
|
||
|
int iXhotspot;
|
||
|
int iYhotspot;
|
||
|
int iWidth;
|
||
|
int iHeight;
|
||
|
CONST VOID FAR* lpANDplane;
|
||
|
CONST VOID FAR* lpXORplane;
|
||
|
{
|
||
|
CURSORSHAPE Header;
|
||
|
|
||
|
Header.xHotSpot = iXhotspot;
|
||
|
Header.yHotSpot = iYhotspot;
|
||
|
Header.cx = iWidth;
|
||
|
Header.cy = iHeight;
|
||
|
Header.Planes = 1; /* Cursors are only monochrome */
|
||
|
Header.BitsPixel = 1;
|
||
|
Header.cbWidth = ((iWidth + 0x0F) & ~0x0F) >> 3;
|
||
|
|
||
|
return(CreateCursorIconIndirect(hInstance, &Header,
|
||
|
lpANDplane, lpXORplane));
|
||
|
}
|
||
|
|
||
|
/******************************************************************************
|
||
|
**
|
||
|
** CreateIcon()
|
||
|
**
|
||
|
** This is the API call to create an Icon "on-the-fly";
|
||
|
**
|
||
|
*******************************************************************************/
|
||
|
|
||
|
HICON API ICreateIcon(hInstance, iWidth, iHeight, bPlanes,
|
||
|
bBitsPixel, lpANDplane, lpXORplane)
|
||
|
|
||
|
HINSTANCE hInstance;
|
||
|
int iWidth;
|
||
|
int iHeight;
|
||
|
BYTE bPlanes;
|
||
|
BYTE bBitsPixel;
|
||
|
CONST VOID FAR* lpANDplane;
|
||
|
CONST VOID FAR* lpXORplane;
|
||
|
{
|
||
|
CURSORSHAPE Header;
|
||
|
|
||
|
Header.xHotSpot = iWidth/2;
|
||
|
Header.yHotSpot = iHeight/2;
|
||
|
Header.cx = iWidth;
|
||
|
Header.cy = iHeight;
|
||
|
Header.Planes = bPlanes; /* Icons can be in color */
|
||
|
Header.BitsPixel = bBitsPixel;
|
||
|
Header.cbWidth = ((iWidth + 0x0F) & ~0x0F) >> 3;
|
||
|
|
||
|
return(CreateCursorIconIndirect(hInstance, (LPCURSORSHAPE)&Header,
|
||
|
lpANDplane, lpXORplane));
|
||
|
}
|
||
|
|
||
|
/******************************************************************************
|
||
|
*
|
||
|
* DestroyIcon(hIcon)
|
||
|
* This can be called to delete only those icons created "on the fly"
|
||
|
* using the CreateIcon() function
|
||
|
* Returns:
|
||
|
* TRUE if successful, FALSE otherwise.
|
||
|
*
|
||
|
******************************************************************************/
|
||
|
|
||
|
BOOL API IDestroyIcon(HICON hIcon)
|
||
|
|
||
|
{
|
||
|
return(!FreeResource(hIcon));
|
||
|
}
|
||
|
|
||
|
/******************************************************************************
|
||
|
*
|
||
|
* DestroyCursor(hIcon)
|
||
|
* This can be called to delete only those icons created "on the fly"
|
||
|
* using the CreateIcon() function
|
||
|
* Returns:
|
||
|
* TRUE if successful, FALSE otherwise.
|
||
|
*
|
||
|
******************************************************************************/
|
||
|
|
||
|
BOOL API IDestroyCursor(HCURSOR hCursor)
|
||
|
|
||
|
{
|
||
|
if (hCursor == hCurCursor)
|
||
|
{
|
||
|
/* #12068: if currently selected cursor resore arrow cursor and RIP [lalithar] */
|
||
|
SetCursor(hCursNormal);
|
||
|
DebugErr(DBF_ERROR, "DestroyCursor: Destroying current cursor");
|
||
|
}
|
||
|
return(!FreeResource(hCursor));
|
||
|
}
|
||
|
|
||
|
#endif /* NOT_USED_ANYMORE */
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
**
|
||
|
** DumpIcon()
|
||
|
**
|
||
|
** This function is called to get the details of a given Icon;
|
||
|
**
|
||
|
** The caller must lock hIcon using LockResource() and pass the pointer
|
||
|
** thro lpIcon; This is the pointer to the header structure;
|
||
|
** Thro lpHeaderSize, the size of header is returned;
|
||
|
** Thro lplpANDplane and lplpXORplane pointers to actual bit info is
|
||
|
** returned;
|
||
|
** This function returns a DWORD with the size of AND plane in loword
|
||
|
** and size of XOR plane in hiword;
|
||
|
**
|
||
|
****************************************************************************/
|
||
|
|
||
|
DWORD CALLBACK DumpIcon(LPSTR lpIcon,
|
||
|
WORD FAR * lpHeaderSize,
|
||
|
LPSTR FAR * lplpANDplane,
|
||
|
LPSTR FAR * lplpXORplane)
|
||
|
|
||
|
{
|
||
|
register WORD ANDmaskSize;
|
||
|
register WORD XORmaskSize;
|
||
|
LPCURSORSHAPE lpHeader;
|
||
|
|
||
|
*lpHeaderSize = sizeof(CURSORSHAPE);
|
||
|
|
||
|
if(!lpIcon)
|
||
|
return((DWORD)0);
|
||
|
|
||
|
lpHeader = (LPCURSORSHAPE)lpIcon;
|
||
|
|
||
|
ANDmaskSize = lpHeader -> cbWidth * lpHeader -> cy;
|
||
|
XORmaskSize = (((lpHeader -> cx * lpHeader -> BitsPixel + 0x0F) & ~0x0F)
|
||
|
>> 3) * lpHeader -> cy * lpHeader -> Planes;
|
||
|
|
||
|
*lplpANDplane = (lpIcon += sizeof(CURSORSHAPE));
|
||
|
*lplpXORplane = (lpIcon + ANDmaskSize);
|
||
|
|
||
|
return(MAKELONG(ANDmaskSize, XORmaskSize));
|
||
|
}
|
||
|
|
||
|
#ifdef NOT_USED_ANYMORE
|
||
|
/****************************************************************************
|
||
|
**
|
||
|
** GetInternalIconHeader(lpIcon, lpDestBuff)
|
||
|
**
|
||
|
** This function has been added to fix bug #6351 with cornerstone
|
||
|
** XTRA_LARGE display driver. (It uses 64 X 64 Icons; Internally we
|
||
|
** keep the size as 32 X 32. Progman must know this internal size sothat
|
||
|
** it can tell that to WinOldApp.
|
||
|
****************************************************************************/
|
||
|
|
||
|
void API IGetInternalIconHeader(LPSTR lpIcon, LPSTR lpDestBuff)
|
||
|
{
|
||
|
LCopyStruct(lpIcon, lpDestBuff, sizeof(CURSORSHAPE));
|
||
|
}
|
||
|
#endif /* NOT_USED_ANYMORE */
|
||
|
|
||
|
/* APIs to make a copy of an icon or cursor */
|
||
|
|
||
|
HICON API ICopyIcon(HINSTANCE hInstance, HICON hIcon)
|
||
|
{
|
||
|
LPSTR lpAND;
|
||
|
LPSTR lpXOR;
|
||
|
LPSTR lpIcon;
|
||
|
WORD wHeaderSize;
|
||
|
HICON hIconCopy;
|
||
|
LPCURSORSHAPE lpHeader;
|
||
|
|
||
|
lpIcon = LockResource(hIcon);
|
||
|
if (!lpIcon)
|
||
|
return NULL;
|
||
|
|
||
|
lpHeader = (LPCURSORSHAPE)lpIcon;
|
||
|
|
||
|
DumpIcon(lpIcon, &wHeaderSize, &lpAND, &lpXOR);
|
||
|
|
||
|
hIconCopy = CreateIcon(hInstance,
|
||
|
lpHeader->cx,
|
||
|
lpHeader->cy,
|
||
|
lpHeader->Planes,
|
||
|
lpHeader->BitsPixel,
|
||
|
lpAND, lpXOR);
|
||
|
|
||
|
UnlockResource(hIcon);
|
||
|
|
||
|
return(hIconCopy);
|
||
|
}
|
||
|
|
||
|
HCURSOR API ICopyCursor(HINSTANCE hInstance, HICON hCursor)
|
||
|
{
|
||
|
LPSTR lpAND;
|
||
|
LPSTR lpXOR;
|
||
|
LPSTR lpCursor;
|
||
|
WORD wHeaderSize;
|
||
|
HCURSOR hCursorCopy;
|
||
|
LPCURSORSHAPE lpHeader;
|
||
|
|
||
|
lpCursor = LockResource(hCursor);
|
||
|
if (!lpCursor)
|
||
|
return NULL;
|
||
|
|
||
|
lpHeader = (LPCURSORSHAPE)lpCursor;
|
||
|
|
||
|
DumpIcon(lpCursor, &wHeaderSize, &lpAND, &lpXOR);
|
||
|
|
||
|
hCursorCopy = CreateCursor(hInstance,
|
||
|
lpHeader->xHotSpot,
|
||
|
lpHeader->yHotSpot,
|
||
|
lpHeader->cx,
|
||
|
lpHeader->cy,
|
||
|
lpAND, lpXOR);
|
||
|
|
||
|
UnlockResource(hCursor);
|
||
|
|
||
|
return(hCursorCopy);
|
||
|
}
|