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

2024-09-01 17:44

本文主要是介绍【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 的组合效果。

示例代码
usesWinapi.Windows, Vcl.Graphics, Vcl.Forms;function CreateCustomIcon: HICON;
varIconInfo: TIconInfo;MaskBitmap, ColorBitmap: TBitmap;
beginMaskBitmap := 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));// 配置IconInfoIconInfo.fIcon := True;IconInfo.xHotspot := 0;IconInfo.yHotspot := 0;IconInfo.hbmMask := MaskBitmap.Handle;IconInfo.hbmColor := ColorBitmap.Handle;// 使用CreateIconIndirect创建图标Result := CreateIconIndirect(@IconInfo);finallyMaskBitmap.Free;ColorBitmap.Free;end;
end;procedure TForm1.FormCreate(Sender: TObject);
varIconHandle: HICON;
beginIconHandle := CreateCustomIcon;// 在表单的图标中显示if IconHandle <> 0 thenbeginApplication.Icon.Handle := IconHandle;DestroyIcon(IconHandle);end;
end;
代码解释
  • MaskBitmap:
    • 它绘制了一个黑色的圆形在白色背景上。黑色的圆形区域表示显示 ColorBitmap 内容的区域,而白色的背景表示透明区域。
  • ColorBitmap:
    • 它完全填充了红色。在最终的图标中,MaskBitmap 黑色区域内将显示红色,白色区域内将是透明的。
最终的显示效果

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

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

3. 不同组合的效果

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

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

总结

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

这篇关于【Delphi】一种生成透明 Icon 图标方法、原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127619

相关文章

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D