[erledigt] B+ Mauszeiger ändern auf Teil von Canvas

Übersicht BlitzBasic BlitzPlus

Neue Antwort erstellen

 

judos

Betreff: [erledigt] B+ Mauszeiger ändern auf Teil von Canvas

BeitragFr, Sep 03, 2010 1:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

Ich habe bereits hier im Forum nachgeschaut und leider nicht die ganze Lösung gefunden.
Ich programmiere gerade an einem BlitzPlus Programm mit Fenstern Canvas etc.
Jetzt möchte ich gerne den Cursor ändern wenn dieser sich über dem Canvas befindet.

Habe bereits diesen Post hier gefunden: https://www.blitzforum.de/foru...php?t=5280
Das funktioniert leider nur halb.
Wenn ich das "SetCursor" nicht in die Hauptschleife tue, dann kommt automatisch der normale Cursor wieder.
Tue ich den Befehl in die Hauptschleife, bleibt der Cursor aber wenn ich die Maus bewege flimmert das ziemlich und man sieht, dass der alte Cursor wieder an seine Stelle treten möchte (dies aber nicht tut wenn man die Maus nicht mehr bewegt.)

Also hat das damit zu tun, dass sich der Cursor wieder herstellt wenn er sich bewegt. Allerdings habe ich keine Ahnung wie das Problem jetzt lösen kann....

Kann mir einer helfen? Ich wäre sehr dankbar!

mfg judos


/edit1:

Habe folgendes bis jetzt herausgefunden:
Bei Hidepointer kann man canvas angeben. Dann wird der Cursor auf dem Canvas versteckt und man kann mit drawimage ein beliebiges Bild als Maus zeichnen. Allerdings bin ich mir noch nicht sicher wann genau sich die Maus auf dem Canvas befindet. Gibts da Möglichkeiten das herauszufinden?

Im Prinzip könnte man ja eine Funktion basteln wo man die Koordinaten im Canvas und auf dem Bildschirm vergleicht. Ändern sich die Koordinaten absolut, aber nicht relativ heisst das die Maus ist nicht mehr im Canvas -> Maus nicht zeichnen.
Finde ich nicht so schön aber ist wohl eine Lösung.

Für Ideen und bessere Vorschläge BITTE melden!

mfg judos


/edit2:

Versuch hat geklappt, allerdings bewegt sich der Mauszeiger aufgrund meines Timers (20fps) ziemlich stockend. War eigentlich für das Programm völlig ausreichend, für die Maus aber unglaublich unschön zum Ansehen... Muss ich wohl noch die Aktualisierung des Canvas noch von der Maus separieren, was aber mühsam sein könnte.


/edit3:

Beim:
BlitzBasic: [AUSKLAPPEN]
Repeat
Select WaitEvent(timer)
Case $4001
Exit
End Select
Forever


Ein Case $203:Exit hat gereicht um das ganze zu verschönern.
Das Problem wäre also somit behoben.

Hätte gerne noch eine Anmerkung ob das ein sinnvoller Weg war oder ob ich etwas noch nicht kenne was man dafür einsetzen könnte. ~~ Vielen Dank!

mfg judos
  • Zuletzt bearbeitet von judos am Fr, Sep 03, 2010 23:53, insgesamt einmal bearbeitet

hazumu-kun

BeitragFr, Sep 03, 2010 20:39
Antworten mit Zitat
Benutzer-Profile anzeigen
"Hidepointer canvas" versteckt den Cursor nur im Bereich des Canvas, nicht außerhalb.
2 Minuten experimentieren hätten es auch getan Wink
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Silver_Knee

BeitragFr, Sep 03, 2010 20:55
Antworten mit Zitat
Benutzer-Profile anzeigen
das hat er ja gesagt, er will nur wissen ob der cursor auf dem canvas ist oder nicht.
 

judos

BeitragFr, Sep 03, 2010 23:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau, ich wollte ja auch dass der Cursor nur auf dem Canvas versteckt wird, also Zweck erfüllt.

Einziges Problem (meiner Ansicht nach nicht weiter schlimm) am Rand des Canvas wird der Cursor abgeschnitten, also ausserhalb des Canvas nicht mehr dargestellt.
Ansonsten ist die Lösung bestens.

Hier der Code falls das jemals wer suchen sollte:

Code für das herausfinden ob die Maus auf dem Canvas ist oder nicht:
BlitzBasic: [AUSKLAPPEN]
Global mouse_mx,mouse_my,mouse_globalx,mouse_globaly,mouse_draw=0

Function canvas_mouse()
mx=MouseX(tab_canvas)
my=MouseY(tab_canvas)
gx=MouseX()
gy=MouseY()
If mx<>mouse_mx Or my<>mouse_my Then
mouse_draw=1
mouse_mx=mx
mouse_my=my
ElseIf mx=mouse_mx And my=mouse_my And (gx<>mouse_globalx Or gy<>mouse_globaly) Then
mouse_draw=0
EndIf
mouse_globalx=gx
mouse_globaly=gy
If mouse_draw=1 Then DrawImage img_cursor,mx-10,my-10
End Function


Und beim Erstellen des Canvas Hidepointer benutzen:
BlitzBasic: [AUSKLAPPEN]
tab_canvas=CreateCanvas(0,0,width,height,panel)
HidePointer tab_canvas
SetBuffer CanvasBuffer(tab_canvas)


Durch die wenigen Antworten schliesse ich darauf, dass es keine (viel) einfachere Lösung dazu gibt.

mfg judos

Silver_Knee

BeitragSa, Sep 04, 2010 0:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
MouseEnter   $205  - Canvas-Handle - Mauskoordinaten
MouseLeave   $206  - Canvas-Handle -

Hmm damit lässt sich doch sicher auch was machen

blackgecko

BeitragSa, Sep 04, 2010 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
@Silver_Knee
Das ist aber nicht sehr zuverlässig. Besonders wenn der Nutzer die Naus schnell über die Canvas-Grenze drüberbewegt, wird oft gar kein Event ausgelöst (in beide Richtungen).
Am zuverlässigsten ist es daher, es über die Mauskoordinaten zu machen.
So long and thanks for all the fish.
Fedora 17 | Windows 7 || BlitzPlus | BlitzMax
Rechtschreibflame GO!!! Deppenapostroph | SeidSeit | Deppenakzent | DassDas | Deppenleerzeichen | TodTot | enzigste.info - Ja, ich sammel die.

hazumu-kun

BeitragSa, Sep 04, 2010 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du den eigenen Cursor am Rand nicht abschneiden willst, könntest du das Canvas etwas größer machen, und einen Rand in Fensterfarbe lassen.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent
 

judos

BeitragSa, Sep 04, 2010 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah stimmt Events hätte es ja auch noch gehabt für den Canvas, wenn die aber unzuverlässig sind, dann besser mit den Mauskoords, das geht da bestens.

Hmm Stimmt der Canvas könnte am Rand etwas grösser sein. Dann müsste man aber auch noch Showpointer, Hidepointer verwenden sobald die Maus den fake-Rand betritt/verlässt.

Naja aber ich glaub ich habe zuwenig Platz dafür. Wenn die Maus ein wenig verdeckt ist, ist das schon okay für mich...

mfg judos

Neue Antwort erstellen


Übersicht BlitzBasic BlitzPlus

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group