📄 loadimg.c
字号:
/******************************************************
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 + -