Delphi 一种生成透明 Icon 图标方法、原理  
官方Delphi 学习QQ群: 682628230(三千人)
频道

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


Delphi】实现程序屏幕内容防止截图(禁止截屏)


在程序开发中,我们会遇到制作程序的主图标,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 则填充显示区域的颜色。通过组合这两者,你可以创建具有透明背景、特定形状和颜色的图标。在实际应用中,正确地理解和使用这两者,可以帮助你实现精确的图标设计。

————————————————


        

原文链接:https://blog.csdn.net/sensor_WU/article/details/141777455



推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.087622880935669 seconds