amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > vorgehensweise [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

16.11.2009, 17:39 Uhr

AGSzabo
Posts: 1663
Nutzer
es war hier schonmal thema ist aber untergegangen.

die darstellung und wert-ermittlung meines propgadgets funktioniert und ein notifiziertes gauge zeigt korrekt den eingestellten wert in % an.

aber, ich hätte gern dass die mausposition im verhältnis zum knopf beim schieben an der selben stelle bleibt. jetzt ist es so, dass sich der angriffspunkt zb wenn man nach links slidet, im knopf immer weiter nach links verschiebt, bis man den knopf an seinem aussersten ende links im griff hat wobei der knopf ganz links im kasten ist. nach rechts ist es das selbe blos umgekehrt. ist der regler ganz rechts, vcerschiebt sich auch der angriffspunkt nach ganz rechts im knopf.

ist sicher nur ein kleiner denkfehler in den zeilen wo aus der mausposition die positon des knopfes errechnet wird oder so.

wie macht man es richtig?

mfg,
Andreas
--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1200mhz Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 16.11.2009 um 17:39 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

16.11.2009, 18:14 Uhr

DrNOP
Posts: 4118
Nutzer
Nicht, daß ich sowas schon mal gemacht hätte, und da gibt's sicher ganz tolle Funktionen 'für, aber ich würde folgendermaßen vorgehen:

Als erstes die Mausposition besorgen und feststellen, wo der Zeiger relativ zum Knopf liegt. Und bei allen Verschiebeaktionen würde ich dann den Abstand des Mauszeigers vom linken Knopfrand abziehen. Dann sollte doch der Knopf wieder an dem zuerst gegriffenen Punkt unter der Maus zu liegen kommen - sofern jetzt nicht ich einen Denkfehler gemacht habe.

Wie gehst du denn vor?
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]

16.11.2009, 18:50 Uhr

AGSzabo
Posts: 1663
Nutzer
@DrNOP:

> Wie gehst du denn vor?

1. mausposition aus intuimessage lesen und kantenkoordinate der sliderbox von der mauspos abziehen => pixel_pos im container

2. prop_max (zahl der positionen) minus prop_body (zahl der sichtbaren positionen) => prop_steps (zahl der einstellbaren positionen)

3. pixel_pos * prop_steps / container_pix_size => prop_pos

4. prop_pos an notify ziele senden

5. selbst neuzeichnen unter verwendung von prop_pos, prop_body, prop_max, container_pix_size und min_knob_size

6. spass an der freude haben
--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1200mhz Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 16.11.2009 um 18:51 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

17.11.2009, 11:08 Uhr

DrNOP
Posts: 4118
Nutzer
Etwas abstrakter wär's mir lieber gewesen, aber okay ... ;)

Zitat:
Original von AGSzabo:
1. mausposition aus intuimessage lesen und kantenkoordinate der sliderbox von der mauspos abziehen => pixel_pos im container

2. prop_max (zahl der positionen) minus prop_body (zahl der sichtbaren positionen) => prop_steps (zahl der einstellbaren positionen)

3. pixel_pos * prop_steps / container_pix_size => prop_pos

Eben. Damit rechnest du dir die Mausposition *im Container*. Sprich: Wenn die Maus ganz links *im Container* ist, dann steht auch dein Knopf ganz links. Da fehlt die Größe des Knopfes (bzw. die Position des Zeigers innerhalb des Knopfes) in der Berechnung.

Zitat:
6. spass an der freude haben
Wie ich's vor Jahren mal in einer Programmanleitung gelesen habe?
"What you need to run this program:
A few bytes of memory, one big beer and two busty babes"...
:D
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]

17.11.2009, 12:04 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von DrNOP:
Als erstes die Mausposition besorgen und feststellen, wo der Zeiger relativ zum Knopf liegt. Und bei allen Verschiebeaktionen würde ich dann den Abstand des Mauszeigers vom linken Knopfrand abziehen. Dann sollte doch der Knopf wieder an dem zuerst gegriffenen Punkt unter der Maus zu liegen kommen - sofern jetzt nicht ich einen Denkfehler gemacht habe.

An sich richtig, nur ein wenig zu kompliziert. Wenn der Mausknopf runtergedrückt wird, merkst Du Dir die Position, egal zu was die relativ ist. Wenn die Maus bewegt wurde, bestimmt die Differenz zwischen der neuen Position und der gemerkten Position die Bewegung, egal zu was die relativ sind, solange die Basis dieselbe ist.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

17.11.2009, 12:41 Uhr

DrNOP
Posts: 4118
Nutzer
Äh, ja, logisch irgendwie... :D

Und um die gleiche Differenz muß sich halt der Knopf auch bewegen, sofern er's kann. Am Anschlag der Leiste sollte er halt aufhören damit. ;)
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]

18.11.2009, 03:57 Uhr

AGSzabo
Posts: 1663
Nutzer
@DrNOP:

> Da fehlt die Größe des Knopfes (bzw. die Position des Zeigers innerhalb des Knopfes) in der Berechnung.

ehm ja, das habe ich vermutet. wie rechne ich richtig?
--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1200mhz Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

18.11.2009, 09:41 Uhr

DrNOP
Posts: 4118
Nutzer
Hat Holger doch schon gesagt:

Du hast zwei Mauspositionen, rechnest dir die Differenz dazwischen aus und bewegst den Knopf um diese Differenz.
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]

18.11.2009, 10:14 Uhr

AGSzabo
Posts: 1663
Nutzer
@DrNOP:

> Du hast zwei Mauspositionen, rechnest dir die Differenz dazwischen aus und bewegst den Knopf um diese Differenz.


kann ich machen aber wie komme ich von dieser pixelposition auf den proportionalen enstellwert? wenn zb das proportionale maximum $fff ist und die propotionale größe des knopfes $111 ist? ich meine nicht die pixelgrößen, die habe ich ja schon und daraus will ich die proportionalen werte errechnen.


--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1200mhz Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

18.11.2009, 13:40 Uhr

AGSzabo
Posts: 1663
Nutzer
so schaut im moment die berechnung des prop.-wertes aus der pixelpos aus. ist aber offenbar falsch...

code:
move.w	xuiSl_softmax(a3),d0		; höchster prop. wert
mulu.w	xuiSl_pixpos(a3),d0		; * position des knobs in pixeln realtiv zum rand
move.w	xuiSl_pixsize(a3),d1		; pixelgröße des containers
sub.w	xuiSl_knobpix(a3),d1		; - pixelgröße des knobs
divu.w	d1,d0				; /
move.w	d0,xuiSl_softval(a3)		; = prop. wert

--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1200mhz Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 18.11.2009 um 13:40 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

18.11.2009, 18:22 Uhr

Holger
Posts: 8116
Nutzer
@AGSzabo:
Das ist nicht anders als bei den Arbeitsschritten einer Progress-Bar. Du erinnerst Dich?

Dein Wertebereich besitzt nicht nur ein Maximum, sondern auch einen Bereich innerhalb des Wertebereichs, der z.B. den sichtbaren Bereich eines scrollbaren Dokuments oder eben die Größe eines Arbeitsschrittes darstellt. Der bestimmt die Knopf-Größe, es sei denn, dieser würde zu klein werden.

Der Skalierungsfaktor ist jetzt (maximum-visible)/(container-knob)
Und damit siehst Du auch, was bei Deinem Code fehlt...

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

18.11.2009, 18:51 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

ok, habe ich umgesetzt und es geht jetzt soweit:

(maximum-visible)*pixpos/(container-knob)

Allerdings, wenn die maus den rand des gadgets verlässt oder der knopf an den rand kommt, wird der neue angriffspunkt richtung rand des knobs und darüber hinaus verschoben, der sollte aber auch dann gleich bleiben, aus kosmetischen- und gewohnheitsgründen.

danke!

code:
; pixpos um mausdistanz verändern, ränder beachten,
; softval = (maximum-visible)*pixpos/(container-knob)

		move.w	xuiSl_mousepos(a3),d0
		move.w	im_MouseY(a1),xuiSl_mousepos(a3)

		move.w	xuiSl_pixsize(a3),d1
		sub.w	xuiSl_knobpix(a3),d1

		sub.w	im_MouseY(a1),d0
		sub.w	d0,xuiSl_pixpos(a3)
		bge.b	.greater

		clr.w	xuiSl_pixpos(a3)
		bra.b	.calc

.greater 	cmp.w	xuiSl_pixpos(a3),d1
		bge.b	.calc

		move.w	d1,xuiSl_pixpos(a3)

.calc		move.w	xuiSl_softmax(a3),d0
		sub.w	xuiSl_softbody(a3),d0
		mulu.w	xuiSl_pixpos(a3),d0
		divu.w	d1,d0

		move.w	d0,xuiSl_softval(a3)
		bra	.redraw

--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1200mhz Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 18.11.2009 um 19:31 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

18.11.2009, 19:52 Uhr

AGSzabo
Posts: 1663
Nutzer
ok, problem gelöst:

code:
; pixpos um mausdistanz verändern, ränder beachten,
; softval = (maximum-visible)*pixpos/(container-knob)

		move.w	xuiSl_mousepos(a3),d0

		move.w	xuiSl_pixsize(a3),d1
		sub.w	xuiSl_knobpix(a3),d1

		sub.w	im_MouseY(a1),d0
		sub.w	d0,xuiSl_pixpos(a3)
		bge.b	.greater

		clr.w	xuiSl_pixpos(a3)
		bra.b	.calc

.greater 	cmp.w	xuiSl_pixpos(a3),d1
		bge.b	.pos

		move.w	d1,xuiSl_pixpos(a3)
		bra.b	.calc

.pos		move.w	im_MouseY(a1),xuiSl_mousepos(a3)

.calc		move.w	xuiSl_softmax(a3),d0
		sub.w	xuiSl_softbody(a3),d0
		mulu.w	xuiSl_pixpos(a3),d0
		divu.w	d1,d0

		move.w	d0,xuiSl_softval(a3)
		bra	.redraw


nur gelegentlich scheint sich da noch was zu verschieben. wenn ich den knops an einer stelle anpacke und schnell hoch und runter bewege, bleibt er irgendwann stehen oder der angriffspunkt verschiebt sich doch.

--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1200mhz Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 19.11.2009 um 09:06 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

19.11.2009, 10:59 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
Allerdings, wenn die maus den rand des gadgets verlässt oder der knopf an den rand kommt, wird der neue angriffspunkt richtung rand des knobs und darüber hinaus verschoben, der sollte aber auch dann gleich bleiben, aus kosmetischen- und gewohnheitsgründen.

Wenn der Angriffspunkt absolut stabil bleiben soll, gehe wie folgt vor:

Wenn der Mausbutton herunter gedrückt wird:
  • merkst Du Dir Mausposition und aktuellen Wert des Gadgets

    Wenn die Maus bei gedrücktem Button bewegt wird:
  • errechnest Du aus Mausposition und Differenz zu der gemerkten Position die Wertedifferenz und mit dieser Differenz und dem gemerkten Wert den neuen Wert
  • beschneidest den neuen Wert auf den gültigen Wertebereich
  • setzt den neuen Wert und zeichnest das Gadget neu

    Damit werden Rundungsfehler minimiert und auch das Beschneiden des Wertes verändert keine Pixelpositionen. Es sollte offensichtlich sein, dass bei dieser Vorgehensweise beim Zurückkehren zur ursprünglichen Mausposition auch immer der ursprüngliche Wert erreicht wird, egal, wie die Maus zwischendurch bewegt wurde.

    --
    Good coders do not comment. What was hard to write should be hard to read too.

    [ - Antworten - Zitieren - Direktlink - ]

  • 19.11.2009, 12:34 Uhr

    AGSzabo
    Posts: 1663
    Nutzer
    @Holger:

    ok, habe ich so gemacht. aber, nur gelegentlich scheint sich da noch was zu verschieben. wenn ich den knops an einer stelle anpacke und schnell hoch und runter bewege, bleibt er irgendwann stehen und bewegt sich garnimmer bis ich die maus nochmal drücke, oder der angriffspunkt verschiebt sich doch. bei normaler langsamer bewegung ist der angriffspunkt aber immer der selbe, selbst wenn ich mit der maus den container vorrübergehend verlasse.

    --
    Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1200mhz Ubuntu Linux

    [ Dieser Beitrag wurde von AGSzabo am 19.11.2009 um 12:39 Uhr geändert. ]

    [ - Antworten - Zitieren - Direktlink - ]


    -1- [ - Beitrag schreiben - ]


    amiga-news.de Forum > Programmierung > vorgehensweise [ - Suche - Neue Beiträge - Registrieren - Login - ]


    .
    Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
    Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
    .