代码之家  ›  专栏  ›  技术社区  ›  Matt Smith

如何将两个希康合并为一个希康

  •  0
  • Matt Smith  · 技术社区  · 14 年前

    我有一个HICON,我想用它作为另一个HICON的覆盖,来创建一个结果HICON。结果HICON将用于“owner draw”控件(注意:它不使用imagelist)。覆盖图标具有透明度颜色RGB(0,255,0)。

    我如何在本地C++中这样做(我只发现了一些源代码,这些代码显示了如何用托管代码来实现这一点)。

    2 回复  |  直到 14 年前
        1
  •  1
  •   valdo    14 年前

    我大体上同意彼得森的回答,并注意到:

    1. 没有理由使用DIBs(除非您是通过改变图像的位直接合成图像,而不是使用GDI函数绘制图像)。
    2. 你应该记住 GetIconInfo 实际上,在进程中创建图标的副本而不是位图。你有责任在不再需要的时候删除它们。
    3. 除非你能通过 HICON 无论是标准控件还是其他进程-都不需要创建这样的控件。相反,最好使用位图(可能还有遮罩)。

    理解图标和位图的区别很重要。

    • 位图是一个GDI对象。在你的程序中是有效的。
    • 图标是一个用户对象,其作用域不限于您的进程。它包装位图和(可选)遮罩。

    有几种图标类型:

    1. 最简单的,由一个位图组成,按原样绘制。
    2. 位图+遮罩,遮罩标记实心/透明像素
    3. 32位位图,带alpha通道
    4. 单色位图+遮罩。bitmap+mask定义了所谓的AND-XOR操作(在目标曲面上执行)。

    所以在你得到图标的内容之后 获取图标信息 )您应该发现实际的图标类型,因为每个选项都需要不同的处理。

        2
  •  1
  •   peterchen    14 年前

    (1) 覆盖图标

    在windows API的许多地方,都支持覆盖图标(例如ListView和TreeView) ImageList ,同时 in the shell )

    (2) 正如汉斯所说
    最艰难的方法是

    • 在位图上创建内存DC
    • 把两个图标画在一起
    • 从位图创建图标

    (3) 如果你坚持

    如果你坚持手动操作(尽管我看没有理由):

    • GetIconInfo 以获取底层位图。请注意,黑白图标需要特殊处理
    • GetObject 获取HBITMAP的位图。如果你不坚持处理各种位图格式,你应该把它们合并成DIB部分。
    • 施展你的魔法