Ellipse malen

Shakie

Erfahrenes Mitglied
Hallo!
Ich habe eine hoffentlich einfache Frage: wie kann ich eine Ellipse zeichnen?
Mein Problem: ich zeichne einen Kreis auf eine PictureBox, manchmal wird aber die Skalierung in X und Y-Richtung ungleich geändert. Dann sollte der Kreis eigentlich zu einer Ellipse werden, tut er aber nicht....Er wird lediglich in Abhängigkeit von der X-Skalierung (ScaleWidth) kleiner bzw. größer. Zum Malen verwende ich die Circle-Funktion.
Also wie kann ich nun eine Ellipse zeichnen?
 
Hab zwar nicht´s gefunden für eine PictureBox, aber vielleicht kannst Du damit etwas anfangen.
Code:
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function PtInRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function PtInRegion Lib "gdi32" (ByVal hRgn As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function CreateEllipticRgnIndirect Lib "gdi32" (lpRect As RECT) As Long
Private Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
Private Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long

Private Sub Form_Load()
    Dim mRGN As Long, R As RECT, x As Long, y As Long
    'Set the graphical mode to persistent
    Me.AutoRedraw = True
    'Set the rectangle's values
    SetRect R, 10, 10, 500, 250
    'Create an elliptical region
    mRGN = CreateEllipticRgnIndirect(R)
    For x = R.Left To R.Right
        For y = R.Top To R.Bottom
            'If the point is in the region, draw a green pixel
            If PtInRegion(mRGN, x, y) <> 0 Then
                'Draw a green pixel
                SetPixelV Me.hdc, x, y, vbGreen
            ElseIf PtInRect(R, x, y) <> 0 Then
                'Draw a red pixel
                SetPixelV Me.hdc, x, y, vbRed
            End If
        Next y
    Next x
    'delete our region
    DeleteObject mRGN
End Sub

Private Sub Form_Resize()
Me.Move 1000, 1000, 9000, 5000
End Sub
 
Dankeschön, das umarbeiten auf eine PictureBox ist nicht allzu schwer. Man braucht blos statt dem "hdc" der Form das "hdc" der PictureBox verwenden.

Edit: Schade aber dass jeder Pixel einzeln gemalt werden muss, lieber wär mir eine fertige Funktion von VB, so wie die Line oder Circle-Funktion. Naja, man kann nicht alles haben :D
 
Zuletzt bearbeitet:
Zurück