Picture box genau zuschneiden (auf Pixel genau oder)

  • VB6

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Neptun.

    Picture box genau zuschneiden (auf Pixel genau oder)

    Liebe vb-community,
    mich würde mal interessieren ob man eine PictureBox genau auf pixel oder so verändern, also so das die Form danach kein Viereck ist!
    Danke schonmal im vorraus
    Liebe Grüße
    whitex3 :) :)

    Visual Basic-Quellcode

    1. 'Funktion
    2. Sub abrunden(ByVal was As Object, _
    3. ByVal x As Integer, ByVal y As Integer, _
    4. ByVal width As Integer, ByVal height As Integer, _
    5. ByVal radius As Integer)
    6. Dim gp As System.Drawing.Drawing2D.GraphicsPath = _
    7. New System.Drawing.Drawing2D.GraphicsPath()
    8. gp.AddLine(x + radius, y, x + width - radius, y)
    9. gp.AddArc(x + width - radius, y, radius, radius, 270, 90)
    10. gp.AddLine(x + width, y + radius, x + width, y + height - radius)
    11. gp.AddArc(x + width - radius, y + height - radius, radius, radius, 0, 90)
    12. gp.AddLine(x + width - radius, y + height, x + radius, y + height)
    13. gp.AddArc(x, y + height - radius, radius, radius, 90, 90)
    14. gp.AddLine(x, y + height - radius, x, y + radius)
    15. gp.AddArc(x, y, radius, radius, 180, 90)
    16. gp.CloseFigure()
    17. was.region = New System.Drawing.Region(gp)
    18. gp.Dispose()
    19. End Sub
    20. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    21. abrunden(Picturebox1, 0, 0, Picturebox1.Width, Picturebox1.Height, 20)
    22. End Sub


    ?(
    Haha kann passieren :)
    Hm ich wollte eig ne ganz genau Form auschneiden, das ist so nen Raumschiff, weil wir für Informatik nen Spiel programmieren sollen und mit nem Raumschiff in nem schwarzen Viereck sieht doof aus, und unser Lehrer kann selbst nicht programmieren :S
    Bilder
    • schiff 1 ausgeschnitten - zugeschnitten.jpg

      4,66 kB, 129×49, 764 mal angesehen
    weil wir für Informatik nen Spiel programmieren sollen und mit nem Raumschiff in nem schwarzen Viereck sieht doof aus, und unser Lehrer kann selbst nicht programmieren :S
    Link1

    P.s made not by me! ;)
    P.s² Der Lehrer will das ihr ein Spiel
    macht aber weiß selber ned wie man
    programmiert? xDDDDDD

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Scream“ ()

    Hallo whitex3,
    eine Möglichkeit: Verwende als Grafik eine transparente Gif-Datei (oder
    auch Ico-Datei) und zeige sie in einem Image-Control an. In dem Fall
    wird kein zusätzlicher Code benötigt. Nachteil Image-Controls flackern
    beim Verschieben.

    Zweite Möglichkeit: Zeichne die Grafik mit der Api-Funktion TransparentBlt
    in eine Picturebox.

    Die Lösung mit SetWindowRgn ist schon etwas aufwändiger.
    Gruss,

    Neptun
    Hallo whitex3,
    probier' mal dieses:

    Visual Basic-Quellcode

    1. ' Controls: 1 * Picturebox mit Raumschiffbild, 1 * Timer-Control
    2. Option Explicit
    3. Private Declare Function DeleteObject& Lib "gdi32" (ByVal hObject&)
    4. Private Declare Function CreateRectRgn& Lib "gdi32" (ByVal x1&, ByVal y1&, ByVal X2&, ByVal Y2&)
    5. Private Declare Function GetPixel& Lib "gdi32" (ByVal hDC&, ByVal x&, ByVal y&)
    6. Private Declare Function CombineRgn& Lib "gdi32" (ByVal hDestRgn&, ByVal hSrcRgn1&, ByVal hSrcRgn2&, ByVal nCombineMode&)
    7. Private Declare Function SetWindowRgn& Lib "user32" (ByVal hWnd&, ByVal hRgn&, ByVal bRedraw As Boolean)
    8. Private Const RGN_OR& = 2&
    9. Private Sub Form_Load()
    10. Me.ScaleMode = vbPixels
    11. Call SetTransparent(Picture1)
    12. Timer1.Interval = 10
    13. Timer1.Enabled = True
    14. End Sub
    15. Private Sub Timer1_Timer()
    16. Picture1.Left = (Picture1.Left + 1) Mod Me.ScaleWidth
    17. End Sub
    18. Private Sub SetTransparent(PicX As PictureBox)
    19. Dim x1&, y1&, Color1&, Rgn1&, Rgn2&, R&, G&, B&
    20. With PicX
    21. .AutoSize = True
    22. .BorderStyle = vbBSNone
    23. .ScaleMode = vbPixels
    24. .AutoRedraw = True
    25. For x1 = 0 To .ScaleWidth - 1
    26. For y1 = 0 To .ScaleHeight - 1
    27. Color1 = GetPixel(.hDC, x1, y1)
    28. R = Color1 And vbRed
    29. G = (Color1 And vbGreen) \ &H100
    30. B = (Color1 And vbBlue) \ &H10000
    31. If R > 64 Or G > 64 Or B > 64 Then
    32. If Rgn1 = 0 Then
    33. Rgn1 = CreateRectRgn(x1, y1, x1 + 1, y1 + 1)
    34. Else
    35. Rgn2 = CreateRectRgn(x1, y1, x1 + 1, y1 + 1)
    36. Call CombineRgn(Rgn1, Rgn1, Rgn2, RGN_OR)
    37. Call DeleteObject(Rgn2)
    38. End If
    39. End If
    40. Next y1
    41. Next x1
    42. .Cls
    43. .AutoRedraw = False
    44. .ZOrder vbBringToFront
    45. Call SetWindowRgn(.hWnd, Rgn1, True)
    46. End With
    47. End Sub
    Gruss,

    Neptun
    Die Kollision brauche ich z.B. für "Asteroiden", die die ganze Zeit durchs Level fliegen, und da wollte ich einfach machen, dass wenn Asteroid.top=240 dann text4=text4*-1 (text4 wird immer zu asteroiden.top addiert).
    Aber wenn ich die Zeile
    Me.ScaleMode = vbPixels
    wegneheme dann funktioniert alles wie es laufen soll :D:D
    DANKE! wo hast du eigentlich so programmieren gelernt?
    Hallo whitex3,
    wenn du mehrere Controls vom gleichen Typ hast, wie hier die
    Asteroiden, solltest du ein Steuerelementefeld verwenden. Dann
    kannst du alle Controls in einer Schleife ansprechen.
    Siehe dazu:
    vbarchiv.net/faq/details.php?id=allg_controls

    wo hast du eigentlich so programmieren gelernt?

    Ich habe ein paar Bücher über VB gelesen. Der Rest ist Übung.
    Gruss,

    Neptun