Хотите разместить несколько изображений с прозрачным цветом на одном фоне - PullRequest
0 голосов
/ 03 февраля 2010

Я отчаянно ищу место для нескольких графиков с прозрачным фоном на одном фоне с GDI +. У меня не было опыта программирования под Windows или графическое программирование (например, игры), поэтому найти решение было сложнее. GDI + имеет прозрачный цвет. GDI + использует информацию о прозрачности только для правильного отображения этого цвета на другом изображении. Однако после растрового изображения первое изображение перестает быть прозрачным. Если вы поместите одно и то же изображение несколько раз на один и тот же фон, вы увидите, что только первое размещение было прозрачным.

Моя проблема заключается в размещении нескольких прозрачных объектов на фоне одновременно. Вы можете увидеть код ниже, который работает для одного корабля (nNrOfShips = 1;). Если вы напишите большее значение для этой переменной, корабль не будет размещен.

Как мне изменить код? Я также пытался использовать корабельные массивы, но на экране не было ни одного корабля. Вы можете создать свой собственный пример, используя фон с (слегка) изменяющимся цветом и просто поместив изображение прозрачно. Я надеюсь, что этот пример поможет мне.

Вот пример кода ...

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 Ответ

1 голос
/ 03 февраля 2010

Используйте метод Bitmap.MakeTransparent () для изображений при их загрузке.Вам нужно будет выбрать цвет фона для этих изображений.Хранение изображений в формате PNG с прозрачностью, выбранной в графическом редакторе, может быть другим способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...