Seite 1 von 2
Editor-Prog - Wie erzeugt diese "gestrichelten Linien"
Verfasst: 02.11.2010 20:01
von STARGÅTE
Tachchen,
Sry für den Titel, wusste aber nichts besseres.
Hier die Komplette Frage:
Fast alle Editoren von verschiedenen Programmen haben ja bei verschiedenen Werkzeugen/Aktionen immer diese gestrichelten Linien die "über alles drüber schweben" und als Vorschau anzeigen wie es aussehen könnte, was man erstellt, und was sich auch mit Mausbewegungen ändert.
Ich habe leider keine Idee wie ich sowas machen könnte ...
Die Strichellinie an sich ist ja kein Problem, aber wie erzeuge ich sie in dieser imaginären Ebene über dem Editor ?
Eine lösung mit Screen oder Image auf denen diese Linie gezeichnet wird, fällt weg!
Es soll auch "zwischen" Gadget usw. sein, und ein Image dauernd zu aktuallisieren ist zu Ressourcen-fressend und ein Screen geht nicht, weil ich die Editorflächen in Fenstern eins MDIGadget liegen, es also mehrere geben muss.
Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"
Verfasst: 02.11.2010 20:11
von NicTheQuick
Ich hab damals einfach
DrawFocusRect_() benutzt.
Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"
Verfasst: 02.11.2010 20:27
von RSBasic
Beispielcode für diese API:
FGK hat geschrieben:Code: Alles auswählen
If OpenWindow(0, 100, 200, 640,480,"",#PB_Window_SystemMenu|#PB_Window_WindowCentered)
hdc = GetDC_(WindowID(0))
SetRect_(R.RECT,20,20,620,440)
DrawFocusRect_(hdc,R)
Repeat
DrawFocusRect_(hdc,R)
Select Dir
Case 0
R\top+2
R\bottom-2
R\left+2
R\right-2
If R\top>220
Dir =1
EndIf
Case 1
R\top-2
R\bottom+2
R\left -2
R\right+2
If R\top<20
Dir =0
EndIf
EndSelect
DrawFocusRect_(hdc,R)
If WindowEvent() = #PB_Event_CloseWindow ; If the user has pressed on the close button
Quit = 1
EndIf
Delay(10)
Until Quit = 1
EndIf
End
Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"
Verfasst: 02.11.2010 20:39
von STARGÅTE
Ich verstehe, es ist also doch ehr sowas wie:
Line machen,
Pause, Line löschen, neue Line machen,
Pause, neue Line Löschen
Das heißt es geht auch mit PB ... (hier mal auf die schnelle ohne gestrichel)
Code: Alles auswählen
OpenWindow(0, 100, 200, 640,480,"",#PB_Window_SystemMenu|#PB_Window_WindowCentered)
Repeat
StartDrawing(WindowOutput(0))
DrawingMode(4|3)
Box(0,0,x,y)
StopDrawing()
y=WindowMouseY(0)
x=WindowMouseX(0)
StartDrawing(WindowOutput(0))
DrawingMode(4|3)
Box(0,0,x,y)
StopDrawing()
If WaitWindowEvent() = #PB_Event_CloseWindow ; If the user has pressed on the close button
End
EndIf
ForEver
Ich dachte ja es gibt da noch "was besonderes" als das XOr-Prinzip.
Aber danke schon mal für den Link und das Beispiel, hat mir auf jedenfall geholfen

Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"
Verfasst: 03.11.2010 10:09
von #NULL
meinst du einfach nur gestrichelt oder meinst du so eine animierte 'ameisenline' bei der die strichelchen um die fläche wandern?
>> Es soll auch "zwischen" Gadget usw. sein..
meinst du damit zwischen den z-order ebenen?
wieso fällt image weg? ich würde die linen aus kleinen images zusammensetzten und auf den WindowOutput zeichnen. dann sind sie auch ganz oben drauf.
Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"
Verfasst: 03.11.2010 11:03
von rolaf
RSBasic hat geschrieben:Beispielcode für diese API: ...
Wow, interessant. Sieht aus als wenn das Fenster lebt.

Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"
Verfasst: 03.11.2010 12:26
von STARGÅTE
#NULL hat geschrieben:meinst du einfach nur gestrichelt oder meinst du so eine animierte 'ameisenline' bei der die strichelchen um die fläche wandern?
>> Es soll auch "zwischen" Gadget usw. sein..
meinst du damit zwischen den z-order ebenen?
wieso fällt image weg? ich würde die linen aus kleinen images zusammensetzten und auf den WindowOutput zeichnen. dann sind sie auch ganz oben drauf.
Die Art der Line ist erst mal unwichtig ...
Es geht/ging darum, einfach nur n Line/Rahmen auf der Oberfläche (Gadgets+Window+Image) zu Zeichnen ohne das diese beim verschieben immer noch da bleibt, bzw rumflackert.
Da ja Oberflächen nicht mit jedem Frame aktuallisiert werden wie beim Screen, dachte ich da muss es eine andere Lösung geben.
Diese wurde mir ja nun gegeben, Stichwort: XOr-Zeichnen ...
wieso fällt image weg? ich würde die linen aus kleinen images zusammensetzten und auf den WindowOutput zeichnen. dann sind sie auch ganz oben drauf.
Diese würde doch dann aber dort oben drauf "liegen" bleiben, bis der Untergrund aktuallisiert wird, oder was fenster verschoben...
Mit auf Image Zeichnen fällt weg meinte ich: das ich bei jeder Bewegung das gesamte Image (eigentliche Grafiken+Line) neu zeichne -> Ressourcenfressend ...
Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"
Verfasst: 03.11.2010 14:10
von #NULL
xor scheint aber so ohne weiteres nicht auszureichen. mit gadgets im hintergrund entstehen linien-reste, weil sich durch mouseover die gadgetfarben ändern (besonders sichtbar mit xp-skin enabled).
Code: Alles auswählen
OpenWindow(0, 100, 200, 640,480,"",#PB_Window_SystemMenu|#PB_Window_WindowCentered)
For i=0 To 20
For k=0 To 20
ButtonGadget(#PB_Any,10+i*30,10+k*20,25,15,"..")
Next
Next
mode | #PB_2DDrawing_Outlined
mode | #PB_2DDrawing_XOr
mode | #PB_2DDrawing_Transparent
Repeat
StartDrawing(WindowOutput(0))
DrawingMode(mode)
Box(0,0,x,y)
StopDrawing()
y=WindowMouseY(0)
x=WindowMouseX(0)
StartDrawing(WindowOutput(0))
DrawingMode(mode)
Box(0,0,x,y)
StopDrawing()
If WaitWindowEvent() = #PB_Event_CloseWindow ; If the user has pressed on the close button
End
EndIf
ForEver
wenn du es hinkriegst würde mich auf jedenfall die lösung interessieren

Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"
Verfasst: 03.11.2010 22:33
von kswb73
#PB_Event_Repaint ? Sorgt dafür das du alles nur neuzeichnest wenn du es musst.
Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"
Verfasst: 04.11.2010 17:11
von #NULL
das ändert leider nichts an den artefakten vom letzten code. und es beseitigt auch nicht das flackern beim zeichnen direkt auf das fenster, weil du bei jedem mousemove auch ein repaint erzeugen mußt. ich habe auch schon probiert mit InvalidateRect() nur die linien selbst, also nicht das gesamte auswahlrechteck neu zeichnen zu lassen. dann flackert die fläche im rechteck auch nicht mehr, aber die linien flackern trotzdem.
so schlecht finde ich drawFocusRect() auch gar nicht. ist halt nur optisch nicht sehr flexibel nehme ich an.