ICON合并(3)

合并ICON的另外一种方法,在win32api中要合并两个HICON是很方便的,程序如下:

HICON CombineIcon(
            HICON hBaseIcon,  //背景图标
            HICON hTopIcon,   //前景图标
            int iWidth,       //宽度
            int iHeight,      //高度
            COLORREF colorkey //透明色,如RGB(0,0,0)
            )
{
    HDC hdc = GetDC(NULL);
    //建立一个兼容DC,用于作图
    HDC memdc = CreateCompatibleDC(hdc);
    HBITMAP membmp=(HBITMAP)CreateCompatibleBitmap
                        (hdc, iWidth, iHeight);
    HBITMAP oldbmp = (HBITMAP)SelectObject(memdc,
                                        membmp);
    HBRUSH br = (HBRUSH)GetStockObject(colorkey);
    RECT rect;
    rect.left = 0;
    rect.right = iWidth;
    rect.top = 0;
    rect.bottom = iHeight;
    SelectObject(memdc, br);
    //填充透明色
    FillRect(hdc, &rect, br);
    DrawIconEx(memdc, 0, 0, hBaseIcon, iWidth,
                    iHeight, 0, NULL, DI_NORMAL); 
    DrawIconEx(memdc, 0, 0, hTopIcon , iWidth,
                    iHeight, 0, NULL, DI_NORMAL);
    SelectObject(memdc, oldbmp);
    ICONINFO info;
    info.fIcon = true;
    info.hbmMask = CreateBitmap(iWidth, iHeight,
                                    1, 1, NULL);
    info.hbmColor = membmp;
    //返回合并后的图标句柄
    return CreateIconIndirect(&info);
}

用LoadIcon函数即可从icon文件得到 HICON句柄,有了上面的代码,可以很方便的合并两个HICON并显示出来。但是,怎么把HICON保存为ico文件呢?用CImageList应该是可以实现,但是我做这道题时被要求只能用win32api,不能用MFC的东西。就必须用到GetIconInfo,然后一步一步获取ico文件中必须的相应信息。这其中有个问题,就是在获取图像数据时用到了GetDIBits,而这个函数中颜色表必须是系统预设的,不能自己指定颜色表,这样,就会导致颜色失真,因为系统自带的颜色表中颜色很少,而要合并的图标中的颜色很有可能就没有出现在这个颜色表中。没有试过CImageList,不知道它能否解决这个问题。

Comments