Die Win-Api bietet z.B. die Möglichkeit, mit "Regionen" zu arbeiten, den Aufwand dafür muß man selbst einschätzen. Hier eine Möglichkeit mit reinem PB (mit "optischer" Herleitung):
Code: Alles auswählen
Width=200
Height=150
PosX=100
PosY=50
Radius=25
If OpenWindow(0, 0, 0, 400, 300, "Rechteck mit abgerundeten Ecken 1", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If StartDrawing(WindowOutput(0))
DrawingMode(#PB_2DDrawing_Outlined)
Box(PosX, PosY, Width, Height, 0)
Circle(PosX+Radius, PosY+Radius, Radius, 0) ;links oben
Circle(PosX+Radius, PosY+Height-Radius, Radius, 0) ;links unten
Circle(PosX+Width-Radius, PosY+Radius, Radius, 0) ;rechts oben
Circle(PosX+Width-Radius, PosY+Height-Radius, Radius, 0) ;rechts unten
Delay(1000)
StopDrawing()
EndIf
CloseWindow(0)
EndIf
Delay(1) ;zur "Stabilität"
If OpenWindow(0, 0, 0, 400, 300, "Rechteck mit abgerundeten Ecken 2", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If StartDrawing(WindowOutput(0))
DrawingMode(#PB_2DDrawing_Outlined)
LineXY(PosX+Radius, PosY, PosX+Width-Radius, PosY, 0) ;oben
LineXY(PosX+Radius, PosY+Height, PosX+Width-Radius, PosY+Height, 0) ;unten
LineXY(PosX, PosY+Radius, PosX, PosY+Height-Radius, 0) ;links
LineXY(PosX+Width, PosY+Radius, PosX+Width, PosY+Height-Radius, 0) ;rechts
Circle(PosX+Radius, PosY+Radius, Radius, 0) ;links oben
Circle(PosX+Radius, PosY+Height-Radius, Radius, 0) ;links unten
Circle(PosX+Width-Radius, PosY+Radius, Radius, 0) ;rechts oben
Circle(PosX+Width-Radius, PosY+Height-Radius, Radius, 0) ;rechts unten
Delay(1000)
StopDrawing()
EndIf
CloseWindow(0)
EndIf
Delay(1)
If OpenWindow(0, 0, 0, 400, 300, "Rechteck mit abgerundeten Ecken 3", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If StartDrawing(WindowOutput(0))
DrawingMode(#PB_2DDrawing_Outlined)
LineXY(PosX+Radius, PosY, PosX+Width-Radius, PosY, 0) ;oben
LineXY(PosX+Radius, PosY+Height, PosX+Width-Radius, PosY+Height, 0) ;unten
LineXY(PosX, PosY+Radius, PosX, PosY+Height-Radius, 0) ;links
LineXY(PosX+Width, PosY+Radius, PosX+Width, PosY+Height-Radius, 0) ;rechts
;Viertelkreis rechts oben
P1XB.d=PosX+Width
P1YB.d=Height
Winkel =89
For i=1 To Winkel
P2YB.d = PosY+Radius - Sin(i/180*#PI)*Radius
P2XB.d = PosX+Width-Radius + Cos(i/180*#PI)*Radius
LineXY(P1XB, P1YB, P2XB, P2YB, 0) ;Viertelkreis
P1XB = P2XB
P1YB = P2YB
Next
;Viertelkreis links oben
P1XB.d=PosX+Radius
P1YB.d=PosY
Winkel =179
For i=91 To Winkel
P2YB.d = PosY+Radius - Sin(i/180*#PI)*Radius
P2XB.d = PosX+Radius + Cos(i/180*#PI)*Radius
LineXY(P1XB, P1YB, P2XB, P2YB, 0) ;Viertelkreis
P1XB = P2XB
P1YB = P2YB
Next
;Viertelkreis links unten
P1XB.d=PosX
P1YB.d=PosY+Height-Radius
Winkel =269
For i=181 To Winkel
P2YB.d = PosY+Height-Radius - Sin(i/180*#PI)*Radius
P2XB.d = PosX+Radius + Cos(i/180*#PI)*Radius
LineXY(P1XB, P1YB, P2XB, P2YB, 0) ;Viertelkreis
P1XB = P2XB
P1YB = P2YB
Next
;Viertelkreis rechts unten
P1XB.d=PosX+Width-Radius
P1YB.d=PosY+Height
Winkel =359
For i=271 To Winkel
P2YB.d = PosY+Height-Radius - Sin(i/180*#PI)*Radius
P2XB.d = PosX+Width-Radius + Cos(i/180*#PI)*Radius
LineXY(P1XB, P1YB, P2XB, P2YB, 0) ;Viertelkreis
P1XB = P2XB
P1YB = P2YB
Next
StopDrawing()
EndIf
Repeat : Event = WaitWindowEvent() : Until Event = #PB_Event_CloseWindow
CloseWindow(0)
EndIf