Como criar um mapa de bits transparente, utilizando o Visual Basic

Traduções de Artigos Traduções de Artigos
Artigo: 94961 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Uma imagem transparente mostra o fundo atrás da mesma em vez da própria imagem. Pode utilizar um editor de ícone como o programa de exemplo IconWorks fornecido com o Visual Basic para criar ícones que contêm partes transparentes. Este artigo mostra como efectuar determinadas partes de um mapa de bits transparente.

Mais Informação

Seguem-se os seis passos gerais necessários para criar um mapa de bits transparente:
  1. Armazene a área ou fundo, onde vai ser desenhado o mapa de bits.
  2. Crie uma máscara de mapa de bits que identifica as áreas transparentes do mapa de bits utilizando um pixel de branco para indicar áreas transparentes e um pixel preto para indicar áreas não transparentes do mapa de bits monocromática.
  3. Combina os pixels da máscara monocromático com o mapa de bits em segundo plano utilizando o operador binário E. Área de fundo em que parte do mapa de bits não transparente aparecerá fica preta.
  4. Combina uma cópia invertida a máscara Monocromática (passo 2) com o mapa de bits origem utilizando o operador binário E. As áreas transparentes do mapa de bits origem passará a estar pretas.
  5. Combinar o fundo modificado (passo 3) com o mapa de bits origem modificado (passo 4) utilizando o operador binário XOR. O fundo mostrará às partes transparentes do mapa de bits.
  6. Copiar mapa de bits resultante para o fundo

Código de exemplo

  1. Inicie o Visual Basic ou no menu ' ficheiro ', seleccione novo projecto (ALT, F, N) se já estiver em execução do Visual Basic. É criado o Form1 por predefinição.
  2. Adicione os seguintes controlos ao Form1 com os valores de propriedade associados:
       Control          Name (or CtlName)  Property Settings
       -----------------------------------------------------------------
       Picture          pictSource         Picture ="WINDOWS\THATCH.BMP"
       Picture          pictDest           Picture ="WINDOWS\ARCHES.BMP"
       Command button   cmdCopy            Caption ="Copy"
    
    						
  3. No menu ' ficheiro ', seleccione novo módulo (ALT, F, M). Módulo1 é criado.
  4. Adicione o seguinte código ao procedimento de evento cmdCopy_Click do Form1. Este código chama a função TransparentBlt() para copiar um mapa de bits de origem para um controlo de imagem de destino (fundo). Branco (QBColor(15)) áreas do mapa de bits são transparentes contra o mapa de bits em segundo plano.
       Sub cmdCopy_Click ()
         Call TransparentBlt(pictDest, pictSource.Picture, 10, 10, QBColor(15))
       End Sub
    
    						
  5. Adicione o seguinte código a secção de declarações gerais do Module1. Introduza cada instrução Declare como um, linha:
       Type bitmap
          bmType As Integer
          bmWidth As Integer
          bmHeight As Integer
          bmWidthBytes As Integer
          bmPlanes As String * 1
          bmBitsPixel As String * 1
          bmBits As Long
       End Type
    
       Declare Function BitBlt Lib "GDI" (ByVal srchDC As Integer, ByVal srcX
          As Integer, ByVal srcY As Integer, ByVal srcW As Integer, ByVal srcH
          As Integer, ByVal desthDC As Integer, ByVal destX As Integer, ByVal
          destY As Integer, ByVal op As Long) As Integer
       Declare Function SetBkColor Lib "GDI" (ByVal hDC As Integer, ByVal
          cColor As Long) As Long
       Declare Function CreateCompatibleDC Lib "GDI" (ByVal hDC As Integer)
          As Integer
       Declare Function DeleteDC Lib "GDI" (ByVal hDC As Integer) As Integer
       Declare Function CreateBitmap Lib "GDI" (ByVal nWidth As Integer, ByVal
          nHeight As Integer, ByVal cbPlanes As Integer, ByVal cbBits As
          Integer, lpvBits As Any) As Integer
       Declare Function CreateCompatibleBitmap Lib "GDI" (ByVal hDC As Integer,
          ByVal nWidth As Integer, ByVal nHeight As Integer) As Integer
       Declare Function SelectObject Lib "GDI" (ByVal hDC As Integer, ByVal
          hObject As Integer) As Integer
       Declare Function DeleteObject Lib "GDI" (ByVal hObject As Integer) As
          Integer
       Declare Function GetObj Lib "GDI" Alias "GetObject" (ByVal hObject As
          Integer, ByVal nCount As Integer, bmp As Any) As Integer
       Const SRCCOPY = &HCC0020
       Const SRCAND = &H8800C6
       Const SRCPAINT = &HEE0086
       Const NOTSRCCOPY = &H330008
    
    						
  6. Adicione o seguinte procedimento Sub à secção declarações gerais do Module1. TransparentBlt() aceita seis parâmetros: um controlo de imagem de destino (dest), um mapa de bits origem seja transparente (srcBmp), X, Y coordenadas em pixels onde pretende colocar o mapa de bits origem no destino (destX e destY) e o valor RGB para a cor que pretende que seja transparente. TransparentBlt() copia mapas de bits de origem para qualquer X, Y localização no fundo efectuar áreas transparentes.
       Sub TransparentBlt (dest As Control, ByVal srcBmp As Integer, ByVal
          destX As Integer, ByVal destY As Integer, ByVal TransColor As Long)
          Const PIXEL = 3
          Dim destScale As Integer
          Dim srcDC As Integer  'source bitmap (color)
          Dim saveDC As Integer 'backup copy of source bitmap
          Dim maskDC As Integer 'mask bitmap (monochrome)
          Dim invDC As Integer  'inverse of mask bitmap (monochrome)
          Dim resultDC As Integer 'combination of source bitmap & background
          Dim bmp As bitmap 'description of the source bitmap
          Dim hResultBmp As Integer 'Bitmap combination of source & background
          Dim hSaveBmp As Integer 'Bitmap stores backup copy of source bitmap
          Dim hMaskBmp As Integer 'Bitmap stores mask (monochrome)
          Dim hInvBmp As Integer  'Bitmap holds inverse of mask (monochrome)
          Dim hPrevBmp As Integer 'Bitmap holds previous bitmap selected in DC
          Dim hSrcPrevBmp As Integer  'Holds previous bitmap in source DC
          Dim hSavePrevBmp As Integer 'Holds previous bitmap in saved DC
          Dim hDestPrevBmp As Integer 'Holds previous bitmap in destination DC
          Dim hMaskPrevBmp As Integer 'Holds previous bitmap in the mask DC
          Dim hInvPrevBmp As Integer 'Holds previous bitmap in inverted mask DC
          Dim OrigColor As Long 'Holds original background color from source DC
          Dim Success As Integer 'Stores result of call to Windows API
          If TypeOf dest Is PictureBox Then 'Ensure objects are picture boxes
            destScale = dest.ScaleMode 'Store ScaleMode to restore later
            dest.ScaleMode = PIXEL 'Set ScaleMode to pixels for Windows GDI
            'Retrieve bitmap to get width (bmp.bmWidth) & height (bmp.bmHeight)
            Success = GetObj(srcBmp, Len(bmp), bmp)
            srcDC = CreateCompatibleDC(dest.hDC)    'Create DC to hold stage
            saveDC = CreateCompatibleDC(dest.hDC)   'Create DC to hold stage
            maskDC = CreateCompatibleDC(dest.hDC)   'Create DC to hold stage
            invDC = CreateCompatibleDC(dest.hDC)    'Create DC to hold stage
            resultDC = CreateCompatibleDC(dest.hDC) 'Create DC to hold stage
            'Create monochrome bitmaps for the mask-related bitmaps:
            hMaskBmp = CreateBitmap(bmp.bmWidth, bmp.bmHeight, 1, 1, ByVal 0&)
            hInvBmp = CreateBitmap(bmp.bmWidth, bmp.bmHeight, 1, 1, ByVal 0&)
            'Create color bitmaps for final result & stored copy of source
            hResultBmp = CreateCompatibleBitmap(dest.hDC, bmp.bmWidth,
               bmp.bmHeight)
            hSaveBmp = CreateCompatibleBitmap(dest.hDC, bmp.bmWidth,
               bmp.bmHeight)
            hSrcPrevBmp = SelectObject(srcDC, srcBmp)     'Select bitmap in DC
            hSavePrevBmp = SelectObject(saveDC, hSaveBmp) 'Select bitmap in DC
            hMaskPrevBmp = SelectObject(maskDC, hMaskBmp) 'Select bitmap in DC
            hInvPrevBmp = SelectObject(invDC, hInvBmp)    'Select bitmap in DC
            hDestPrevBmp = SelectObject(resultDC, hResultBmp) 'Select bitmap
            Success = BitBlt(saveDC, 0, 0, bmp.bmWidth, bmp.bmHeight, srcDC,
               0, 0, SRCCOPY) 'Make backup of source bitmap to restore later
            'Create mask: set background color of source to transparent color.
            OrigColor = SetBkColor(srcDC, TransColor)
            Success = BitBlt(maskDC, 0, 0, bmp.bmWidth, bmp.bmHeight, srcDC,
               0, 0, SRCCOPY)
            TransColor = SetBkColor(srcDC, OrigColor)
            'Create inverse of mask to AND w/ source & combine w/ background.
            Success = BitBlt(invDC, 0, 0, bmp.bmWidth, bmp.bmHeight, maskDC,
              0, 0, NOTSRCCOPY)
            'Copy background bitmap to result & create final transparent bitmap
            Success = BitBlt(resultDC, 0, 0, bmp.bmWidth, bmp.bmHeight,
               dest.hDC, destX, destY, SRCCOPY)
            'AND mask bitmap w/ result DC to punch hole in the background by
            'painting black area for non-transparent portion of source bitmap.
            Success = BitBlt(resultDC, 0, 0, bmp.bmWidth, bmp.bmHeight,
               maskDC, 0, 0, SRCAND)
            'AND inverse mask w/ source bitmap to turn off bits associated
            'with transparent area of source bitmap by making it black.
            Success = BitBlt(srcDC, 0, 0, bmp.bmWidth, bmp.bmHeight, invDC,
               0, 0, SRCAND)
            'XOR result w/ source bitmap to make background show through.
            Success = BitBlt(resultDC, 0, 0, bmp.bmWidth, bmp.bmHeight,
               srcDC, 0, 0, SRCPAINT)
            Success = BitBlt(dest.hDC, destX, destY, bmp.bmWidth, bmp.bmHeight,
               resultDC, 0, 0, SRCCOPY) 'Display transparent bitmap on backgrnd
            Success = BitBlt(srcDC, 0, 0, bmp.bmWidth, bmp.bmHeight, saveDC,
               0, 0, SRCCOPY) 'Restore backup of bitmap.
            hPrevBmp = SelectObject(srcDC, hSrcPrevBmp) 'Select orig object
            hPrevBmp = SelectObject(saveDC, hSavePrevBmp) 'Select orig object
            hPrevBmp = SelectObject(resultDC, hDestPrevBmp) 'Select orig object
            hPrevBmp = SelectObject(maskDC, hMaskPrevBmp) 'Select orig object
            hPrevBmp = SelectObject(invDC, hInvPrevBmp) 'Select orig object
            Success = DeleteObject(hSaveBmp)   'Deallocate system resources.
            Success = DeleteObject(hMaskBmp)   'Deallocate system resources.
            Success = DeleteObject(hInvBmp)    'Deallocate system resources.
            Success = DeleteObject(hResultBmp) 'Deallocate system resources.
            Success = DeleteDC(srcDC)          'Deallocate system resources.
            Success = DeleteDC(saveDC)         'Deallocate system resources.
            Success = DeleteDC(invDC)          'Deallocate system resources.
            Success = DeleteDC(maskDC)         'Deallocate system resources.
            Success = DeleteDC(resultDC)       'Deallocate system resources.
            dest.ScaleMode = destScale 'Restore ScaleMode of destination.
          End If
       End Sub
    
    						
  7. No menu ' Executar ', escolha Iniciar (ALT, R S) para executar o programa.
  8. Clique no botão Copiar. O padrão telhado a primeira imagem é copiado para a criar imagem (uma imagem de arches) segundo que as arches mostram através de áreas do padrão telhado anteriormente branco.

Propriedades

Artigo: 94961 - Última revisão: 30 de outubro de 2003 - Revisão: 2.0
A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic 2.0 Standard Edition
  • Microsoft Visual Basic 3.0 Professional Edition
Palavras-chave: 
kbmt kbcode KB94961 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 94961
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com