在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;
}
