【问题标题】:How to draw a transparent image using WinAPI ImageList_DrawIndirect?如何使用 WinAPI ImageList_DrawIndirect 绘制透明图像?
【发布时间】:2011-03-21 08:01:21
【问题描述】:

我需要从本地 API 图像列表中绘制具有指定透明度级别的 32 位图像,但我不能这样做。我正在使用ImageList_DrawIndirect 调用和IMAGELISTDRAWPARAMS 结构中的ILS_ALPHA 图像状态传递给ImageList_DrawIndirect,但它似乎没有按预期工作。 v6 的 ComCtl 已“附加”到我的应用程序,因此这不是问题的原因。

怎么做?

我的代码如下所示:

Dim idp As IMAGELISTDRAWPARAMS

idp.cbSize = Len(idp)
idp.himl = m_hIml
idp.hdcDst = hdc
idp.rgbBk = -1
idp.x = xPixels
idp.y = yPixels
idp.i = 0
idp.fState = ILS_ALPHA
idp.Frame = 128

ImageList_DrawIndirect(idp)

它是 VB6,但没关系 - 事实上,我们目前只使用纯 WinAPI。

【问题讨论】:

    标签: image winapi transparency draw imagelist


    【解决方案1】:

    该代码在我的应用程序中非常适合我。我的意思是我的应用程序中有相同的代码,唯一的例外是我没有设置rgbBk

    我的猜测是,您的图像列表中的图像不知何故丢失了它们的 alpha 通道。

    我很惊讶您设置了rgbBk,因为我相信它对带有 alpha 的图像没有影响。

    【讨论】:

    • 也许问题真的出在图片上?我们需要使用特殊程序来准备它们吗?或者任何 32 位图标 (.ico) 都可以这样使用?
    • 问题可能出在图像或图像列表中。需要使用 ILC_COLOR32 标志创建图像列表。您如何将图标添加到图像列表中?
    • 大卫,非常感谢您的精彩回答。也许,这对你来说很明显,但对我来说不是:)。删除 idp.rgbBk = -1 有助于解决问题。当我自己尝试时,我不知道为什么我错过了。
    • 大卫,停下——不要那么快 :)!
    • 在Win7下可以,在WinXP下不行!!!我只看到具有指定透明度级别的半透明矩形,而不是真实图像。可能是什么?
    猜你喜欢
    • 2010-09-16
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 2013-03-26
    相关资源
    最近更新 更多