nur eine Bitmap wird transparent!?



  • Ich hab mal wieder ein kleines Problem...Ich will mehrere Figuren vor einem Hintergrund ausgeben nun soll aber der störrende schwarze rand um die Figuren verschwinden, hab mir dazu eine Funktion aus dem Netz gesucht die schein auch zu funktionieren aber leider wird dann nur eine Figur(mann1) durchsichtig bei den anderen tut sich nix
    muss ich vll die Device Contexte irgendwie entleeren bevor ich darüber ein neues Bitmap transparent machen kann??

    hier mal meine Ausgabe vll findet ihr den Fehler

    void CGameDlg::Ausgabe()
    {
    CClientDC windowDC (this);
    CDC backBufferDC,
    hintergrundDC,
    mannDC,
    mann2DC,
    patroneDC,
    maskDC,
    orDC,
    tempDC;

    CBitmap maskBitmap,
    orBitmap,
    tempBitmap;

    CRect rect;
    BITMAP bm;

    backBufferDC.CreateCompatibleDC (&windowDC);
    backBufferDC.SelectObject (&m_BackBuffer);

    hintergrundDC.CreateCompatibleDC (&windowDC);
    hintergrundDC.SelectObject (&m_Hintergrund);

    mannDC.CreateCompatibleDC (&windowDC);
    mannDC.SelectObject (m_Mann [m_Index]);

    mann2DC.CreateCompatibleDC (&windowDC);
    mann2DC.SelectObject (m_Mann2 [m2_Index]);

    patroneDC.CreateCompatibleDC (&windowDC);
    patroneDC.SelectObject (m_Patrone [p_Index]);

    m_Mann [m_Index].GetBitmap (&bm);

    maskBitmap.CreateBitmap (bm.bmWidth, bm.bmHeight, 1, 1, NULL);

    maskDC.CreateCompatibleDC (&windowDC);
    maskDC.SelectObject (&maskBitmap);

    orBitmap.CreateCompatibleBitmap (&windowDC, bm.bmWidth, bm.bmHeight);
    orDC.CreateCompatibleDC (&windowDC);
    orDC.SelectObject (&orBitmap);

    tempBitmap.CreateCompatibleBitmap (&windowDC, bm.bmWidth, bm.bmHeight);
    tempDC.CreateCompatibleDC (&windowDC);
    tempDC.SelectObject (&tempBitmap);

    m_Hintergrund.GetBitmap (&bm);
    backBufferDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &hintergrundDC, 0, 0, SRCCOPY);

    m_Mann [m_Index].GetBitmap (&bm);

    mannDC.SetBkColor (RGB (0x0, 0x0, 0x0)); //schwarzer Hintergrund wird transparent

    maskDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &mannDC, 0, 0, SRCCOPY);

    orDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &mannDC, 0, 0, SRCCOPY);
    orDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &maskDC, 0, 0, 0x220326);

    tempDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &backBufferDC, m_X, m_Y, SRCCOPY);
    tempDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &maskDC, 0, 0, SRCAND);
    tempDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &orDC, 0, 0, SRCPAINT);

    backBufferDC.BitBlt (m_X, m_Y, bm.bmWidth, bm.bmHeight, &tempDC, 0, 0, SRCCOPY);

    m_Mann2 [m2_Index].GetBitmap (&bm);

    mann2DC.SetBkColor (RGB (0x0, 0x0, 0x0));

    maskDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &mann2DC, 0, 0, SRCCOPY);

    orDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &mann2DC, 0, 0, SRCCOPY);
    orDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &maskDC, 0, 0, 0x220326);

    tempDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &backBufferDC, m2_X, m2_Y, SRCCOPY);
    tempDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &maskDC, 0, 0, SRCAND);
    tempDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &orDC, 0, 0, SRCPAINT);

    backBufferDC.BitBlt (m2_X, m2_Y, bm.bmWidth, bm.bmHeight, &mann2DC, 0, 0, SRCCOPY);

    m_Patrone [p_Index].GetBitmap (&bm);

    patroneDC.SetBkColor (RGB (0x0, 0x0, 0x0));

    maskDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &patroneDC, 0, 0, SRCCOPY);

    orDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &patroneDC, 0, 0, SRCCOPY);
    orDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &patroneDC, 0, 0, 0x220326);

    tempDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &backBufferDC, p_X, p_Y, SRCCOPY);
    tempDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &maskDC, 0, 0, SRCAND);
    tempDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &orDC, 0, 0, SRCPAINT);

    backBufferDC.BitBlt (p_X, p_Y, bm.bmWidth, bm.bmHeight, &patroneDC, 0, 0, SRCCOPY);

    m_BackBuffer.GetBitmap (&bm);

    GetClientRect (&rect);

    windowDC.SetStretchBltMode (COLORONCOLOR);

    windowDC.StretchBlt (0, 0, rect.Width (), rect.Height (), &backBufferDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
    }


  • Mod

    Nimm eine CImageList, die kann das einfach von hause aus!



  • Wie mach ich das mit ner CImageList?? 😕
    Das ist mein erstes Projekt in dem ich mit Bitmaps arbeite



  • CImageList m_Image;
    CBitmap bitmap;
    bitmap.LoadBitmap(IDB_COPYACTIVE16);//Resource vom Typ Bitmap
    

    Bei Create sind die ersten 2 Paramenter die größe des Bitmaps
    für die Flags die du brauchst kuck bitte hier
    parameter 4 bestimmt größe der liste zu beginn und paramter 5 die größe um die die Liste zur laufzeit erweitert werden kann (wenn ich die msdn richtig verstanden hab)

    m_Image.Create(16, 16, ILC_COLOR16|ILC_MASK, 2, 1);
    

    bei add ist der zweite parameter der den du suchst die angegebene farbwerte ist der bereich der transparent dargestellt wird.

    m_Image.Add(&bitmap, RGB(0,128,128));
    


  • Irgendwie geht das nicht ich bekomm immer einen Fehler beim starten 😡
    Was ich vll noch anmerken müsste die Figuren sollen sich bewegen,deswegen der Index
    Also ich habe jetzt folgenden Code

    CImageList m_Image;
    CBitmap m_Mann [5];
    UINT m_Index;
    

    In OnInit

    m_Mann [0].LoadBitmap (IDB_MANN1);
        m_Mann [1].LoadBitmap (IDB_MANN2);
        m_Mann [2].LoadBitmap (IDB_MANN3);
        m_Mann [3].LoadBitmap (IDB_MANN4);
        m_Mann [4].LoadBitmap (IDB_GETROFFEN1);
    m_Index=0;
    

    In der Ausgabe

    CClientDC windowDC (this);
    CDC backBufferDC;
    BITMAP bm; //zum ermitteln der größe
    
    m_Mann [m_Index].GetBitmap (&bm);
    m_Image.Create(bm.bmWidth, bm.bmHeight, ILC_COLOR8|ILC_MASK, m_Index, 5);	
    
    m_Image.Add(&m_Mann [m_Index], RGB(0,0,0));
    
    backBufferDC.BitBlt (m_X, m_Y, bm.bmWidth, bm.bmHeight, &mannDC, 0, 0, SRCCOPY);
    
    m_BackBuffer.GetBitmap (&bm);
    
    GetClientRect (&rect);
    
    windowDC.SetStretchBltMode (COLORONCOLOR);
    
    windowDC.StretchBlt (0, 0, rect.Width (), rect.Height (), &backBufferDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
    

  • Mod

    Dann verwende doch auch die Draw Funktion mit ILD_TRANSPARENT der Imagelist. Du benötigst diese BitBlt Funktionen gar nicht!
    Bist Du Dir ganz sicher Schwarz als Ersetzungsfarbe zu bestimmen?



  • 1. Ist doch gerade dann nicht schlecht die Idee eine ImageList zu nutzen, wenn du sozusagen mehrere Frames einer Animation hast. Dann kannst du diese nacheinander aus der ImageList holen ...
    2. Für gewöhnlich nimmt man RGB(255, 0, 255) oder wie war der Wert noch gleich? 😉



  • könnte mir mal jemand ein codebeispiel schreiben?? wär echt nett :xmas1:


  • Mod

    Ich habe kein spezielles Beispiel. Nur eines wo es mitten drin verwendet wird. Aber was ist so schwierig dass Du ein Beispiel brauchst. Erzeugen, Laden, Zeichen (Create,Load,Draw)!
    http://www.codeproject.com/listctrl/lvcustomdraw.asp


Log in to reply