解决Windows 2k Load 32bit Icon的问题

在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 / 20);

    
if(pNewDIB != NULL)
        delete [] pNewDIB;

    
return hIcon;
}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值