312 lines
10 KiB
C++
312 lines
10 KiB
C++
//+----------------------------------------------------------------------------
|
|
//
|
|
// File: image.cpp
|
|
//
|
|
// Module: CMUTIL.DLL
|
|
//
|
|
// Synopsis: Common image loading routines
|
|
//
|
|
// Copyright (c) 1997-1999 Microsoft Corporation
|
|
//
|
|
// Author: nickball Created 03/30/98
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
|
|
#include "cmmaster.h"
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CmLoadImageA
|
|
//
|
|
// Synopsis: ANSI Wrapper for LoadImage API which loads a resource based upon
|
|
// pszSpec which can be any of 3 formats:
|
|
//
|
|
// 1) Filename
|
|
// 2) Resource ID name
|
|
//
|
|
// Arguments: hMainInst - Our application instance handle
|
|
// pszSpec - The name of the resource
|
|
// nResType - The resource type
|
|
// nCX - Resource X dimension (ie. 32 X 32 icon)
|
|
// nCY - Resource Y dimension (ie. 32 X 32 icon)
|
|
//
|
|
// Notes: Now includes hInst of main app for portability, due to different OS
|
|
// implementations of GetModuleHandle, the 16-bit compilation would grab
|
|
// default icons (ie. Question Mark) from the system dll.
|
|
//
|
|
// Returns: TRUE on Success
|
|
//
|
|
// History: a-nichb Re-Written 03/21/97
|
|
// quintinb Implemented Wide/ANSI forms 04/08/99
|
|
// sumitc cleanup 03/14/2000
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HANDLE CmLoadImageA(HINSTANCE hMainInst, LPCSTR pszSpec, UINT nResType, UINT nCX, UINT nCY)
|
|
{
|
|
HANDLE hRes = NULL;
|
|
|
|
// Ensure that the resource is one we can handle
|
|
MYDBGASSERT(nResType == IMAGE_BITMAP || nResType == IMAGE_ICON);
|
|
// enforce that icons can only be 16x16 or 32x32.
|
|
MYDBGASSERT(nResType != IMAGE_ICON ||
|
|
((GetSystemMetrics(SM_CXICON) == (int) nCX && GetSystemMetrics(SM_CYICON) == (int) nCY)) ||
|
|
(GetSystemMetrics(SM_CXSMICON) == (int) nCX && GetSystemMetrics(SM_CYSMICON) == (int) nCY));
|
|
|
|
if (NULL == pszSpec)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
DWORD dwFlags = 0;
|
|
|
|
if (HIWORD(PtrToUlong(pszSpec)))
|
|
{
|
|
if (NULL == *pszSpec)
|
|
{
|
|
return NULL;
|
|
}
|
|
CMASSERTMSG(NULL == CmStrchrA(pszSpec, ','), TEXT("dll,id syntax no longer supported "));
|
|
|
|
// If the HIWORD is empty, it's a resource ID, else it is a string.
|
|
dwFlags |= LR_LOADFROMFILE;
|
|
}
|
|
|
|
if (nResType == IMAGE_BITMAP)
|
|
{
|
|
dwFlags |= LR_CREATEDIBSECTION;
|
|
}
|
|
|
|
// Apparently, this is intended to cause the low-order word of the
|
|
// name to used as an OEM image identifier by LoadImage on Win95.
|
|
|
|
HINSTANCE hInstTmp = (dwFlags & LR_LOADFROMFILE) ? NULL : hMainInst;
|
|
|
|
hRes = LoadImageA(hInstTmp, pszSpec, nResType, nCX, nCY, (UINT) dwFlags);
|
|
|
|
#ifdef DEBUG
|
|
if (!hRes)
|
|
{
|
|
if (dwFlags & LR_LOADFROMFILE)
|
|
{
|
|
CMTRACE3A("LoadImage(hInst=0x%x, pszSpec=%S, dwFlags|dwImageFlags=0x%x) failed.", hInstTmp, pszSpec, dwFlags);
|
|
}
|
|
else
|
|
{
|
|
CMTRACE3A("LoadImage(hInst=0x%x, pszSpec=0x%x, dwFlags|dwImageFlags=0x%x) failed.", hInstTmp, pszSpec, dwFlags);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
return hRes;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CmLoadImageW
|
|
//
|
|
// Synopsis: Wide Wrapper for LoadImage API which loads a resource based upon
|
|
// pszSpec which can be any of 2 formats:
|
|
//
|
|
// 1) Filename
|
|
// 2) Resource ID name
|
|
//
|
|
// Arguments: hMainInst - Our application instance handle
|
|
// pszSpec - The name of the resource
|
|
// nResType - The resource type
|
|
// nCX - Resource X dimension (ie. 32 X 32 icon)
|
|
// nCY - Resource Y dimension (ie. 32 X 32 icon)
|
|
//
|
|
// Notes: Now includes hInst of main app for portability, due to different OS
|
|
// implementations of GetModuleHandle, the 16-bit compilation would grab
|
|
// default icons (ie. Question Mark) from the system dll.
|
|
//
|
|
// Returns: TRUE on Success
|
|
//
|
|
// History: a-nichb Re-Written 03/21/1997
|
|
// quintinb Implemented Wide/ANSI forms 04/08/1999
|
|
// sumitc cleanup 03/14/2000
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HANDLE CmLoadImageW(HINSTANCE hMainInst, LPCWSTR pszSpec, UINT nResType, UINT nCX, UINT nCY)
|
|
{
|
|
HANDLE hRes = NULL;
|
|
|
|
// Ensure that the resource is one we can handle
|
|
MYDBGASSERT(nResType == IMAGE_BITMAP || nResType == IMAGE_ICON);
|
|
// enforce that icons can only be 16x16 or 32x32.
|
|
MYDBGASSERT(nResType != IMAGE_ICON ||
|
|
((GetSystemMetrics(SM_CXICON) == (int) nCX && GetSystemMetrics(SM_CYICON) == (int) nCY)) ||
|
|
(GetSystemMetrics(SM_CXSMICON) == (int) nCX && GetSystemMetrics(SM_CYSMICON) == (int) nCY));
|
|
|
|
if (NULL == pszSpec)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
DWORD dwFlags = 0;
|
|
|
|
if (HIWORD(PtrToUlong(pszSpec)))
|
|
{
|
|
if (NULL == *pszSpec)
|
|
{
|
|
return NULL;
|
|
}
|
|
CMASSERTMSG(NULL == CmStrchrW(pszSpec, L','), TEXT("dll,id syntax no longer supported "));
|
|
|
|
// If the HIWORD is empty, it's a resource ID, else it is a string.
|
|
dwFlags |= LR_LOADFROMFILE;
|
|
|
|
}
|
|
|
|
if (nResType == IMAGE_BITMAP)
|
|
{
|
|
dwFlags |= LR_CREATEDIBSECTION;
|
|
}
|
|
|
|
// Apparently, this is intended to cause the low-order word of the
|
|
// name to used as an OEM image identifier by LoadImage on Win95.
|
|
|
|
HINSTANCE hInstTmp = (dwFlags & LR_LOADFROMFILE) ? NULL : hMainInst;
|
|
|
|
hRes = LoadImageU(hInstTmp, pszSpec, nResType, nCX, nCY, (UINT) dwFlags);
|
|
|
|
#ifdef DEBUG
|
|
if (!hRes)
|
|
{
|
|
if (dwFlags & LR_LOADFROMFILE)
|
|
{
|
|
CMTRACE3W(L"LoadImage(hInst=0x%x, pszSpec=%s, dwFlags|dwImageFlags=0x%x) failed.", hInstTmp, pszSpec, dwFlags);
|
|
}
|
|
else
|
|
{
|
|
CMTRACE3W(L"LoadImage(hInst=0x%x, pszSpec=0x%x, dwFlags|dwImageFlags=0x%x) failed.", hInstTmp, pszSpec, dwFlags);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
return hRes;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CmLoadIconA
|
|
//
|
|
// Synopsis: This function loads a large icon from the given file path or
|
|
// the given instance handle and resource ID.
|
|
//
|
|
// Arguments: HINSTANCE hInst - Instance Handle
|
|
// LPCSTR pszSpec - either filename path or a resource ID, see
|
|
// CmLoadImage for details.
|
|
//
|
|
// Returns: HICON - Handle to an Icon on Success, NULL on Failure
|
|
//
|
|
// History: quintinb Created Header 01/13/2000
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
HICON CmLoadIconA(HINSTANCE hInst, LPCSTR pszSpec)
|
|
{
|
|
return ((HICON) CmLoadImageA(hInst,
|
|
pszSpec,
|
|
IMAGE_ICON,
|
|
GetSystemMetrics(SM_CXICON),
|
|
GetSystemMetrics(SM_CYICON)));
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CmLoadIconW
|
|
//
|
|
// Synopsis: This function loads a large icon from the given file path or
|
|
// the given instance handle and resource ID.
|
|
//
|
|
// Arguments: HINSTANCE hInst - Instance Handle
|
|
// LPCWSTR pszSpec - either filename path or a resource ID, see
|
|
// CmLoadImage for details.
|
|
//
|
|
// Returns: HICON - Handle to an Icon on Success, NULL on Failure
|
|
//
|
|
// History: quintinb Created Header 01/13/2000
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
HICON CmLoadIconW(HINSTANCE hInst, LPCWSTR pszSpec)
|
|
{
|
|
return ((HICON) CmLoadImageW(hInst,
|
|
pszSpec,
|
|
IMAGE_ICON,
|
|
GetSystemMetrics(SM_CXICON),
|
|
GetSystemMetrics(SM_CYICON)));
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CmLoadSmallIconA
|
|
//
|
|
// Synopsis: This function loads a small icon from the given file path or
|
|
// the given instance handle and resource ID.
|
|
//
|
|
// Arguments: HINSTANCE hInst - Instance Handle
|
|
// LPCWSTR pszSpec - either filename path or a resource ID, see
|
|
// CmLoadImage for details.
|
|
//
|
|
// Returns: HICON - Handle to an Icon on Success, NULL on Failure
|
|
//
|
|
// History: quintinb Created Header 01/13/2000
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
HICON CmLoadSmallIconA(HINSTANCE hInst, LPCSTR pszSpec)
|
|
{
|
|
HICON hRes = NULL;
|
|
|
|
hRes = (HICON) CmLoadImageA(hInst,
|
|
pszSpec,
|
|
IMAGE_ICON,
|
|
GetSystemMetrics(SM_CXSMICON),
|
|
GetSystemMetrics(SM_CYSMICON));
|
|
if (!hRes)
|
|
{
|
|
hRes = CmLoadIconA(hInst, pszSpec);
|
|
}
|
|
|
|
return hRes;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CmLoadSmallIconW
|
|
//
|
|
// Synopsis: This function loads a small icon from the given file path or
|
|
// the given instance handle and resource ID.
|
|
//
|
|
// Arguments: HINSTANCE hInst - Instance Handle
|
|
// LPCWSTR pszSpec - either filename path or a resource ID, see
|
|
// CmLoadImage for details.
|
|
//
|
|
// Returns: HICON - Handle to an Icon on Success, NULL on Failure
|
|
//
|
|
// History: quintinb Created Header 01/13/2000
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
HICON CmLoadSmallIconW(HINSTANCE hInst, LPCWSTR pszSpec)
|
|
{
|
|
HICON hRes = NULL;
|
|
|
|
hRes = (HICON) CmLoadImageW(hInst,
|
|
pszSpec,
|
|
IMAGE_ICON,
|
|
GetSystemMetrics(SM_CXSMICON),
|
|
GetSystemMetrics(SM_CYSMICON));
|
|
if (!hRes)
|
|
{
|
|
hRes = CmLoadIconW(hInst, pszSpec);
|
|
}
|
|
|
|
return hRes;
|
|
}
|
|
|
|
|
|
|
|
|