gpt4 book ai didi

c++ - 想在同一背景上放置多个透明颜色的图像

转载 作者:行者123 更新时间:2023-11-28 08:30:51 26 4
gpt4 key购买 nike

我正在绝望地寻找放置几个具有透明背景的图形与 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;

最佳答案

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

关于c++ - 想在同一背景上放置多个透明颜色的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2190958/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com