Jump to content

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


Cybernavigator

Recommended Posts

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?

Melhores cumprimentos,João Lopes***Esta mensagem foi escrita ao abrigo do novo Acordo Ortográfico***

Link to comment
Share on other sites

NuGuN como assim API Bitblt?

Olha, se fôr mais claro repara.

Http://buahaha.no.sapo.pt/stress1.PNG <- esta está com o background a transparente

E para provar k a imagem não tem fundo aki fica a segunda print

Http://buahaha.no.sapo.pt/stress2.PNG

Melhores cumprimentos,João Lopes***Esta mensagem foi escrita ao abrigo do novo Acordo Ortográfico***

Link to comment
Share on other 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

Link to comment
Share on other 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:

Melhores cumprimentos,João Lopes***Esta mensagem foi escrita ao abrigo do novo Acordo Ortográfico***

Link to comment
Share on other 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

Link to comment
Share on other sites

?

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?

Link to comment
Share on other sites

😛

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

Melhores cumprimentos,João Lopes***Esta mensagem foi escrita ao abrigo do novo Acordo Ortográfico***

Link to comment
Share on other 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

Link to comment
Share on other sites

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

Desde já muito obrigado. 😛

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 :\

Melhores cumprimentos,João Lopes***Esta mensagem foi escrita ao abrigo do novo Acordo Ortográfico***

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.