代码之家  ›  专栏  ›  技术社区  ›  dlanod

为什么GDI+的颜色会根据工具提示是否可见而变化?

  •  1
  • dlanod  · 技术社区  · 15 年前

    我正在用GDI+显示一个位图。从DLL资源加载位图后,我使用TransparentBlt将背景色(蓝色-#0000FF)设置为透明。在WindowsVista和更高版本上,这可以正常工作。

    但是,在我们正在测试的WindowsXP系统上,只有在显示任何工具提示(例如IE中的“title”属性,或将鼠标悬停在文件上时显示的Windows资源管理器工具提示等)时,此功能才起作用。其余时间背景色仍然是蓝色。

    以前有没有人遇到过这种情况,或者知道一种方法来阻止这种情况的发生,让蓝色正确地透明化?

    编辑:经过进一步的调查,我发现在WindowsXP中将颜色深度设置为16位的颜色而不是32位的颜色会导致TransparentBlt重新开始正常工作。显然,这不是一个理想的解决方案,指定什么颜色深度必须使用,但这是否给任何暗示,可能会发生什么?

    Edit2:包含代码示例。

    m_pGDIBitmap = new Gdiplus::Bitmap(_Module.m_hInst, MAKEINTRESOURCE(lImageResource));
    m_hMemDC = CreateCompatibleDC(hdc);
    
    Gdiplus::Graphics myGraphics(m_hMemDC);
    
    myGraphics.DrawImage(m_pGDIBitmap, 
        Gdiplus::Rect(0, 0, m_pGDIBitmap->GetWidth(), m_pGDIBitmap->GetHeight()), 
        0, 
        0,
        m_pGDIBitmap->GetWidth(), 
        m_pGDIBitmap->GetHeight(),
        Gdiplus::UnitPixel, &imAtt);
    
    SetStretchBltMode(hdc, HALFTONE);
    SetBrushOrgEx(hdc, rcBounds.left, rcBounds.top, NULL);
    TransparentBlt(hdc, rcBounds.left, rcBounds.top, iScaledWidth, iScaledHeight, m_hMemDC, 0, 0, iBitmapWidth, iBitmapHeight, GetPixel(m_hMemDC, 0, 0));
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   qbeuek    15 年前

    您必须显示一些示例代码-加载位图的代码和将其blit显示的代码。

    可能的替代解决方案:

    1. 确保位图以其本机格式加载而不进行转换。

    2. 允许进行转换,但不是向TransparentBlt提供硬编码的颜色值,而是生成位图的已知“透明”像素的GetPixel(如左上角),并将此值提供给TransparentBlt。

        2
  •  1
  •   dlanod    15 年前

    我最后做的更多的是一个解决办法,但它确实起了作用。我将背景颜色更改为黑色,并在DrawImage调用之前添加了以下代码:

    Gdiplus::ImageAttributes imAtt;
    imAtt.SetColorKey(Gdiplus::Color(0, 0, 0), Gdiplus::Color(0, 0, 0), Gdiplus::ColorAdjustTypeBitmap);
    

    出于某种原因,使用蓝色作为背景不起作用,而使用TransparentBlt单独使用任何一种颜色都不起作用,但是这种组合在我尝试的各种操作系统和颜色深度上正确地应用了透明度。