2009-09-03 9 views
0

a un PictureBox (appelé i_MC) et je dessine une image simple (m_ImgMCN) sur ce fait:particulièrementCartes-Draw transparent

Call i_MC.PaintPicture(m_ImgMCN, 0, 0, i_MC.width, i_MC.height) 

je voudrais maintenant mettre une image transparente sur cette image, sur un position spécifique. J'ai trouvé un exemple de code, qui fait très bien le travail avec un problème: les parties de l'image qui ne devraient pas être à découvert avec la 2ème image (transparente) sont à découvert avec du noir uni.

l'algo fonctionne parfaitement si l'image d'arrière-plan est dessinée en définissant la propriété Picture. ne peut pas faire cela parce que cela ne permet pas d'étirement.

L'image transparente est une image simple plus petite que la boîte contenant une couleur masquée. Je l'ai utilisé l'exemple de code suivant (.AutoRedraw = true pour toutes les cases et .ScaleMode = 3 « Pixel):

Option Explicit 
Private Declare Function BitBlt Lib "gdi32" (ByVal hDCDest As _ 
     Long, ByVal XDest As Long, ByVal YDest As Long, ByVal _ 
     nWidth As Long, ByVal nHeight As Long, ByVal hDCSrc _ 
     As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal _ 
     dwRop As Long) As Long 

Private Declare Function CreateBitmap Lib "gdi32" (ByVal nWidth _ 
     As Long, ByVal nHeight As Long, ByVal nPlanes As Long, _ 
     ByVal nBitCount As Long, lpBits As Any) As Long 

Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As _ 
     Long, ByVal crColor As Long) As Long 

Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As _ 
     Long, ByVal hObject As Long) As Long 

Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal _ 
     hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) _ 
     As Long 

Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc _ 
     As Long) As Long 

Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) _ 
     As Long 

Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject _ 
     As Long) As Long 

Private Type RECT 
    Left As Long 
    Top As Long 
    Right As Long 
    Bottom As Long 
End Type 
Dim R As RECT 

Private Sub TranspPic(OutDstDC&, DstDC&, SrcDC&, SrcRect _ 
         As RECT, ByVal DstX&, ByVal DstY&, _ 
         TransColor&) 

    Dim Result&, W&, H& 
    Dim MonoMaskDC&, hMonoMask&, MonoInvDC&, hMonoInv& 
    Dim ResultDstDC&, hResultDst&, ResultSrcDC&, hResultSrc& 
    Dim hPrevMask&, hPrevInv&, hPrevSrc&, hPrevDst& 

    W = SrcRect.Right - SrcRect.Left 
    H = SrcRect.Bottom - SrcRect.Top 

    'Generieren einer Monochromen & einer inversen Maske 
    MonoMaskDC = CreateCompatibleDC(DstDC) 
    MonoInvDC = CreateCompatibleDC(DstDC) 
    hMonoMask = CreateBitmap(W, H, 1, 1, ByVal 0&) 
    hMonoInv = CreateBitmap(W, H, 1, 1, ByVal 0&) 
    hPrevMask = SelectObject(MonoMaskDC, hMonoMask) 
    hPrevInv = SelectObject(MonoInvDC, hMonoInv) 

    'Puffer erstellen 
    ResultDstDC = CreateCompatibleDC(DstDC) 
    ResultSrcDC = CreateCompatibleDC(DstDC) 
    hResultDst = CreateCompatibleBitmap(DstDC, W, H) 
    hResultSrc = CreateCompatibleBitmap(DstDC, W, H) 
    hPrevDst = SelectObject(ResultDstDC, hResultDst) 
    hPrevSrc = SelectObject(ResultSrcDC, hResultSrc) 

    'Sourcebild in die monochrome Maske kopieren 
    Dim OldBC As Long 
    OldBC = SetBkColor(SrcDC, TransColor) 
    Result = BitBlt(MonoMaskDC, 0, 0, W, H, SrcDC, _ 
        SrcRect.Left, SrcRect.Top, vbSrcCopy) 
    TransColor = SetBkColor(SrcDC, OldBC) 

    'Inverse Maske erstellen 
    Result = BitBlt(MonoInvDC, 0, 0, W, H, _ 
        MonoMaskDC, 0, 0, vbNotSrcCopy) 

    'Hintergrund des Zielbildes auslesen 
    Result = BitBlt(ResultDstDC, 0, 0, W, H, _ 
        DstDC, DstX, DstY, vbSrcCopy) 

    'AND mit der Maske 
    Result = BitBlt(ResultDstDC, 0, 0, W, H, _ 
        MonoMaskDC, 0, 0, vbSrcAnd) 

    'Überlappung des Sourcebildes mit dem Zielbild auslesen 
    Result = BitBlt(ResultSrcDC, 0, 0, W, H, SrcDC, _ 
        SrcRect.Left, SrcRect.Top, vbSrcCopy) 

    'AND mit der invertierten, monochromen Maske 
    Result = BitBlt(ResultSrcDC, 0, 0, W, H, _ 
        MonoInvDC, 0, 0, vbSrcAnd) 

    'XOR mit beiden 
    Result = BitBlt(ResultDstDC, 0, 0, W, H, _ 
        ResultSrcDC, 0, 0, vbSrcInvert) 

    'Ergebnis in das Zielbild kopieren 
    Result = BitBlt(OutDstDC, DstX, DstY, W, H, _ 
        ResultDstDC, 0, 0, vbSrcCopy) 

    'Erstellte Objekte & DCs wieder freigeben 
    hMonoMask = SelectObject(MonoMaskDC, hPrevMask) 
    DeleteObject hMonoMask 
    DeleteDC MonoMaskDC 

    hMonoInv = SelectObject(MonoInvDC, hPrevInv) 
    DeleteObject hMonoInv 
    DeleteDC MonoInvDC 

    hResultDst = SelectObject(ResultDstDC, hPrevDst) 
    DeleteObject hResultDst 
    DeleteDC ResultDstDC 

    hResultSrc = SelectObject(ResultSrcDC, hPrevSrc) 
    DeleteObject hResultSrc 
    DeleteDC ResultSrcDC 
End Sub 

Private Sub MovePicTo(ByVal X&, ByVal Y&) 
    i_MC.Cls 
    picSrc.Picture = m_ImgMCN 
    With R 
     .Left = 0 
     .Top = 0 
     .Right = Picture2.ScaleWidth 
     .Bottom = Picture2.ScaleHeight 
    End With 
    Call TranspPic(i_MC.hdc, i_MC.hdc, picSrc.hdc, R, X, Y, vbWhite) 
    i_MC.Refresh 
    DoEvents 
End Sub 

ce code réside à l'origine sur activevb.de, je l'ai modifié un peu sans changer la algorithme ou fonctionnalité. Je peux poster un lien vers un article original.

sans succès, j'ai essayé de modifier les tailles pour les différentes images intermédiaires, mais il continue à peindre la mauvaise image:

la partie de l'image où l'image transparente est tirée est correcte, l'arrière-plan est inclus. le reste de l'image (qui ne devrait pas être touché par l'algo) est remplacé par du noir.

toute idée est appréciée. un algorithme pour peindre des images alphablended 24 bits serait bien aussi! J'ai googlé assez longtemps et n'ai pas trouvé un morceau de code fonctionnel. PS: c'est tout simplement vieux VB6, se déplacer vers .NET ou toute autre langue n'est malheureusement pas une option.

merci d'avance et meilleures salutations

Répondre

0

damn. un de mes amis m'a donné l'astuce en utilisant la fonction TransparentBlt (MSDN) de WinAPI. fonctionne maintenant très bien. merci à ceux qui l'ont regardé.

ty & GN8

concerne atmocreations