想要在同一背景上放置几个透明色的图像

时间:2010-02-03 09:38:21

标签: c++ windows gdi+ transparency

我绝望地用GDI +搜索在同一背景上放置透明背景的几个图形。我之前没有任何Windows或图形编程(如游戏)的编程经验,因此找到解决方案更加困难。 GDI +具有透明色。 GDI +仅使用透明度信息在另一个图像上正确地对此颜色进行位图处理。然而,一旦进行了位图,第一张图像就不再透明了。如果您在同一背景上多次放置相同的图像,您将看到只有第一个放置是透明的。

我的问题是一次在背景上放置几个透明物体。您可以看到以下适用于一艘船的代码(nNrOfShips = 1;)。如果为此变量写入较大的值,则不会放置任何船只。

我应该如何修改代码?我也尝试使用Ship数组,但屏幕上没有出现任何船只。您可以通过使用具有(稍微)改变颜色的背景来创建自己的示例,并且只是透明地放置图像。我希望那个例子能帮到我。

这里是代码示例......

HDC hdcScreen = GetLockedScreen(); 

m_hdcShip = CreateCompatibleDC(hdcScreen); 
ReleaseLockedScreen(); 

// Draw the ship image on restored background 
Graphics grBkg(m_hdcNewBackground); 
grBkg.SetSmoothingMode(SmoothingModeHighQuality); 

// Restore new background 
BitBlt(m_hdcNewBackground, 0, 0,  
        GetWtsMetrics(wtsm_ScreenSizeX), GetWtsMetrics(wtsm_ScreenSizeY),  
        m_hdcSavedBackground, 0, 0, SRCCOPY);                                                           // 20100125 SAE 

BYTE nNrOfShips = 1;    // DATA->GetNrOfShips(); 
for (BYTE nShipId = 0; nShipId < nNrOfShips; nShipId++) 
{ 
        Ship ship = DATA->GetShipList()[nShipId]; 
        ShipModel shipModel = DATA->FindShipModel(ship.nShipModelId);           // 20100202 SAE 
        WORD nCurResId = DATA->FindCurShipResourceId(ship);                                     // 20100131 SAE 
        WORD nIndex = nCurResId - shipModel.nFirstResId;                                        // 20100131 SAE 
        assert(nIndex >= 0); 
        ShipResource shipRes = (*shipModel.pvectResource)[nIndex];                      // 20100202 SAE 

        // 20100126 SAE 
        // Always take the first (upper left) coordinates of the ship rectangle: 
        QuadrantVector &wpQuadrants =  
                *DATA->GetWallpapers()[DATA->SelectWallpaper()].pvectQuadrant; 
        do 
        {       // 20100115 SAE: Determine first the coordinates of the ship 
                ship.vectRectangle = DATA->RandomRectangleCoordinates(  
                                                shipModel.nHeight, shipModel.nWidth);
        } while (!DATA->AreCoordinatesValid(ship.vectRectangle, wpQuadrants) && 
                         !DATA->AreShipsTooClose(ship, DATA->GetShipList(), DATA->GetDistance())); 

        grBkg.TranslateTransform(ship.vectRectangle[0].fX,  
                                                        ship.vectRectangle[0].fY); 
        grBkg.RotateTransform(0);                                                                                       // 20100201 SAE 
        grBkg.DrawImage(shipRes.pimgPicture,
                       -shipModel.nWidth/2, -shipModel.nHeight/2); 

        // Determine bounding rectangle of ship after drawing on transformed page 
        // 20100125 SAE 
        Rect rcSrc(-shipModel.nWidth/2, -shipModel.nHeight/2,  
                                shipModel.nWidth, shipModel.nHeight); 
        TransformRect(&grBkg, &m_rcCurShip, &rcSrc,  
                                        CoordinateSpacePage, CoordinateSpaceWorld); 
}       // for 

DeleteDC(m_hdcShip); 
m_hdcShip = 0;

1 个答案:

答案 0 :(得分:1)

加载图像时,请在图像上使用Bitmap.MakeTransparent()方法。您需要选择这些图像的背景颜色。以图形编辑器中选择的透明度存储PNG格式的图像将是另一种方式。