我绝望地用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;
答案 0 :(得分:1)
加载图像时,请在图像上使用Bitmap.MakeTransparent()方法。您需要选择这些图像的背景颜色。以图形编辑器中选择的透明度存储PNG格式的图像将是另一种方式。