合并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,不知道它能否解决这个问题。
Last modified on 2007-05-31