Je cherche désespérément à placer plusieurs graphiques ayant un arrière-plan transparent sur le même fond avec GDI +. Je n'avais aucune expérience de programmation avec Windows ou programmation graphique (comme les jeux) auparavant, il est donc plus difficile de trouver une solution. GDI + a une couleur transparente. GDI + utilise uniquement les informations de transparence pour appliquer correctement cette couleur à une autre image. Une fois bitmapée, cependant, la première image n'est plus transparente. Si vous mettez plusieurs fois la même image sur le même arrière-plan, vous verrez que seul le premier emplacement était transparent.Vous voulez placer plusieurs images avec des couleurs transparentes sur le même fond
Mon problème est de placer plusieurs objets transparents sur un arrière-plan à la fois. Vous pouvez voir le code ci-dessous qui fonctionne pour un navire (nNrOfShips = 1;). Si vous écrivez une valeur plus grande pour cette variable, aucun navire ne sera placé.
Comment modifier le code? J'ai également essayé d'utiliser des tableaux de vaisseaux, mais aucun vaisseau n'apparaît à l'écran. Vous pouvez créer votre propre exemple en utilisant un fond avec des couleurs (légèrement) changeantes et simplement placer une image de manière transparente. J'espère que cet exemple m'aidera.
Voici l'exemple de code ...
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;
Merci pour votre réponse! Les bitmaps sont déjà transparents, car nous utilisons Paint.NET où nous pouvons définir une couleur transparente. Cependant, je cherche un moyen de placer plusieurs images transparentes sur le même arrière-plan, et ce que j'ai vécu depuis maintenant était de gros problèmes. Je ne comprends pas comment une tâche si facile est si difficile. Je n'ai pas de livre (connaissez-vous un bon livre GDI +?), Et je ne connais personne qui possède l'expérience GDI +. Donc, j'ai des ennuis. Maintenant, j'ai découvert que le m_hdcNewScreen créé par un CreateCompatibleDC() peut être le problème, mais je verrai ... – Sae1962