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

amiga-news.de Forum > Programmierung > Mausklick abfragen (C) [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

06.09.2007, 15:55 Uhr

MaikG
Posts: 5172
Nutzer
Ich brauche nur einen Mausklick, aber sowas simples ist in
C natürlich wieder ein Problem.
Gagets und so gehen myimsgCode wurde bissher noch nicht verwendet.
Ich bekomme Enforcer-Hits wenn ich ins Fenster klicke, klammere
ich if (myimsgCode==SELECTDOWN) aus gehts ohne Hits.

myimsgCode soll keinen Pointer zu irgend etwas enthalten sondern
nur den verdammten code, ich hab schon * und & bei allen sachen durch.



code:
struct Window *win;
    struct IntuiMessage *mess;
    struct Gadget *glist = NULL;
    struct Gadget *gad;
    struct NewGadget ng = {0};
    BOOL running;
    UWORD thetopborder;
    UWORD myimsgCode; // auch ULONG probiert
    WORD ret=0;
    UBYTE *stringptr;
    ULONG selgad;
    ULONG junk;
    struct Gadget *mygad;
    WORD WIPX, WIPY;






          running = TRUE;
             do      {
                     if (Wait ((1L << win->UserPort->mp_SigBit) | SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C)
                     running = FALSE;
                     while (mess = GT_GetIMsg (win->UserPort))
                     {
                      myimsgCode = mess->Code;
                      switch (mess->Class)
                                                            {
                                                    case IDCMP_MOUSEBUTTONS:
                                                           if (myimsgCode==SELECTDOWN) {
                                                           WIPX=mess->MouseX;
                                                           WIPY=mess->MouseY;
                                                            break;
                                                           }
                                                    case IDCMP_GADGETDOWN:
                                                    case IDCMP_GADGETUP:
                                                            gad = (struct Gadget *) mess->IAddress;
                                                            selgad = gad->GadgetID;
                                                            switch(selgad)
                                                                    {
                                                            case 0:
                                                                    ret=1;
                                                                    GT_GetGadgetAttrs (gad,win,NULL,GTST_String,&stringptr,TAG_END);
                                                                    strncpy (searchstring,stringptr,63);
                                                                    running = FALSE;
                                                                    break;
                                                            break;
                                                    case IDCMP_CLOSEWINDOW:
                                                            running = FALSE;
                                                            break;
                                                    case IDCMP_REFRESHWINDOW:
                                                            GT_BeginRefresh (win);
                                                            GT_EndRefresh (win,TRUE);
                                                            break;
                                                            }
                                                    GT_ReplyIMsg (mess);
                                                    }
                                            }
                                    while (running);

                                    CloseWindow (win);
                                    }
                            }


[ Dieser Beitrag wurde von MaikG am 06.09.2007 um 17:51 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

06.09.2007, 16:04 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Probiers doch mal so:
code:
switch (mess->Class)
            {
            case IDCMP_MOUSEBUTTONS:
            if (mess->Code&0x80 == 0) {
                WIPX=mess->MouseX;
                WIPY=mess->MouseY;
                MouseButtonID = mess->Code & 0x3;
                break;
            }


--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

06.09.2007, 16:17 Uhr

thomas
Posts: 7717
Nutzer
@MaikG:

Wenn du so viel herumprobiert hast, dann solltest du das alles auch aufschreiben. Vor allem darfst du nicht die Hälfte des Programms weglassen, wenn du Hilfe möchstest.

Du sagst, du bekommst Enforcer-Hits, wenn du myimsCode verwendest. Das ist Unsinn. Weder myimsgCode = irgendwas noch myimsgCode == irgendwas kann einen Enforcer-Hit auslösen.

Was allerdings sehr wohl Hits auslösen kann, ist mess->irgendwas. Um das herauszufinden, ist es wichtig, wo du das ReplyMsg hingestellt hast.

mess = GetMsg(...);
myimsgCode = mess->Code;
ReplyMsg (mess);
switch (mess->Class) <--- hier gibt es den Hit, weil "mess" bereits ungültig ist.

mess = GetMsg(...);
myimsgCode = mess->Code;
switch (mess->Class)
{
}
ReplyMsg (mess);

So würde es funktionieren.

Edit: hier ist ein Beispiel, wie man Maus-Klicks und -Bewegungen mit IDCMP abfragen kann: http://thomasrapp.homepage.t-online.de/examples/draw.c

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomasrapp.homepage.t-online.de/

[ Dieser Beitrag wurde von thomas am 06.09.2007 um 16:21 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

06.09.2007, 17:04 Uhr

MaikG
Posts: 5172
Nutzer
>Probiers doch mal so:


Und warum wird da maskiert?




>Wenn du so viel herumprobiert hast, dann solltest du das alles auch
>aufschreiben.

Warum aufschreiben was nicht funktioniert?


>Was allerdings sehr wohl Hits auslösen kann, ist mess->irgendwas.

mess->Code ist doch gültig?


>Um das herauszufinden, ist es wichtig, wo du das ReplyMsg hingestellt
>hast.


Das Reply steht hinter dem ganzen - ich greife nicht auf
etwas zu was schon weg ist.


>switch (mess->Class)

Ja aber warum, ein switch nehme ich wenns mehrere ergebnisse
geben kann und es übersichtlicher sein soll.
Bei sowas nehme ich lieber == oder kann C keine einfachen Variablen
richtig vergleichen?

[ - Antworten - Zitieren - Direktlink - ]

06.09.2007, 17:19 Uhr

Der_Wanderer
Posts: 1229
Nutzer
In den mess->Code Wert sind verschiedene Dinge hineincodiert, z.B. ob gedrückt oder nicht gedrückt, oder welcher Mousebutton gedrückt wurde.

Mit Code&0x80 maskierst du das Bit aus, welches den Gedrückten Zustand anzeigt, bzw. Release. also 0x80 gesetzt = Release, gelöscht = Button Gedrückt.

--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

06.09.2007, 17:22 Uhr

thomas
Posts: 7717
Nutzer
Du solltest dir mal einen vernünftigen Einrückungsstil angewöhnen. Z.B. sollten die } immer genau unter den dazugehörigen { stehen. Dann kann man mit der Klammernsuche im Editor und der Spaltenanzeige einfach herausfinden, ob jede } zu der { gehört, zu der sie gehören soll. Außerdem sollten nie zwei geschachtelte { in der selben Spalte stehen. Dazu ist Einrücken da, daß man Schachtelungen erkennt.

In dem Code-Stück oben stimmen die { und } jedenfalls nicht überein. Die { von dem do endet hinter dem CloseWindow. Das solltest du erstmal aufräumen.

Und dann schreib doch bitte dazu, welchen Teil du rausnehmen mußt, damit keine Hits auftreten.

Und die Deklarationen der Variablen sind auch nicht unerheblich.

Wenn ich in den Code das hinein interpretiere, was ich denke, das du meinst, dann kann ich keinen Fehler entdecken. Deshalb kann ich auch nicht sagen, ob der Fehler daran liegt, daß du mit den Klammern durcheinander gekommen bist, oder daß er außerhalb des Codestücks liegt.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomasrapp.homepage.t-online.de/


[ Dieser Beitrag wurde von thomas am 06.09.2007 um 17:24 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

06.09.2007, 17:47 Uhr

thomas
Posts: 7717
Nutzer

Jetzt habe ich es doch noch gefunden:

code:
case IDCMP_MOUSEBUTTONS:
       if (myimsgCode==SELECTDOWN) {
       WIPX=mess->MouseX;
       WIPY=mess->MouseY;
        break;
       }
case IDCMP_GADGETDOWN:
case IDCMP_GADGETUP:
        gad = (struct Gadget *) mess->IAddress;
        selgad = gad->GadgetID;


Das break steht in dem { }-Block vom if. D.h. du springst nur dann aus dem switch heraus, wenn der Code == SELECTDOWN ist. Bei jedem anderen Code (also z.B. wenn der Benutzer die Maus losläßt), dann läufst du weiter in den GADGETDOWN/GADGETUP-Zweig. Dieser liest IAddress, das geht noch. Aber das Lesen von GadgetID erwartet natürlich eine gültige IAddress, das ist sie aber nicht. (Welches Gadget sollte das bei IDCMP_MOUSEBUTTONS auch sein ?)

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomasrapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

06.09.2007, 17:48 Uhr

MaikG
Posts: 5172
Nutzer
>Mit Code&0x80 maskierst du das Bit aus, welches den Gedrückten Zustand anzeigt, bzw. Release. also 0x80 gesetzt = Release, gelöscht = Button Gedrückt.

Mh, und warum geht ==SELECTDOWN nicht?


>Du solltest dir mal einen vernünftigen Einrückungsstil angewöhnen.


sry.


>Und dann schreib doch bitte dazu, welchen Teil du rausnehmen mußt, damit keine Hits auftreten.

Hatte ich doch nur den vergleich

if (myimsgCode==SELECTDOWN) { }

Das zwischen { } kann stehen bleiben.


>Und die Deklarationen der Variablen sind auch nicht unerheblich.

Ergänze ich gleich.

>Wenn ich in den Code das hinein interpretiere, was ich denke, das
>du meinst, dann kann ich keinen Fehler entdecken.

Ich auch nicht, weshalb ich mich ja so ärgere.

>Deshalb kann ich auch nicht sagen, ob der Fehler daran liegt,
>daß du mit den Klammern durcheinander gekommen bist, oder daß er
>außerhalb des Codestücks liegt.

Ausserhalb kann nichts schief gehen, weil folgendes das einzig
neue ist(ausser IDCMP_MOUSEBUTTONS beim Fenster)

code:
case IDCMP_MOUSEBUTTONS:
                                                               if (myimsgCode==SELECTDOWN) {
                                                               WIPX=mess->MouseX;
                                                               WIPY=mess->MouseY;
                                                                break;
                                                               }


[ - Antworten - Zitieren - Direktlink - ]

06.09.2007, 17:54 Uhr

thomas
Posts: 7717
Nutzer
Zitat:
Code&0x80

Das heißt Code & IECODE_UP_PREFIX :)

Zitat:
Hatte ich doch nur den vergleich

if (myimsgCode==SELECTDOWN) { }

Das zwischen { } kann stehen bleiben.

...

Ausserhalb kann nichts schief gehen, weil folgendes das einzig
neue ist(ausser IDCMP_MOUSEBUTTONS beim Fenster)


Siehe oben.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomasrapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

06.09.2007, 18:03 Uhr

MaikG
Posts: 5172
Nutzer
>Siehe oben.

verdammt, das klingt natürlich logisch.

Bei Basic war man glaube ich bei Select immer automatisch draussen wenn
eins zutraf. Muss mich erst noch ans break gewöhnen.


Läuft, danke!

[ Dieser Beitrag wurde von MaikG am 06.09.2007 um 18:06 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

09.09.2007, 19:00 Uhr

DrNOP
Posts: 4118
Nutzer
Nur um das noch hinterherzuwerfen:
Zitat:
Original von MaikG:
>Wenn du so viel herumprobiert hast, dann solltest du das alles auch
>aufschreiben.

Warum aufschreiben was nicht funktioniert?

Damit du weißt, daß du das schon probiert hast und es nicht noch fünfmal probierst mit dem gleichen Ergebnis. Was meinst du, warum du für deine Klassenarbeiten nicht nur Noten bekommen hast sondern auch deine Fehler markiert wurden? Nur damit der Lehrer nachweisen kann daß er die Note nicht gewürfelt hat?

Zitat:
>Was allerdings sehr wohl Hits auslösen kann, ist mess->irgendwas.

mess->Code ist doch gültig?

In allen Fällen? Immer? Jederzeit? Wohl kaum! Deshalb ja das Beispiel mit dem ReplyMsg: Ein Zeiger ist immer nur so lange gültig, bis der Speicher auf den er zeigt, freigegeben wurde. Danach ist er eben nicht mehr gültig.
In deinem Fall mag er gültig sein, der Sinn der Übung ist, daß du darauf immer achten mußt.

Zitat:
>Mit Code&0x80 maskierst du das Bit aus, welches den Gedrückten Zustand anzeigt, bzw. Release. also 0x80 gesetzt = Release, gelöscht = Button Gedrückt.

Mh, und warum geht ==SELECTDOWN nicht?

Das geht vielleicht schon - aber nur, solange kein anderer Zustand aufgetreten ist. das SELECTDOWN ist ja nur eins von mehreren Bits. Mit deiner Abfrage willst du wissen, ob Code == 0x80. Falls Code == 0x81 oder Code == 0x8F oder sonstwas ist, klappt deine Abfrage nicht mehr. Was dich allerdings interessiert ist Code == 0x8n. Dir sind alle anderen Bits dieses Bytes egal, nur eben das höchstwertge nicht.

Und falls du dir nicht zusätzlich zu den Namen ("SELECTDOWN" etc.) nicht doch noch die Bitmuster merken müssen willst, dann sollte auch das hier klappen:
if (Code & SELECTDOWN == SELECTDOWN){...
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]

09.09.2007, 19:17 Uhr

thomas
Posts: 7717
Nutzer
@DrNOP:

Zitat:
if (Code & SELECTDOWN == SELECTDOWN){...

Junge, das ist Blödsinn.

SELECTDOWN ist der Code für das Drücken der linken Maustaste, und zwar alle 8 Bits. Ein Ausmaskieren mit diesem Code macht keinen Sinn. Du verwechselst das mit IECODE_UP_PREFIX (siehe meine Antwort oben).

aus intuition/intuition.h :
code:
#define SELECTUP	(IECODE_LBUTTON | IECODE_UP_PREFIX)
#define SELECTDOWN	(IECODE_LBUTTON)
#define MENUUP		(IECODE_RBUTTON | IECODE_UP_PREFIX)
#define MENUDOWN	(IECODE_RBUTTON)
#define MIDDLEUP	(IECODE_MBUTTON | IECODE_UP_PREFIX)
#define MIDDLEDOWN	(IECODE_MBUTTON)


Gruß Thomas


--
Email: thomas-rapp@web.de
Home: thomasrapp.homepage.t-online.de/

[ Dieser Beitrag wurde von thomas am 09.09.2007 um 19:17 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

09.09.2007, 21:47 Uhr

DrNOP
Posts: 4118
Nutzer
Zitat:
Original von thomas:
Junge, das ist Blödsinn.

Okay ... sowas kommt 'raus, wenn man nicht selbst probiert was man empfiehlt. :glow: :(
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Mausklick abfragen (C) [ - Suche - Neue Beiträge - Registrieren - Login - ]


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