合并两个ICON

      记得 Windows 里的快捷方式么,将你的程序拖到桌面上建立一个快捷方式,不论程序用的是什么IconMicrosoft都会在Icon左下脚加上一个小小的箭头,很好玩是不是?下面我提供两种方式来实现这种效果:

1. 直接利用HICON CreateIconIndirect ( PICONINFO piconinfo );

None.gif HICON CombineIcon(
None.gif                 HICON hBaseIcon, 
// 底层Icon,yi:xFc(`WDM教育N=yz"放在下面的那个
None.gif

None.gif                 HICON hTopIcon, 
// 上层Icon,盖在上面的那个 None.gif
None.gif                 
None.gif
None.gif                 
int  iWidth,  // Icon的宽度
None.gif

None.gif                 
int  iHeight,  // Icon的高度
None.gif

None.gif                 COLORREF colorkey
// 透明色
None.gif

None.gif                 )
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    HDC hdc 
= GetDC(NULL);
InBlock.gif
InBlock.gif    //建立一个兼容DC,用于作图
InBlock.gif
InBlock.gif    HDC memdc 
= CreateCompatibleDC(hdc);
InBlock.gif
InBlock.gif     //注意,这里的参数dc不能为兼容dc,否则就是单色位图
InBlock.gif
InBlock.gif    HBITMAP membmp 
= (HBITMAP)CreateCompatibleBitmap(hdc, 3232);
InBlock.gif
InBlock.gif    HBITMAP oldbmp 
= (HBITMAP)SelectObject(memdc, membmp);
InBlock.gif
InBlock.gif    HBRUSH br 
= (HBRUSH)GetStockObject(colorkey);    
InBlock.gif    
InBlock.gif    RECT rect;
InBlock.gif    rect.left 
= 0;
InBlock.gif    rect.right 
= 32;
InBlock.gif    rect.top 
= 0;
InBlock.gif    rect.bottom 
= 32;
InBlock.gif
InBlock.gif    SelectObject(memdc, br);
InBlock.gif
InBlock.gif    //填充透明色
InBlock.gif

InBlock.gif    FillRect(dc, 
&rcct, br); 

InBlock.gif
InBlock.gif    DrawIconEx(memdc, 
00, hBaseIcon, iWidth, iHeight0, NULL, DI_NORMAL);  
InBlock.gif
InBlock.gif    DrawIconEx(memdc, 
00, hTopIcon , iWidth, iHeight0, NULL, DI_NORMAL);
InBlock.gif   
InBlock.gif     //保持图片
InBlock.gif
InBlock.gif    SelectObject(memdc, oldbmp);
InBlock.gif
InBlock.gif    ICONINFO info;
InBlock.gif
InBlock.gif    info.fIcon 
= true;
InBlock.gif    info.hbmMask 
= CreateBitmap(323211, NULL);
InBlock.gif    info.hbmColor 
= membmp;
InBlock.gif
InBlock.gif    return
 CreateIconIndirect(&info);
InBlock.gif
InBlock.gif
ExpandedBlockEnd.gif}


2. 利用ImageList.ExtractIcon 将bitmap 转化成Icon

ContractedBlock.gifExpandedBlockStart.gif
None.gifHICON CombineIcon(                
                  HICON hBaseIcon, 
//底层Icon,yi:xFc(`WDM教育N=yz"放在下面的那个
None.gif

None.gif                 HICON hTopIcon, 
//上层Icon,盖在上面的那个None.gif
None.gif                
None.gif
None.gif                 
int iWidth, //Icon的宽度
None.gif

None.gif                 
int iHeight, //Icon的高度
None.gif

None.gif                 COLORREF colorkey
//透明色
None.gif

None.gif                 )
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
InBlock.gif    HBITMAP         bmp;
InBlock.gif    HDC             dc;
InBlock.gif    HBRUSH          br;
InBlock.gif    RECT            rc;
InBlock.gif
InBlock.gif    HDC             hdc = GetDC (NULL);

InBlock.gif
InBlock.gif    
//建立一个兼容DC,用于作图
InBlock.gif   
InBlock.gif

InBlock.gif    dc 
= CreateCompatibleDC(hdc);
InBlock.gif
InBlock.gif    
//生成一空白BMP图
InBlock.gif

InBlock.gif    bmp 
= CreateCompatibleBitmap(hdc, iWidth, iHeight);
InBlock.gif
InBlock.gif
InBlock.gif
InBlock.gif    
//建立一个实色的刷子
InBlock.gif

InBlock.gif    br 
= CreateSolidBrush(colorkey);
InBlock.gif
InBlock.gif
InBlock.gif
InBlock.gif    
//生成一个Icon大小的矩形
InBlock.gif

InBlock.gif    rc.left 
= 0;
InBlock.gif
InBlock.gif    rc.top 
= 0;
InBlock.gif
InBlock.gif    rc.bottom 
= iHeight;
InBlock.gif
InBlock.gif    rc.right 
= iWidth;
InBlock.gif
InBlock.gif
InBlock.gif
InBlock.gif    
//将空白BMP选入DC,
InBlock.gif

InBlock.gif    HBITMAP            oldbmp 
= (HBITMAP)SelectObject(dc, bmp);
InBlock.gif
InBlock.gif    
//填充透明色
InBlock.gif

InBlock.gif    FillRect(dc, 
&rc, br); 
InBlock.gif
InBlock.gif    
// 在BMP上画底层Icon
InBlock.gif

InBlock.gif    DrawIconEx(dc, 
00, hBaseIcon, iWidth, iHeight, 0, NULL, DI_NORMAL);     
InBlock.gif
InBlock.gif    
//在BMP上画上层Icon
InBlock.gif

InBlock.gif    DrawIconEx(dc, 
00, hTopIcon, iWidth, iHeight, 0, NULL, DI_NORMAL);     
InBlock.gif
InBlock.gif
InBlock.gif
InBlock.gif    
//保存画好的BMP
InBlock.gif

InBlock.gif    SelectObject(dc, oldbmp);
InBlock.gif   

InBlock.gif    
// 注意参数使用ILC_COLORDDB,这样可以支持高彩Icon(256活256色以上)
InBlock.gif

InBlock.gif    HIMAGELIST ImageList;
InBlock.gif
InBlock.gif    ImageList_Create(ImageList, iWidth, iHeight, ILC_MASK
|ILC_COLORDDB, 10);
InBlock.gif
InBlock.gif    
//将画好的BMP存入image list,并设置透明色
InBlock.gif

InBlock.gif    ImageList_Add(ImageList, bmp, colorkey);
InBlock.gif
InBlock.gif    
//从image list中获取Icon
InBlock.gif

InBlock.gif   

InBlock.gif    
return  ImageList_ExtractIcon(0, ImageList, 0);

ExpandedBlockEnd.gif}


转载于:https://www.cnblogs.com/Jianchidaodi/archive/2006/11/15/560776.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值