2010-02-03 3 views
0

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; 

Répondre

1

Utilisez la méthode Bitmap.MakeTransparent() sur les images lorsque vous les chargez. Vous devrez sélectionner la couleur correspondant à la couleur d'arrière-plan de ces images. Stocker les images au format PNG avec la transparence sélectionnée dans l'éditeur graphique serait un autre moyen.

+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

Questions connexes