|
21.2.2002 
Korrekte abgerundete Ecken erstellen (Version 2)
Entgegen der Version 1, in der der Rahmen einfach ersetzt wird und mit Hilfe der Standard-Eckenrundung vom Ventura gerundet werden kann, bietet dieses Script als Version 2 eine viel flexiblere Bedienung.
Hier haben Sie einen Schieberegler, in dem Sie die Rundung präzise einstellen können, und zwar für beliebige Ecken in echten Millimetern. Feineinstellungen nehmen Sie mit den Pfeiltasten auf der Tastatur vor. Sie beenden die Einstellung, in dem Sie das Fenster einfach schließen. Selbstverständlich können auch gedrehte Rahmen damit abgerundet werden. Und noch eine Errungenschaft besitzt dieses kleine Fenster: Möchten Sie die gemachte Einstellung auf andere Rahmen übertragen, damit Sie ein einheitliches Layout erhalten, lassen Sie dieses Dialogfenster offen, markieren den nächsten Rahmen und klicken einmal auf den Schieberegler, die Kurven werden exakt übertragen. Dies können Sie für beliebige weitere Rahmen fortführen. Achtung: Der Rahmen wird für die Rundung in eine Kurve umgewandelt, er besitzt daher nicht mehr die Eigenschaften des Rechtecks. Schauen Sie sich dazu auch Version 1 des Scripts an.
Script:
REM Mit diesem Werkzeug können Sie beliebige Bild- oder Textrahmen mit unverzerrten runden ecken versehen
REM © 2001 by Ulrich Albrecht
Global l&,t&,w&,h&,ra&,r&,cr&,rot,ix&,ixs& ,x, xd, yd,ors,urs,uls,ols, dia
Global Const SWP_NOMOVE& = 2
Global Const SWP_NOSIZE& = 1
Global Const HWND_TOPMOST& = -1
DECLARE FUNCTION FindWindow LIB "user32" (BYVAL Class$,BYVAL Name$) AS LONG ALIAS "FindWindowA"
DECLARE FUNCTION SetWindowPos LIB "user32" (ByVal hWnd&, ByVal hWndInsertAfter&, ByVal x&, ByVal y&, ByVal cx&, ByVal cy&, ByVal wFlags&) As Long Alias "SetWindowPos"
DECLARE SUB MakeDialogOnTop()
DECLARE SUB Zeichnen
DECLARE SUB Rahmenwerte
DECLARE SUB CheckRahmen
WITHOBJECT "CorelVentura.Automation.8"
ixs& = .CurrentFrameIndex ( )
CALL Rahmenwerte
ors=1:urs=1:ols=1:uls=1:xd=0:yd=0
'ix& = .CurrentFrameIndex ( )
'if ix&<>ixs& then CALL Rahmenwerte:nr=1:ixs&=ix& 'Neuer Rahmen wurde ausgewählt
BEGIN DIALOG OBJECT Eingabe 0, 0, 251, 53, "Eckenabrundung", SUB SliderSub
HSLIDER 7, 13, 176, 11, .Slider
TEXT 107, 27, 60, 9, .Anzeige, "Radius: 0 mm"
TEXT 10, 28, 18, 8, .Text1, "0"
TEXT 169, 25, 15, 8, .Text2, "100"
CHECKBOX 22, 26, 78, 13, .rotsehen, "Rotation sehen" 'Zeigt die Eckenrundung am rotierten Rahmen
GROUPBOX 188, 3, 56, 43, .GroupBox1, "Runde Ecken"
CHECKBOX 202, 15, 10, 9, .ol, ""
CHECKBOX 202, 29, 11, 11, .ul, ""
CHECKBOX 218, 15, 11, 11, .or, ""
CHECKBOX 218, 29, 11, 12, .ur, ""
END DIALOG
dia=DIALOG(Eingabe)
SUB SliderSub(BYVAL ControlID%, BYVAL Event%)
IF Event=0 THEN
MakeDialogOnTop
Eingabe.rotsehen.SETTHREESTATE FALSE
if ra&=0 then Eingabe.rotsehen.ENABLE FALSE else Eingabe.rotsehen.ENABLE TRUE
Eingabe.Text2.SETTEXT (int(w&/20000))
Eingabe.Slider.SETMINRANGE 0
Eingabe.Slider.SETMAXRANGE w&/2
Eingabe.Slider.SETINCREMENT 1000
Eingabe.Slider.SETVALUE r&
Eingabe.Slider.SETTICK 20000
Eingabe.ol.SETTHREESTATE FALSE
Eingabe.ul.SETTHREESTATE FALSE
Eingabe.or.SETTHREESTATE FALSE
Eingabe.ur.SETTHREESTATE FALSE
Eingabe.ol.SETVALUE ols
Eingabe.ul.SETVALUE uls
Eingabe.or.SETVALUE ors
Eingabe.ur.SETVALUE urs
ENDIF
IF Event=1 OR Event=2 AND ControlID=1 THEN
CALL CheckRahmen
Eingabe.Anzeige.SETTEXT ("Radius:"& str(int(Eingabe.Slider.GETVALUE ()/1000)/10)&" mm")
r&=Eingabe.Slider.GETVALUE ()
Call Zeichnen
ENDIF
IF Event=2 AND ControlID>6 THEN
CALL CheckRahmen
Call Zeichnen
end if
END SUB
SUB
Zeichnen
if rot=1 then .FormatFrameGeneral .FrameRotation= 0,.ContentRotation=0
r1&=Eingabe.ol.GETVALUE ()*r&
r2&=Eingabe.or.GETVALUE ()*r&
r3&=Eingabe.ur.GETVALUE ()*r&
r4&=Eingabe.ul.GETVALUE ()*r&
.DrawCurveBegin 0,0, 17
.DrawCurveAddNode r&+l&,0+t&,304
.DrawCurveAddNode w&-r2&+l&,0+t&,289
.DrawCurveAddNode w&-0.55*r2&+l&,0+t&,259
.DrawCurveAddNode w&+l&,0.55*r&+t&,259
.DrawCurveAddNode w&+l&,r&+t&,290
.DrawCurveAddNode w&+l&,h&-r3&+t&,289
.DrawCurveAddNode w&+l&,h&-0.55*r3&+t&,259
.DrawCurveAddNode w&-0.55*r&+l&,h&+t&,259
.DrawCurveAddNode w&-r&+l&,h&+t&,290
.DrawCurveAddNode r4&+l&,h&+t&,289
.DrawCurveAddNode 0.55*r4&+l&,h&+t&,259
.DrawCurveAddNode 0+l&,h&-0.55*r&+t&,259
.DrawCurveAddNode 0+l&,h&-r&+t&,290
.DrawCurveAddNode 0+l&,r1&+t&,289
.DrawCurveAddNode 0+l&,0.55*r1&+t&,259
.DrawCurveAddNode 0.55*r&+l&,0+t&,259
.DrawCurveAddNode r&+l&,0+t&,274
.DrawCurveEnd TRUE
if rot=1 then .FormatFrameGeneral .FrameRotation= ra&, .ContentRotation=cr&
END SUB
SUB Rahmenwerte
ix& = .CurrentFrameIndex ( )
if ix&<1 then end
.FrameFirst FALSE, .FrameIndex=ix&
.FormatFrameGeneralGet l&,t&,w&,h&,ra&,.ContentRotation=cr&
if ra&<>0 then
.FormatFrameGeneral .FrameRotation=0, .ContentRotation=0
.FormatFrameGeneralGet l&,t&,w&,h&
rot=1
end if
END SUB
SUB MakeDialogOnTop()
DIM hWnd As Long
hWnd = FindWindow("#32770",Eingabe.GetText())
IF hWnd<>0 Then
SetWindowPos hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE
END IF
END SUB
SUB CheckRahmen
if ixs&<>.CurrentFrameIndex ( ) then CALL Rahmenwerte:ix&=ixs&
if ra&=0 then Eingabe.rotsehen.ENABLE FALSE else Eingabe.rotsehen.ENABLE TRUE
END SUB
END WITHOBJECT
Funktionsweise
Dies ist mit Abstand das aufwändigste Script, das für V-PUB erstellt worden ist. Die Logik herauszubekommen, wie Ecken in Corel-Programmen abgerundet werden, hat sehr lange gedauert. Das ganze Script hinterher auch alltagstauglich zu machen, kostete noch mal einige Tage. Da dies ganz bestimmt ein sehr beliebtes Script sein wird (das andere weltweite Ventura-Seiten sicherlich wieder als Eigenproduktion verkaufen wollen), möchte ich nochmals deutlich darauf hinweisen: Dieses Script darf nicht auf anderen Seiten (kommerziell oder nichtkommerziell) zum Download jeglicher Art verwendet werden.
- Im ersten Teil werden alle Vorbereitungen für das Dialogfeld getroffen, damit es immer im Vordergrund bleibt.
- Dann wird das Dialogfeld definiert. Damit die Millimeterangabe für alle Größen korrekt sind, wird die Schiebereglerskalierung entsprechend berechnet.
- Bei jeder Veränderung des Reglers wird der Rahmen als Kurve mit den entsprechenden Abrundungen gezeichnet.
- Handelt es sich um einen gedrehten Rahmen, wird dieser erst auf 0° gedreht, abgerundet gezeichnet und danach wieder auf den ursprünglichen Wert zurückgedreht. Dies geschieht so schnell, dass der Anwender dies kaum mitbekommt.
Tipp: Richtig Sinn macht dieses Script erst, wenn es als Button in die Standard-Symbolleiste plazieren. |