在Win2K下面Load一个32bit的图标会出现黑边,下面给出的这个函数可以取代LoadImage加载32位ICON但是在2K下面不会出现黑边:)
#include "StdAfx.h"
// Copied from amvideo.h
#define LINE_BYTES( Width, BitCt ) (long)( ((long)Width*BitCt+31)/32 * 4 )
#define WIDTHBYTES(bits) ((DWORD)(((bits)+31) & (~31)) / 8) 


HICON LoadIcon(HMODULE hModule, LPCTSTR lpszResource, UINT cx, UINT cy, UINT fuLoad = LR_DEFAULTCOLOR)
...{
if(hModule == NULL || lpszResource == NULL)
return NULL;
//Load the Icon Group firstly.
HRSRC hResource = ::FindResource(hModule, lpszResource, RT_GROUP_ICON);
HGLOBAL hMemGroup = ::LoadResource(hModule, hResource);
LPVOID lpResourceGroup = ::LockResource(hMemGroup);
UINT nID = ::LookupIconIdFromDirectoryEx((PBYTE)lpResourceGroup, TRUE, cx, cy, fuLoad);
HRSRC hRes = ::FindResource(hModule, MAKEINTRESOURCE(nID), RT_ICON);
DWORD dwError = GetLastError();
if(hRes == NULL)
return 0;
HGLOBAL hGlobal = ::LoadResource(hModule, hRes);
if(hGlobal == NULL)
return 0;
BYTE* lpData = (BYTE*)::LockResource(hGlobal);
ULONG ulSize = ::SizeofResource(hModule, hRes);
BYTE* pBmpInfoStart = lpData;
BYTE* pNewDIB = NULL;
BITMAPINFOHEADER* pHeader = (BITMAPINFOHEADER*)pBmpInfoStart;
if(_winmajor == 5 && _winminor == 0 && pHeader->biBitCount == 32) // For Win2k 32bit only
...{
int nWidth = pHeader->biWidth;
int nHeight = pHeader->biHeight / 2;
int nLineByte32 = LINE_BYTES(nWidth, 32);
int nLineByte24 = LINE_BYTES(nWidth, 24);
pHeader->biBitCount = 24;
if(nWidth <= 0 || nHeight <= 0 )
return NULL;
int nRemainMask = ulSize - sizeof(BITMAPINFOHEADER) - nWidth * nLineByte32;
pNewDIB = new BYTE[sizeof(BITMAPINFOHEADER) + nWidth * nLineByte24 + nRemainMask];
memcpy(pNewDIB, pHeader, sizeof(BITMAPINFOHEADER));
memcpy(pNewDIB + sizeof(BITMAPINFOHEADER) + nWidth * nLineByte24,
pBmpInfoStart + sizeof(BITMAPINFOHEADER) + nWidth * nLineByte32, nRemainMask);
BYTE *pData24 = pNewDIB + sizeof(BITMAPINFOHEADER);
BYTE *pData32 = (BYTE*)(pHeader + 1);
for(int i =0; i <nHeight; ++i)
...{
BYTE *pLine24 = pData24;
BYTE *pLine32 = pData32;
BYTE *pLine32Last = pLine32 + nLineByte32;
while (pLine32 < pLine32Last) 
...{
unsigned char ba = *(pLine32 + 3);
double da = ((double)(ba)) / 255;
if(da > 0)
...{
double fda = 1 - da;
*(pLine24++) = (*(pLine32++)) * da + 255 * fda;
*(pLine24++) = (*(pLine32++)) * da + 255 * fda;
*(pLine24++) =(*(pLine32++)) * da + 255 * fda;
}
else
...{
*(pLine24++) = (*(pLine32++));
*(pLine24++) = (*(pLine32++));
*(pLine24++) =(*(pLine32++));
}
pLine32++;
}
pData24 += nLineByte24;
pData32 += nLineByte32;
}
pBmpInfoStart = pNewDIB;
ulSize = sizeof(BITMAPINFOHEADER) + nWidth * nLineByte24 + nRemainMask;
}
HICON hIcon = CreateIconFromResourceEx(pBmpInfoStart, ulSize, TRUE,
0x00030000, (*(LPBITMAPINFOHEADER)pBmpInfoStart).biWidth,
(*(LPBITMAPINFOHEADER)pBmpInfoStart).biHeight / 2, 0);
if(pNewDIB != NULL)
delete [] pNewDIB;
return hIcon;
}
本文介绍了一个替代LoadImage的函数,用于在Windows 2000系统中加载32位图标时避免出现黑边的问题。通过调整图标数据格式,确保了图标在不同分辨率和颜色深度下的正确显示。
1万+

被折叠的 条评论
为什么被折叠?



