• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Cybernavigator

[Resolvido] [VB.Net 2k5] Ajuda com imagens sobrepostas...

14 mensagens neste tópico

Bom, o k eu não consigo fazer quando sobreponho uma imagem eh k a box de cima fique transparente de forma a deixar ver parte da imagem de baixo...

Imaginem um gif ou um png, tem uma parte transparente, mas quando o meto no vb dentro de uma picbox essa parte n fica transparente, fica com a cor do fundo da picbox...

Any ideas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas.... tenta ver se dá com a API BitBlt, ou então vê esta thread, com esse código dá para fazeres isso que queres mas com Forms, pode ser que alterado dê para fazeres mesmo o que queres.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hhhmmm, já estou com uma melhor percepção do que queres fazer. Estou certo que utilizando dias API's - Bitblt e StretchBlt. Ou quem sabe, se não dá apenas só com a Bitblt

A StretchBlt serve para copiares uma imagem completa ou apenas parte dela e colocares junto a outa imagem, e com bitblt tentas jogar com o parametro dwRop.

No google encontras muitos exemplos de como trabalhar com essas duas API's.

Caso não consiguas, disponibiliza essas duas imagens e eu posso tentar em VB6, e tu depois só tens de alterar, mas como se está apenas a trabalhar com API's não vais ter de alterar grande coisa.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa a minha ignorância mas não estou mesmo a conseguir...

A cena é k eu quero "juntar" ou sobrepôr uma imagem a uma k faz download automáticamente de um site...

De qualquer maneira se conseguires fazer alguma coisa juntando as imagens k deixei em anexo ás imagens Unknown1 e Unknown2 (também anexadas) era fixe

Já agora deixo também aki um ficheiro k me mandaram de outro fórum pra me tentarem ajudar, mas mais uma vez não tou a conseguir fazer nada com ele.

Tou no ínicio de programar e acho k prestes a desistir  :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas...

Bem penso que é isto que queres, o código fonte fica aqui e deixo um executável em anexo para veres como funciona pois é em VB6 e não é VB.NET

Option Explicit

  
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, _
ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, _
ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long


Private Sub Command1_Click()
BitBlt Picture1.hDC, 70, 0, ScaleX(Picture2.ScaleWidth, vbTwips, vbPixels), _
    ScaleY(Picture2.ScaleHeight, vbTwips, vbPixels), Picture2.hDC, 0, 0, vbSrcAnd

Picture1.Refresh
End Sub

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, é isso mesmo, agora a duvida eh fazer isso em .net :|

esse .hDC é o k?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hdc = Handle of Device Context

É tipo um ID da picturebox ou do que for...

Tens aqui o que precisas para alterares isso  :P

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

lol, opah, não percebo, usei essa ultima source k me deste, faço copiar colar, mas cola com o fundo na mesma  :P

Vou comprar tabaco kisto vai ser um dia longo  :smoke:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:eek:

Com essa é que me estas a deixar confuso..... copias-te e colas-te este código:

Option Explicit

  
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, _
ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, _
ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long


Private Sub Command1_Click()
BitBlt Picture1.hDC, 70, 0, ScaleX(Picture2.ScaleWidth, vbTwips, vbPixels), _
    ScaleY(Picture2.ScaleHeight, vbTwips, vbPixels), Picture2.hDC, 0, 0, vbSrcAnd

Picture1.Refresh
End Sub

E isso funcionar no compilador de VB.NET?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:P

Vou por partes, talvez descubras o erro  :-[

Meti isto num módulo (Bitblt.vb)

Public Class BitBliter

#Region " BitBlt Declaration"
    Private Declare Auto Function BitBlt Lib "GDI32.DLL" ( _
        ByVal hdcDest As IntPtr, _
        ByVal nXDest As Integer, _
        ByVal nYDest As Integer, _
        ByVal nWidth As Integer, _
        ByVal nHeight As Integer, _
        ByVal hdcSrc As IntPtr, _
        ByVal nXSrc As Integer, _
        ByVal nYSrc As Integer, _
        ByVal dwRop As Int32) As Boolean
#End Region

#Region " Members "

    ' Public Holders
    Private MemGrp As Graphics
    Private MemHdc As IntPtr

    Private LastSize As Size

    Private Copied As Boolean

#End Region

#Region " Interface "
    'Interface

    Public Sub Copy(ByVal srcGraphics As Graphics, ByVal Size As Size)
        LastSize = Size ' Saving so we'l know how to Paste
        ' check if already copied
        If Copied Then DisposeObjects() ' so old objects are disposed
        ' Creating a temporary Bitmap to create objects of
        Dim srcBmp As New Bitmap(Size.Width, Size.Height, srcGraphics)
        ' Creating Objects
        MemGrp = Graphics.FromImage(srcBmp)     'Create a Graphics object 
        MemHdc = MemGrp.GetHdc                  'Get the Device Context

        '>>> get the picture <<<
        MyBitBlt(srcGraphics, MemHdc, Size.Width, Size.Height)
        ' Dispose of the BMP
        srcBmp.Dispose()

        Copied = True
    End Sub





    Public Sub Paste(ByVal TargetGraphics As Graphics, ByVal X As Integer, ByVal Y As Integer)
        Dim TargetHdc As IntPtr = TargetGraphics.GetHdc

        MyBitBlt(MemHdc, TargetHdc, LastSize.Width, LastSize.Height, X, Y)

        TargetGraphics.ReleaseHdc(TargetHdc)
    End Sub

#End Region




#Region " Internals "
    Const SRCCOPY As Integer = &HCC0020
    ' Wraping things up
    Private Sub MyBitBlt(ByVal SourceGraphics As Graphics, ByVal TargetHDC As IntPtr, ByVal width As Integer, ByVal Height As Integer)
        ' Creating a DeviceContext to capture from
        Dim SourceHDC As IntPtr = SourceGraphics.GetHdc
        ' Blitting (Copying) the data
        BitBlt(TargetHDC, 0, 0, width, Height, SourceHDC, 0, 0, SRCCOPY)
        ' Releasing the Device context used
        SourceGraphics.ReleaseHdc(SourceHDC)
    End Sub




    Private Sub MyBitBlt(ByVal SourceHDC As IntPtr, ByVal TargetHDC As IntPtr, ByVal width As Integer, ByVal Height As Integer, ByVal PosX As Integer, ByVal PosY As Integer)
        ' Copying data to a specific position on the target Device Context
        BitBlt(TargetHDC, PosX, PosY, width, Height, SourceHDC, 0, 0, SRCCOPY)
    End Sub




    ' Cleanning Up
    ' Before Destroying this class, dispose of objects to reclaim memory
    Protected Overrides Sub Finalize()
        DisposeObjects()
        MyBase.Finalize()
    End Sub




    ' Disposing of objects
    Private Sub DisposeObjects()
        MemGrp.ReleaseHdc(MemHdc) ' Release Device Context
        MemGrp.Dispose() ' Disposing of Graphics object
    End Sub





#End Region
End Class

Depois meti dois butões, um k vai buscar a imagem ok1 e copia para a imagem userpict1:

O butão 2 copia e o 1 cola.

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' We create a Graphics object to paste to
        Dim targetGrp As Graphics = userpict1.CreateGraphics
        ' BitBlt it away
        MyBitbliter.Paste(targetGrp, 0, 0)
        ' And don't forget to dispose of the object
        targetGrp.Dispose()
    End Sub



    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ' We create a Graphics object to work with
        Dim SourceGrp As Graphics = ok1.CreateGraphics
        ' Copy the surface
        MyBitbliter.Copy(SourceGrp, New Size(ok1.Width, ok1.Height))
        ' Dispose of the Graphics object
        SourceGrp.Dispose()
    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Editei o teu post, não foi por estar nada mal foi apenas para afastar os procedimentos uns dos outros para os ver melhor.

Bem, primeiro não precisas de andar a copiar e a colar, com o código que aí tens basta o código do past (parece-me a mim), e depois se reparares no código que postei em VB6 o ultimo parâmetro que estou a utilizar na API não é o vbsrccopy mas sim vbsrcand. Eu disse que tinhas tudo o que precisavas naquele link mas tens de alterar algumas coisas.

O valor de vbsrcand é 8913094 por isso em vez de teres -> Const SRCCOPY As Integer = &HCC0020 metes -> Const VBSrcAnd As Integer = 8913094

E como é óbvio trocas no código SRCCOPY por vbSrcAnd....

E penso que é só.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, mais logo testo isso e digo aqui quais foram os resultados...

Desde já muito obrigado. :P

Já agora outra coisa,

usando o código acima (foi convertido de vb.net 2k3 para vb.net 2k5) quando fecho a form aparece-me um erro aqui

    ' Disposing of objects

    Private Sub DisposeObjects()

        MemGrp.ReleaseHdc(MemHdc) ' Release Device Context

        MemGrp.Dispose() ' Disposing of Graphics object

    End Sub

Alguém em sabe dizer porque?

*editado*

NuGuN, trocar akilo que disses-te só originou a cópia de um quadrado preto :\

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mais um topico resolvido. obrigado nugun. deu-me muitas luzes. como habitual amanha deixo aki um exemplo d como resolvi :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora