在程序开发中,我们会遇到制作程序的主图标,windows下程序的图标给是要求是ico格式,也就是常说的Icon。本文介绍一种Delphi利用windos API生成icon的方法。
在制作ico图标的时候,我们需要两幅bitmap图片,一幅我们称作掩码图片,命名为:MaskBitmap
,另外一幅就是真正的图片,命名为:ColorBitmap
,掩码图片实现真正图片的透明功能。
MaskBitmap
和 ColorBitmap
在图标显示中的作用决定了图标的透明度和颜色。为了更好地理解这两个位图如何影响最终的图标显示效果,下面我通过具体的例子和解释来说明。
1. MaskBitmap
和 ColorBitmap
的作用
-
MaskBitmap
: 掩码位图,通常为 1 位 (黑白) 位图,用于定义图标的透明部分和不透明部分。- 白色部分 (1): 表示图标的透明区域,即该区域不显示图标的内容,显示背景。
- 黑色部分 (0): 表示图标的可见区域,即该区域会显示
ColorBitmap
的内容。
-
ColorBitmap
: 颜色位图,用于定义图标的颜色和图形内容。在MaskBitmap
标记为黑色的区域显示。
2. 示例代码及效果
我们通过一个简单的例子来演示 MaskBitmap
和 ColorBitmap
的组合效果。
示例代码
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. 不同组合的效果
以下是几种可能的 MaskBitmap
和 ColorBitmap
组合及其对应的效果:
- 全黑的
MaskBitmap
:整个图标都显示ColorBitmap
的内容。 - 全白的
MaskBitmap
:整个图标透明,不显示任何内容。 - 复杂形状的
MaskBitmap
:例如,一个星形的黑色区域和白色背景。图标会显示星形的ColorBitmap
内容,其他区域透明。
总结
MaskBitmap
控制图标的透明区域和显示区域,而 ColorBitmap
则填充显示区域的颜色。通过组合这两者,你可以创建具有透明背景、特定形状和颜色的图标。在实际应用中,正确地理解和使用这两者,可以帮助你实现精确的图标设计。