Gå til innhold

Lage en litt gjennomsiktig Picturebox


Anbefalte innlegg

Hei.

 

Jeg holder på med ett lite spill her så lurer jeg litt på hvordan jeg lager en vanlig picture box med svart bakgrundsfarge litt gjennomsiktig? Da tenker jeg gjennom til formen bak pictureboksen, ikke gjennom hele programmet\Spillet.

 

Takk for svar :)

Lenke til kommentar
Videoannonse
Annonse

           System.Drawing.Bitmap b = new Bitmap(pictureBox1.Image);
           for (int y = 0; y < b.Height; y++)
               for (int x = 0; x < b.Width; x++)
               {
                   Color c = b.GetPixel(x, y);
                   b.SetPixel(x, y, Color.FromArgb(128, c.R, c.G, c.B));
               }
           pictureBox1.Image = b;

 

Går *TREIGT*.

 

For å få det til å FORT se GeirGrusom sitt eksempel på "hardcore drawing" i denne tråden:

https://www.diskusjon.no/index.php?showtopic=648798

(kun C#)

 

edit; var litt full så jeg klarte å bytte om X & Y :)

Endret av jorn79
Lenke til kommentar

Glemte å nevne at dette var visual basic 6.

 

Nå kan jeg _ingenting_ om DirectX, så tror jeg vil prøve å finne en annen løsning først.

 

 

Edit: Vil også legge til at jeg vil ha den rundt 50% gjennomsiktig viss det er mulig :)

Endret av vbPro
Lenke til kommentar

Aiaiai, isåfall må du bruke AlphaBlend... men det kreves litt kunnskap om GDI for å brukes skikkelig... pluss at denne tegner 32-bit bilder med Alpha kanal... hvordan du tegner halvveis gjennomsiktig aner jeg ikke...

 

Nå har ikke jeg VB6 installert lenger, så jeg får ikke laget et eksempel for deg.

 

Men problemet med VB6, er at DirectDraw forsvinner helt i DirectX 9 og 10, nyeste implementeringen av DirectDraw finner du i DirectX 7...

Etter dette er det Direct3D som gjelder, siden DirectDraw blir strengt tatt unødvendig hvis man har Direct3D eller OpenGL.

Og VB6 bruke GDI for å tegne grafikk, og i GDI er det ingen støtte for 32-bit lagt med i VB6, derfor må du bruke API kall for å få det til.

Jeg er ikke engang sikker på om VB6 kan laste 32-bit bilder...

 

Du kan evt også bruke OpenGL, men da må du kunne OpenGL.

Jeg har derimot laget OpenGL eksempler i VB6, menneh, jeg er ikke sikker på om de ligger på dette forumet lenger, og jeg tror ikke jeg har tatt vare på dem :(

Lenke til kommentar
Aiaiai, isåfall må du bruke AlphaBlend... men det kreves litt kunnskap om GDI for å brukes skikkelig... pluss at denne tegner 32-bit bilder med Alpha kanal... hvordan du tegner halvveis gjennomsiktig aner jeg ikke...

8645054[/snapback]

Lag en bildeboks med navn picImage og legg inn et bilde via Picture-egenskapen. Sett ScaleMode på den og formen til Pixel. Lim dernest inn følgende kode:

Private Declare Function AlphaBlend Lib "msimg32.dll" (ByVal hdc As Long, ByVal lInt As Long, _

ByVal lInt As Long, ByVal lInt As Long, ByVal lInt As Long, ByVal hdc As Long, ByVal lInt As Long, _

  ByVal lInt As Long, ByVal lInt As Long, ByVal lInt As Long, ByVal Blendfunc As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, _

Source As Any, ByVal Length As Long)

 

Private Type BlendFunction

    BlendOp As Byte

    BlendFlags As Byte

    SourceConstantAlpha As Byte

    AlphaFormat As Byte

End Type

 

Const AC_SRC_OVER = &H0

 

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

 

    Dim BF As BlendFunction, lData As Long

   

    ' Initialiser verdier

    With BF

        .BlendOp = AC_SRC_OVER

        .BlendFlags = 0

        .SourceConstantAlpha = 128 ' 50% av 255

        .AlphaFormat = 0

    End With

   

    ' Brukerdefinerte typer kan ikke sendes som ByVal i API-calls. Vi må derfor omgjøre den til Long.

    CopyMemory lData, BF, 4

 

    ' Tegn bildeboks

    AlphaBlend Me.hdc, X, Y, picImage.ScaleWidth, picImage.ScaleHeight, picImage.hdc, _

    0, 0, picImage.ScaleWidth, picImage.ScaleHeight, lData

 

End Sub

Lenke til kommentar

aadnk: Jeg har prøvd koden din, men den ser ikke ut til å fungere.

Jeg fant frem et bilde, men bildet blir ikke noe gjennomsiktig i det heletatt.

Er vel egentlig ingen forskjell :p.. noen tips?

Endret av vbPro
Lenke til kommentar
aadnk: Jeg har prøvd koden din, men den ser ikke ut til å fungere.

          Jeg fant frem et bilde, men bildet blir ikke noe gjennomsiktig i det heletatt.

          Er vel egentlig ingen forskjell :p.. noen tips?

8652060[/snapback]

Virkelig? Er du sikker på at du ikke bare ser bildet tegn over seg selv to ganger (50% * 2, som da blir 100%)? Kan du poste et skjermskudd?

Lenke til kommentar
aadnk: Jeg har prøvd koden din, men den ser ikke ut til å fungere.

          Jeg fant frem et bilde, men bildet blir ikke noe gjennomsiktig i det heletatt.

          Er vel egentlig ingen forskjell :p.. noen tips?

8652060[/snapback]

Virkelig? Er du sikker på at du ikke bare ser bildet tegn over seg selv to ganger (50% * 2, som da blir 100%)? Kan du poste et skjermskudd?

8652073[/snapback]

 

 

Vel noe skjer.. det som skjer er at bildet blir tegnet opp flere ganger der jeg kjører musa (da jeg vifter rundt med musa over formen).

 

6czvlaw.png

 

 

Det jeg egentlig villet var å ha bildet gjennom siktig i pictureboksen liksom. =)

Endret av vbPro
Lenke til kommentar
Det jeg egentlig villet var å ha bildet gjennom siktig i pictureboksen liksom. =)

8652078[/snapback]

Poenget var at du skulle bruke koden jeg gav deg til å skrive nettopp det. Sett den i Form_Load og la AutoRedraw på formen og bildeboksen være satt til True.

 

Glem det med å få bildeboksen gjennomsiktig. Det er ikke den rette veien å gå. Med AlphaBlend kan du TEGNE et bilde på formen med gjennomsiktighet. Koden min viser hvordan.

Lenke til kommentar
Det jeg egentlig villet var å ha bildet gjennom siktig i pictureboksen liksom. =)

8652078[/snapback]

Poenget var at du skulle bruke koden jeg gav deg til å skrive nettopp det. Sett den i Form_Load og la AutoRedraw på formen og bildeboksen være satt til True.

 

Glem det med å få bildeboksen gjennomsiktig. Det er ikke den rette veien å gå. Med AlphaBlend kan du TEGNE et bilde på formen med gjennomsiktighet. Koden min viser hvordan.

8652095[/snapback]

 

 

 

Dette var vel overhode ikke det jeg var ute etter.

Det jeg spurte etter fra i begynnelsen av var å ha en picturebox til å være ca 50% gjennomsiktig, grunnen til at jeg vil ha den gjennomsiktig er pga jeg bruker Picturebox til ett slags "informasjons vindu" i det spillet jeg holder på med. Derfor ville jeg ha den litt gjennomsiktig. Men takk uansett.

Lenke til kommentar

Hvis man lager spill, bruker man ikke kontroller til å tegne noe som helst, man bruker kun en tom form, som man tegner opp for hver frame, og da må du enten bruke GDI på den måten som aadnk viser, eller legge til DirectDraw, Direct3D eller OpenGL.

 

Hvis du bruker GDI+ (som er nesten helt implementert i VB.NET aprikos) så vil du kunne få til mange mer fancy effekter.

Det er mulig man kan få til GDI+ i VB6, men det er mye greier for å få det til.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...