Editor-Prog - Wie erzeugt diese "gestrichelten Linien"

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Editor-Prog - Wie erzeugt diese "gestrichelten Linien"

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"

Beitrag von NicTheQuick »

Ich hab damals einfach DrawFocusRect_() benutzt.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"

Beitrag von RSBasic »

NicTheQuick hat geschrieben:Ich hab damals einfach DrawFocusRect_() benutzt.
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 
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"

Beitrag 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 :allright:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
#NULL
Beiträge: 2239
Registriert: 20.04.2006 09:50

Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"

Beitrag 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.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"

Beitrag von rolaf »

RSBasic hat geschrieben:Beispielcode für diese API: ...
Wow, interessant. Sieht aus als wenn das Fenster lebt. :mrgreen:
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
#NULL
Beiträge: 2239
Registriert: 20.04.2006 09:50

Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"

Beitrag 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 :)
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"

Beitrag von kswb73 »

#PB_Event_Repaint ? Sorgt dafür das du alles nur neuzeichnest wenn du es musst.
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Benutzeravatar
#NULL
Beiträge: 2239
Registriert: 20.04.2006 09:50

Re: Editor-Prog - Wie erzeugt diese "gestrichelten Linien"

Beitrag 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.
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten