⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 loadimg.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 5 页
字号:
/******************************************************
Copyright(c) 版权所有,1998-2005微逻辑。保留所有权利。
******************************************************/


/*****************************************************
文件说明:加载/装入bitmap,icon,cursor等
          LoadImage, LoadCursor, LoadIcon
版本号:3.0.0
开发时期:1999
作者:李林
修改记录:
    2003-07-14, _WinGdi_ConvertColorValue 为 SetDIBitsToDevice 改变调用接口
    2003-07-09 LoadImage 当 cxDesired & cyDesired为0并且没有LR_DEFAULTSIZE 
	           时应为真实的icon & cursor size
    2003-07-04 GetResFileHandle 将\\system\\system.res 改为 从 hgwmeInst得到
    2003-05-06-2003.05.07: LN
	  1. 将直接打开文件改为从hmodule得到文件句柄和res段偏移
	  2. 去掉无用的Code
	  3. 将 GetSystemMetrics 改为 WinSys_GetMetrics
******************************************************/

#include <eframe.h>
#include <efile.h>
#include <eapisrv.h>
#include <gdc.h>

#include <bheap.h>
#include <winsrv.h>
#include <gdisrv.h>

#define ACTUAL_WIDTH (-1)
#define ACTUAL_HEIGHT (-1)
#define IS_SIZE_MATCH( cxActual, cyActual, cxDesired, cyDesired ) ( ( (cxDesired) == ACTUAL_WIDTH || (cxDesired) == (cxActual) ) && ( (cyDesired) == ACTUAL_HEIGHT || (cyDesired) == (cyActual) ) )

extern const _DISPLAYDRV _drvDisplay1BPP;

static LPOBJLIST lpIconObjList = NULL;
static CRITICAL_SECTION csIconObjList;
static LPOBJLIST lpCursorObjList = NULL;
static CRITICAL_SECTION csCursorObjList;
static HANDLE HandleBitmapData( HANDLE hFile, BOOL bShare );
static HANDLE MakeIconCursor( HANDLE hFile, BOOL bIcon, DWORD dwDIBOffset, DWORD dwDIBSize, WORD wName );
static BOOL CALLBACK _FreeIconCursor( LPOBJLIST lpObj, LPARAM lParam );

extern HBITMAP WINAPI WinGdi_CreateBitmap( int nWidth, int nHeight, UINT cPlanes, UINT cBitsPerPel, const VOID *lpvBits);

// **************************************************
// 声明:_LPICONDATA _GetHICONPtr( HICON hIcon )
// 参数:
// 	IN hIcon - ICON句柄对象
// 返回值:
//	假如成功,返回 _ICONDATA 结构指针;否则,返回 NULL
// 功能描述:
//	检查对象句柄并得到对象指针
// 引用: 
//	
// ************************************************
#define DEBUG_GetHICONPtr 0
_LPICONDATA _GetHICONPtr( HICON hIcon )
{
    ASSERT( hIcon && (WORD)GET_OBJ_TYPE( hIcon ) == OBJ_ICON );
    if( hIcon && (WORD)GET_OBJ_TYPE( hIcon ) == OBJ_ICON )
        return (_LPICONDATA)hIcon;
	SetLastError( ERROR_INVALID_PARAMETER );
	WARNMSG( DEBUG_GetHICONPtr, ( "_GetHICONPtr: invalid hIcon(0x%x).\r\n", hIcon ) );
    return NULL;
}

// **************************************************
// 声明:BOOL __InitialGdiIconCursorMgr( void )
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	初始化 ICON Cursor 对象管理器
// 引用: 
//	
// ************************************************

BOOL _InitialGdiIconCursorMgr( void )
{
	InitializeCriticalSection( &csIconObjList );
#ifdef __DEBUG
	csIconObjList.lpcsName = "CS-ION";
#endif
	InitializeCriticalSection( &csCursorObjList );
#ifdef __DEBUG
	csCursorObjList.lpcsName = "CS-CUR";
#endif
	return TRUE;
}

// **************************************************
// 声明:void __DeInitialGdiIconCursorMgr( void )
// 参数:
// 	无
// 返回值:
//	无
// 功能描述:
//	与__InitialGdiIconCursorMgr相反,释放分配的资源
// 引用: 
//	
// ************************************************

void _DeInitialGdiIconCursorMgr( void )
{
	DeleteCriticalSection( &csIconObjList );
	DeleteCriticalSection( &csCursorObjList );
}

// **************************************************
// 声明:static HICON _CreateIconIndirect( LPICONINFO lpIconInfo, UINT uiName, BOOL bCopy )
// 参数:
// 	IN lpIconInfo - 包含ICON信息的ICONINFO结构指针
//	IN uiName - ICON id名
//	IN bCopy - 是否重新拷贝 一个 bitmap 句柄数据
// 返回值:
//	假如成功,返回句柄对象;否则,返回NULL
// 功能描述:
//	创建 ICON 对象
// 引用: 
//	
// ************************************************

static HICON _CreateIconIndirect( LPICONINFO lpIconInfo, UINT uiName, BOOL bCopy )
{
	_LPICONDATA lpIcon;

	lpIcon = (_LPICONDATA)BlockHeap_Alloc( hgwmeBlockHeap, 0, sizeof(_ICONDATA) );

	if( lpIcon )
	{		
		_BITMAPDATA * lpBitmap;
		//ICON类型
		lpIcon->fIcon = lpIconInfo->fIcon; // define as ICON, else as CURSOR
		//是否拷贝一个新的
		if( lpIconInfo->hbmColor && bCopy )
		{	//是
			lpBitmap = (_BITMAPDATA *)lpIconInfo->hbmColor;
		    lpIcon->hbmColor = WinGdi_CreateBitmap( lpBitmap->bmWidth, lpBitmap->bmHeight, lpBitmap->bmPlanes, lpBitmap->bmBitsPixel, lpBitmap->bmBits );
		}
		else
			lpIcon->hbmColor = lpIconInfo->hbmColor;
		//是否拷贝一个新的
		if( lpIconInfo->hbmMask && bCopy )
		{	//是
			lpBitmap = (_BITMAPDATA *)lpIconInfo->hbmMask;
		    lpIcon->hbmMask = WinGdi_CreateBitmap( lpBitmap->bmWidth, lpBitmap->bmHeight, lpBitmap->bmPlanes, lpBitmap->bmBitsPixel, lpBitmap->bmBits );
		}
		else
		    lpIcon->hbmMask = lpIconInfo->hbmMask;

		if( lpIcon->hbmMask && lpIcon->hbmColor )
		{	//初始化对象
			lpIcon->xHotspot = lpIconInfo->xHotspot;
			lpIcon->yHotspot = lpIconInfo->yHotspot;
			lpIcon->wIconName = uiName;
			
			if( lpIcon->fIcon )
			{	//加入Icon对象链表
				EnterCriticalSection( &csIconObjList );
				ObjList_Init( &lpIconObjList, &lpIcon->obj, OBJ_ICON, (ULONG)GetCallerProcess() );
				LeaveCriticalSection( &csIconObjList );
			}
			else
			{	//加入Cursor对象链表
				EnterCriticalSection( &csCursorObjList );
				ObjList_Init( &lpCursorObjList, &lpIcon->obj, OBJ_ICON, (ULONG)GetCallerProcess() );
				LeaveCriticalSection( &csCursorObjList );
			}
		}
		else
		{	//初始化对象失败,这里做清除工作
			if( lpIcon->hbmColor )
				WinGdi_DeleteObject( lpIcon->hbmColor );
			if( lpIcon->hbmMask )
				WinGdi_DeleteObject( lpIcon->hbmMask );

			BlockHeap_Free( hgwmeBlockHeap, 0, lpIcon, sizeof(_ICONDATA) );
			return NULL;
		}
	}
	return (HICON)lpIcon;
}

// **************************************************
// 声明:HICON WINAPI WinGdi_CreateIconIndirect( LPICONINFO lpIconInfo )
// 参数:
// 	IN lpIconInfo - 包含 ICON 对象信息的结构
// 返回值:
//	假如成功,返回句柄对象;否则,返回NULL
// 功能描述:
//	创建 ICON 对象
// 引用: 
//	系统API
// ************************************************

HICON WINAPI WinGdi_CreateIconIndirect( LPICONINFO lpIconInfo )
{
	return _CreateIconIndirect( lpIconInfo, -1, 1 );
}

// **************************************************
// 声明:BOOL WINAPI WinGdi_DestroyIcon( HICON hIcon )
// 参数:
// 	hIcon –图标句柄
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	破坏之前创建的图标
// 引用: 
//	系统API
// ************************************************
#define DEBUG_DESTROY_ICON 0
BOOL WINAPI WinGdi_DestroyIcon( HICON hIcon )
{	//由句柄得到对象指针
    _LPICONDATA lpIcon = _GetHICONPtr( hIcon );

	if( lpIcon )
	{
		if( Interlock_Decrement( (LPLONG)&lpIcon->obj.iRefCount ) == 0 )
		{	//当前没有对该对象的引用,释放它
			EnterCriticalSection( &csIconObjList );
			//从对象链表移出
			ObjList_Remove( &lpIconObjList, &lpIcon->obj );

			LeaveCriticalSection( &csIconObjList );
			//释放对象资源
			_FreeIconCursor( &lpIcon->obj, 0 );
		}
		else
		{	//仍然被使用
			WARNMSG( DEBUG_DESTROY_ICON, ( "WinGdi_DestroyIcon: current refcount:%d.\r\n", lpIcon->obj.iRefCount ) );
		}
		return TRUE;
	}
	else
	{
		WARNMSG( DEBUG_DESTROY_ICON, ("WinGdi_DestroyIcon : invalid hicon handle(0x%x).\r\n", hIcon) );
	}
	return FALSE;
}

// **************************************************
// 声明:BOOL WINAPI WinGdi_DestroyCursor( HCURSOR hCursor )
// 参数:
// 	hCursor –光标句柄
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	破坏之前创建的光标
// 引用: 
//	系统API
// ************************************************

BOOL WINAPI WinGdi_DestroyCursor( HCURSOR hCursor )
{	//由句柄得到对象指针
    _LPICONDATA lpIcon = _GetHICONPtr( (HICON)hCursor );

	if( lpIcon )
	{
		if( Interlock_Decrement( (LPLONG)&lpIcon->obj.iRefCount ) == 0 )
		{	//当前没有对该对象的引用,释放它
			EnterCriticalSection( &csCursorObjList );
			//从对象链表移出
			ObjList_Remove( &lpCursorObjList, &lpIcon->obj );
			LeaveCriticalSection( &csCursorObjList );
			//释放对象资源
			_FreeIconCursor( &lpIcon->obj, 0 );
		}
		else
		{	//仍然被使用
			WARNMSG( DEBUG_DESTROY_ICON, ( "WinGdi_DestroyCursor: current refcount:%d.\r\n", lpIcon->obj.iRefCount ) );
		}
		return TRUE;
	}
	else
	{
		WARNMSG( DEBUG_DESTROY_ICON, ("WinGdi_DestroyCursor : invalid hicon handle(0x%x).\r\n", hCursor) );
	}
	return FALSE;
}

// **************************************************
// 声明:static HANDLE _FindIconCursor( 
//								HINSTANCE hInst, 
//								LPOBJLIST * lppList,
//								UINT uiName, 
//								int cxDesired, 
//								int cyDesired )
// 参数:
//	IN hInst - 对象拥有者
//	IN lppList - 需要查找的对象链表
//	IN uiName - 对象名
//	IN cxDesired -	查找要求的对象宽度
//	IN cyDesired - 查找要求的对象高度
// 返回值:
//	假如成功,返回句柄对象;否则,返回NULL
// 功能描述:
//	按条件查找对象
// 引用: 
//	
// ************************************************

#define DEBUG_FIND_ICON_CURSOR 0
static HANDLE _FindIconCursor( HINSTANCE hInst, 
							   LPOBJLIST * lppList,
							   UINT uiName, 
							   int cxDesired, 
							   int cyDesired )
{
	LPOBJLIST lpObj = *lppList;

	DEBUGMSG( DEBUG_FIND_ICON_CURSOR, ( "_FindIconCursor: entry.\r\n" ) );

	while( lpObj )
	{
		_LPICONDATA lpIcon = (_LPICONDATA)lpObj;
		if( lpIcon &&
			lpIcon->hInst == hInst && 
			lpIcon->wIconName == uiName )
		{
			_LPBITMAPDATA lpbmp = _GetHBITMAPPtr( lpIcon->hbmMask );
			//是否符合条件 ?
			if( lpbmp &&
				IS_SIZE_MATCH( lpbmp->bmWidth, lpbmp->bmHeight, cxDesired, cyDesired ) )
			{	//找到
				return (HANDLE)lpIcon;
			}
		}
		//下一个对象
		lpObj = lpObj->lpNext;
	}
	return NULL;
}

// **************************************************
// 声明:static BOOL CALLBACK _FreeIconCursor( LPOBJLIST lpObj, LPARAM lParam )
// 参数:
// 	IN lpObj - 对象链表
//	IN lParam - 枚举对象回调函数所传的附加参数
// 返回值:
//	当需要继续枚举时,返回TRUE;否则,返回FALSE
// 功能描述:
//	枚举对象回调函数入口
// 引用: 
//	
// ************************************************
#define DEBUG_FREE_ICON_CURSOR 0
static BOOL CALLBACK _FreeIconCursor( LPOBJLIST lpObj, LPARAM lParam )
{
	// free mem
	//释放资源
	DeleteObject( ( (_LPICONDATA)lpObj )->hbmColor );
	DeleteObject( ( (_LPICONDATA)lpObj )->hbmMask );
	lpObj->objType = OBJ_NULL;
	BlockHeap_Free( hgwmeBlockHeap, 0, lpObj, sizeof(_ICONDATA) );

	if( lParam )
	{  // print warn message
		WARNMSG( DEBUG_FREE_ICON_CURSOR, ( "_FreeIconCursor:not free icon or cursor handle: 0x%x.\r\n", lpObj ) );
	}
	return TRUE;
}

// **************************************************
// 声明:void FreeInstanceIcon( HANDLE hOwner )
// 参数:
// 	IN hOwner - 对象拥有者
// 返回值:
//	无
// 功能描述:
//	释放拥有者的所有ICON资源(当进程退出时,系统会主动调用该函数)
// 引用: 
//	
// ************************************************

void FreeInstanceIcon( HANDLE hOwner )
{
	EnterCriticalSection( &csIconObjList );
	ObjList_Delete( &lpIconObjList, (ULONG)hOwner, _FreeIconCursor, 1 );
	LeaveCriticalSection( &csIconObjList );
}

// **************************************************
// 声明:void FreeInstanceCursor( HANDLE hOwner )
// 参数:
// 	IN hOwner - 对象拥有者
// 返回值:
//	无
// 功能描述:
//	释放拥有者的所有Cursor资源(当进程退出时,系统会主动调用该函数)
// 引用: 
//	
// ************************************************

void FreeInstanceCursor( HANDLE hOwner )
{
	EnterCriticalSection( &csCursorObjList );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -