Windows 7资源管理器中的图标透明度

时间:2012-05-15 10:24:20

标签: windows winapi contextmenu explorer loadimage

我在Windows 7上,我试图在我的上下文菜单中显示一个透明的图标,但它不起作用。

我正在尝试像这样使用LoadImage:

    m_hMenuBmp = (HBITMAP)::LoadImage(g_hInst, L"C:\\Users\\nicolas\\AppData\\Roaming\\MyApp\\icon.bmp", IMAGE_BITMAP, 16, 16, LR_LOADFROMFILE | LR_LOADTRANSPARENT );

我的icon.bmp设置为256色,背景为白色(255,255,255)... 我不知道为什么这不起作用......

我尝试过Raymon Chen的ARGB方法,但它既不起作用也没用!

int cx = GetSystemMetrics(SM_CXSMICON);
int cy = GetSystemMetrics(SM_CYSMICON);


BITMAPINFO bmi = {0};
bmi.bmiHeader.biSize =sizeof(bmi.bmiHeader);
bmi.bmiHeader.biWidth = cx;
bmi.bmiHeader.biHeight = cy;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;

DWORD *pBits;
m_hMenuBmp = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, (void **)&pBits, NULL , 0);

if (m_hMenuBmp)
{
    for (int y = 0; y < cy ; y++ )
    {
        for (int x = 0; x < cx; x++)
        {
            BYTE bAlpha = x * x * 255 / cx / cx;
            DWORD dv = (bAlpha << 24) | (bAlpha << 16) | bAlpha ;
            pBits[y *cx + x] - dv;
        }
    }
}

我不知道为什么......我的图标不会用这种方法显示..

2 个答案:

答案 0 :(得分:3)

我找到了一种轻松做到这一点的方法:

 HICON hIcon = (HICON)LoadImage( NULL,  L"icon.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE );

HDC hDC = ::GetDC( NULL );
m_hMenuBmp = ::CreateCompatibleBitmap( hDC, 16, 16 );

HDC hDCTemp = ::CreateCompatibleDC( hDC );
::ReleaseDC( NULL, hDC );

HBITMAP hBitmapOld = ( HBITMAP ) ::SelectObject( hDCTemp, m_hMenuBmp );
::DrawIconEx( hDCTemp, 0, 0, hIcon, 16, 16, 0, ::GetSysColorBrush( COLOR_MENU ), DI_NORMAL );

::SelectObject( hDCTemp, hBitmapOld );
::DeleteDC( hDCTemp );

答案 1 :(得分:1)

我能够让这个工作:

HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, "C:\\moo\\res\\bitmap1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_LOADTRANSPARENT | LR_LOADMAP3DCOLORS);
m_pic.SetBitmap(hBitmap);

技巧是LR_LOADMAP3DCOLORS和LR_LOADTRANSPARENT。顺便说一下,这是一个对话框。没有LR_LOADMAP3DCOLORS,我的白色背景保持白色。