如何将两个HICON合二为一

时间:2010-11-19 20:36:22

标签: c++ windows

我想将一个HICON用作另一个HICON的叠加层,以创建结果HICON。结果HICON将用于“所有者绘制”控件(注意:它不使用图像列表)。叠加图标的透明度为RGB(0,255,0)。

如何在Native C ++中执行此操作(我只找到了显示如何使用托管代码执行此操作的源代码)。

2 个答案:

答案 0 :(得分:1)

(1)叠加图标

在Windows API的许多地方,都支持叠加图标(例如ListView和TreeView以及ImageList的帮助,还有in the shell

(2)正如汉斯所说
最直接的方式是

  • 在位图上创建内存DC
  • 将两个图标叠加在一起
  • 从位图创建图标

(3)如果你坚持

如果你坚持手动做(虽然我没有理由):

  • GetIconInfo获取基础位图。请注意,b& w图标需要特殊处理
  • GetObject获取HBITMAP的BITMAP。如果你还不坚持处理各种位图格式,你应该将它们转换为DIB部分。
  • 做你的魔法

答案 1 :(得分:1)

我普遍同意彼得臣的回答,并附上一些说明:

  1. 没有理由使用DIB(除非你通过改变它的位直接合成图像,而不是使用GDI函数绘图)。
  2. 您应该记住,GetIconInfo实际上会在您的流程中创建icon't位图的副本。当你不再需要时,你有责任删除它们。
  3. 除非您要将生成的HICON传递给标准控件或其他进程,否则无需创建此类控件。相反,最好使用位图(可能还有掩码)。
  4. 了解图标和位图之间的区别非常重要。

    • Bitmap是一个GDI对象。它在您的流程中有效。
    • Icon是User对象,其范围不限于您的进程。它包装一个位图,也可以选择一个掩码。

    有几种图标类型:

    1. 最简单的,由单个位图组成,按原样绘制。
    2. 位图+蒙版,蒙版标记实心/透明像素
    3. 32位位图,带alpha通道
    4. 单色位图+蒙版。位图+掩码定义了所谓的AND-XOR操作(在目标表面上执行)。
    5. 因此,在获得图标的内容(通过GetIconInfo)之后,您应该发现实际的图标类型,因为每个选项都需要不同的处理。