Habe gerade kein PB verfügbar, aber mal so ins blaue geraten:
Kann man nicht ein Rect im XOR-Drawmodus zeichnen?
Habe vor langer Zeit mal nen Appelmann-Programm in Delphi geschrieben, da konnte man auch mit der Maus nen Zoom-Rahmen aufziehen.
Vorgehensweise war dann bei mousemove:
- Rect an alte Position mit xor zeichnen
- Rect an neue Position mit xor zeichnen
- neue Position in variablen alte Position speichern
Dann haste zwar u.U. etwas "bunte Linien" (weil XOR mit dem Hintergrund verknüpft), aber Du musst keinen Hintergrund sichern und wiederherstellen.
Der wird durch das zweite XOR-Rect wieder in den Ursprungszustand versetzt.
Ich hoffe, das war einigermaßen verständlich erklärt.
EDIT: Okay hier ist was zum compilieren.
Du müsstest den Rahmen allerdings nur zeichnen, wenn sich die maus bewegt hat. Da habe ich jetzt mal ein bißchen geschludert und den Rahmen immer wieder zeichenen lassen.
; Code für 4.31
Code: Alles auswählen
If OpenWindow(0, 100, 200, 300, 200, "XOR Test")
Mx = -400 : My = -400
StartDrawing(WindowOutput(0))
For t = 0 To 2000
Box (Random(300), Random(200), 4, 4, Random($ffffff))
Next t
StopDrawing()
Repeat
EventID = WaitWindowEvent(25)
If WindowMouseX(0) > 0 And WindowMouseY(0) > 0
StartDrawing(WindowOutput(0))
DrawingMode(#PB_2DDrawing_XOr)
Box(Mx, My, 40, 40)
Box(Mx+1, My+1, 38, 38)
Delay(5)
Box(WindowMouseX(0)-20, WindowMouseY(0)-20, 40, 40)
Box(WindowMouseX(0)-19, WindowMouseY(0)-19, 38, 38)
Mx = WindowMouseX(0)-20 : My = WindowMouseY(0)-20
StopDrawing()
EndIf
Until EventID = #PB_Event_CloseWindow
EndIf
EDIT 2: Komischerwiese funktioniert es nicht mehr, wenn zeitgleich eine Visualisierung des XM-Players (Musikplayer, ähnlich WinAmp) läuft!
Dann gibt es üblen Pixelmüll. Ich vermute, daß die XMP-Visualisierung den Drawmodus ändert. Frage mich dann aber gleich, wieso das Programmübergreifend Auswirkungen hat.
EDIT 3: Das ist ja komisch. Ich habe es jetzt mal auf einem anderen Rechner ausprobiert (ohne den XMPlayer nebenbei laufen zu lassen) und da gibts trotzdem "Pixelschmierer", wenn man die Box heftig über das Fenster zottelt.
Der Schuldige hierfür scheint das Delay(5) zu sein. Nehme ich die Zeile raus, dann arbeitet das Programm völlig sauber.
Kann mir das mal jemand erklären?
EDIT 4: Schön, wenn man seine Fehler selbst erkennt. In der Ruhe liegt die Kraft. Man sollte Beispielcode nicht unter Zeitdruck erstellen.
Das Problem war, daß ich die Mausposition mehrmals abgefragt habe, statt nur einmal und die Werte dann in Variablen zwischenzuspeichern.
Hier jetzt ein funktionierendes Beispiel, das auch nur zeichnet, wenn die Maus bewegt wird:
Code: Alles auswählen
If OpenWindow(0, 100, 200, 600, 600, "XOR Test")
Mxold = -400 : Myold = -400
StartDrawing(WindowOutput(0))
For t = 0 To 2000
Circle (10+Random(580), 10+Random(580), Random(10), Random($ffffff))
Next t
StopDrawing()
Repeat
EventID = WaitWindowEvent(25)
If EventID = 512 ; (Habe für Mousemove keien passende Konstante gefunden)
StartDrawing(WindowOutput(0))
DrawingMode(#PB_2DDrawing_XOr)
Box(Mxold, Myold, 40, 40)
Box(Mxold+1, Myold+1, 38, 38)
Mxnew = WindowMouseX(0) : Mynew = WindowMouseY(0)
Box(Mxnew, Mynew, 40, 40)
Box(Mxnew+1, Mynew+1, 38, 38)
Mxold = Mxnew : Myold = Mynew
StopDrawing()
EndIf
Until EventID = #PB_Event_CloseWindow
EndIf
PS: Man sollte vielleicht 4 Linien für den Rahmen benutzen statt eine "ausgestanzte" Box, aber das spielt für das Beispiel hier ja keine Rolle.