2009-09-03 2 views
0

получила PictureBox (так называемый i_MC) и я нарисовать простое изображение (m_ImgMCN) на нем делаю:Специальных Розыгрыш прозрачной картина

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

Теперь я хотел бы поставить прозрачное изображение на этой картине, на определенной позиции. Я нашел образец кода, который хорошо справляется с одной задачей: части изображения, которые не должны быть переустановлены с помощью 2-го (прозрачного) изображения, перегружены черным.

Алгоритм работает отлично, если фоновое изображение сверху рисуется установкой Picture-property. не может этого сделать, потому что это не позволяет растягивать.

прозрачное изображение - это простое изображение, меньшее, чем поле, содержащее цвет, который замаскирован. Я использовал следующий код (.AutoRedraw = верно для всех коробок и .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 

этот код изначально находится на activevb.de, я изменил его немного, не изменяя алгоритм или функциональность. Я могу опубликовать ссылку на оригинальную статью.

без успеха, я попытался изменить размеры для различных промежуточных изображений, но он продолжает красить неправильно изображения:

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

любая идея оценивается. алгоритм для рисования 24-битных альфа-изображений будет также хорош! Я довольно долго искал Google и не нашел рабочего кода.

PS: Это простой старый VB6, переход на .NET или любой другой язык, к сожалению, не является вариантом.

благодарит заранее и с наилучшими пожеланиями

ответ

0

damn. мой друг дал мне совет, используя команду TransparentBlt (MSDN) -Function от WinAPI. работает сейчас довольно хорошо. благодаря тем, кто посмотрел на него.

ти & gn8

С уважением atmocreations