|
|
/****************************************************************************/ /* */ /* 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); }
|