【Delphi】一种生成透明 Icon 图标方法、原理

在程序开发中,我们会遇到制作程序的主图标,windows下程序的图标给是要求是ico格式,也就是常说的Icon。本文介绍一种Delphi利用windos API生成icon的方法。

在制作ico图标的时候,我们需要两幅bitmap图片,一幅我们称作掩码图片,命名为:MaskBitmap,另外一幅就是真正的图片,命名为:ColorBitmap,掩码图片实现真正图片的透明功能。

MaskBitmapColorBitmap 在图标显示中的作用决定了图标的透明度和颜色。为了更好地理解这两个位图如何影响最终的图标显示效果,下面我通过具体的例子和解释来说明。

1. MaskBitmapColorBitmap 的作用

  • MaskBitmap: 掩码位图,通常为 1 位 (黑白) 位图,用于定义图标的透明部分和不透明部分。

    • 白色部分 (1): 表示图标的透明区域,即该区域不显示图标的内容,显示背景。
    • 黑色部分 (0): 表示图标的可见区域,即该区域会显示 ColorBitmap 的内容。
  • ColorBitmap: 颜色位图,用于定义图标的颜色和图形内容。在 MaskBitmap 标记为黑色的区域显示。

2. 示例代码及效果

我们通过一个简单的例子来演示 MaskBitmapColorBitmap 的组合效果。

示例代码
uses
  Winapi.Windows, Vcl.Graphics, Vcl.Forms;

function CreateCustomIcon: HICON;
var
  IconInfo: TIconInfo;
  MaskBitmap, ColorBitmap: TBitmap;
begin
  MaskBitmap := TBitmap.Create;
  ColorBitmap := TBitmap.Create;
  try
    // 设置位图大小
    MaskBitmap.SetSize(32, 32);
    MaskBitmap.PixelFormat := pf1bit;

    ColorBitmap.SetSize(32, 32);
    ColorBitmap.PixelFormat := pf32bit;

    // 设置MaskBitmap:黑色部分是显示区域,白色部分是透明区域
    MaskBitmap.Canvas.Brush.Color := clWhite;
    MaskBitmap.Canvas.FillRect(Rect(0, 0, 32, 32));
    MaskBitmap.Canvas.Brush.Color := clBlack;
    MaskBitmap.Canvas.Ellipse(0, 0, 32, 32);  // 绘制一个黑色的圆形,表示显示区域

    // 设置ColorBitmap:填充一个红色的背景
    ColorBitmap.Canvas.Brush.Color := clRed;
    ColorBitmap.Canvas.FillRect(Rect(0, 0, 32, 32));

    // 配置IconInfo
    IconInfo.fIcon := True;
    IconInfo.xHotspot := 0;
    IconInfo.yHotspot := 0;
    IconInfo.hbmMask := MaskBitmap.Handle;
    IconInfo.hbmColor := ColorBitmap.Handle;

    // 使用CreateIconIndirect创建图标
    Result := CreateIconIndirect(@IconInfo);
  finally
    MaskBitmap.Free;
    ColorBitmap.Free;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  IconHandle: HICON;
begin
  IconHandle := CreateCustomIcon;
  // 在表单的图标中显示
  if IconHandle <> 0 then
  begin
    Application.Icon.Handle := IconHandle;
    DestroyIcon(IconHandle);
  end;
end;
代码解释
  • MaskBitmap:
    • 它绘制了一个黑色的圆形在白色背景上。黑色的圆形区域表示显示 ColorBitmap 内容的区域,而白色的背景表示透明区域。
  • ColorBitmap:
    • 它完全填充了红色。在最终的图标中,MaskBitmap 黑色区域内将显示红色,白色区域内将是透明的。
最终的显示效果

假设你在一个桌面应用程序的窗口标题栏或任务栏中看到这个图标:

  • 背景区域MaskBitmap 的白色区域将显示为透明,因此背景颜色将透过图标显示出来。
  • 圆形区域MaskBitmap 的黑色区域将显示 ColorBitmap 中的内容,在本例中是红色,因此你会看到一个红色的圆形图标。

3. 不同组合的效果

以下是几种可能的 MaskBitmapColorBitmap 组合及其对应的效果:

  • 全黑的 MaskBitmap:整个图标都显示 ColorBitmap 的内容。
  • 全白的 MaskBitmap:整个图标透明,不显示任何内容。
  • 复杂形状的 MaskBitmap:例如,一个星形的黑色区域和白色背景。图标会显示星形的 ColorBitmap 内容,其他区域透明。

总结

MaskBitmap 控制图标的透明区域和显示区域,而 ColorBitmap 则填充显示区域的颜色。通过组合这两者,你可以创建具有透明背景、特定形状和颜色的图标。在实际应用中,正确地理解和使用这两者,可以帮助你实现精确的图标设计。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海纳老吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值