Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 07:55

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Events von eigenen glCompos
BeitragVerfasst: So Dez 04, 2005 13:24 
Offline
DGL Member

Registriert: Mi Jul 20, 2005 18:43
Beiträge: 30
Hallo,

So, mein (gl)Menü wächst und wächst. Leider hab ich keine Ahnung wie ich ein OnClick, OnMouseEnter und OnMouseLeave Ereigniss realisieren könnte.

Weil ständig im OnTimer ereigniss die Maus abfragen und überprüfen wo sie gerade ist, ist auch nicht so das wahre. Genausowenig wie wenn ich ein Thread mit einer Endlosschleife erstelle, der dies ständig abfragt.

Hier haben doch schon einige so etwas gemacht, wie habt ihr das realisiert?

MFG
Maximus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 04, 2005 13:40 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 17, 2005 13:19
Beiträge: 98
Wohnort: Jahnsdorf
Wenn Du von TWinControl (oder Nachfolger) ableitest, definierst Du zum Empfangen von Click-Ereignissen einen Handler:

Code:
  1. procedure WMClick(var Message:TMessage); message WM_CLICK;


Innerhalb dieser Routine einfach auf den Click reagieren ;-)

_________________
Administrator of Project Omorphia
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 04, 2005 14:52 
Offline
DGL Member

Registriert: Di Jun 22, 2004 17:40
Beiträge: 51
Wohnort: Aachen
bei dem wincontrol is das aber auch nich anders realisiert als mit ner schleife, die den mist immer wieder abfragt (soweit ich das im info unterricht richtig mitbekommen habe :D ).
von daher wird es auch nich langsamer sein, wenn du ohne wincontrol arbeitest und dir ne eigene schleife baust.

in endeffekt vlt sogar noch ein bisschen schneller, weil du wirklich nur das has, was du brauchst (???).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 04, 2005 15:06 
Offline
DGL Member

Registriert: Mi Jul 20, 2005 18:43
Beiträge: 30
Ich werd das mal testen, aber ich fürchte das die CPU Auslastung bei 99% liegt, was bei anderen Programm mit Events nicht der fall ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 04, 2005 15:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Womit arbeitest du denn?
Eigentlich müsste doch Windows und SDL oder was auch immer auf Events basieren.
Und wenn ein MausMoveEvent kommt, schauste halt, wo die Maus ist.
Und wenn sie über einem Menü ist, setzt du halt ein Flag und die draw-funktion weiß dann, dass sie noch ein menü drüberpappen muss. Oder wenn du was anklickst im menü kannst du ja direkt die procedure daüfr aufrufen.

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 04, 2005 16:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also eine Schleife in der immer abgefragt wird ist mit Sicherheit die schlechteste Art so etwas zu programmieren. Windows ist Eventbasiert. Sprich sobald eine Taste gedrückt wird ein Event ausgelöst. Ich habe es bei mir so gestaltet, dass der die Verwaltungklasse von Außen mit Events gefüttert wird und diese prüft welches das aktuelle Element ist und leitet die Events weiter. Diese Wiederrum verarbeiten die und steuern bei Bedarf ein Neuzeichnen an. Die Ansteuerung bei mir funktioniert derzeit mittels Form.OnKeyDown etc.

Bei OpenGL Komponenten denke ich nicht, dass du dich davor drücken kannst. Also wirst du da selber die ganze Eventverwaltung einbauen müssen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 04, 2005 16:13 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Das Eleganteste sind sicherlich procedurale Pointer oder Methodenzeiger. Hat bei meinen GUIs ganz gut funktioniert.


Beispiel:
Code:
  1.  
  2.  
  3. type
  4.       TEvent = Procedure(Sender : Pointer);
  5.  
  6.       TMouseEvent = Procedure (Sender : Pointer; x, y, Button : Integer);
  7.  
  8.       TGLButton = Object
  9.                                    ....
  10.  
  11.                                    OnClick : TEvent;
  12.  
  13.                                    OnMouseDown,
  14.                                    OnMouseMove,
  15.                                    OnMouseUp : TMouseEvent;
  16.  
  17.                                    .....
  18.                                    Constructor Init;
  19.  
  20.                                    Procedure ButtonPressed;
  21.                          end;
  22. ....
  23.  
  24. Constructor TGLButton.Init;
  25. begin
  26.        .....
  27.        OnClick := NIL;
  28.  
  29.        OnMouseDown := NIL;
  30.        OnMouseMove := NIL;
  31.        OnMouseUp := NIL;
  32.  
  33. end;
  34.  
  35. Procedure TGLButton.ButtonPressed;
  36. begin
  37.        If @OnClick <> NIL
  38.        then
  39.              OnClick(@Self);
  40. end;
  41. ....
  42.  


So in der Richtung, für Methodenzeiger musste halt ein "of object" dahinterpacken.


Wenn du dann dem Button eine Ereignisbehandlungsroutine zuordnen willst:

Code:
  1.  
  2.  
  3. Procedure ButtonClick(Sender : Pointer);
  4. begin
  5. //tu was tolles
  6. end;
  7.  
  8. ...
  9.  
  10. myButton.OnClick := ButtonClick;
  11.  



Die Buttons dann einfach in ne Liste packen, und bei nem Click ins Fenster alle Buttons überprüfen...

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 04, 2005 16:40 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja schon. Aber das ist ja nur oberflächlich. Damit ist ja noch lange nicht geklärt wie die Verarbeitung intern auszusehen hat.

Code:
  1.   If @OnClick <> NIL
  2.   then
  3.      OnClick(@Self);

Also Das @ Kannst dur dir normalerweise sparen. Bei dem OnClick ist es nicht so tragisch aber das @Self halt ich sogar für gefährlich, da Self ja bereits ein Pointer ist und mit @Pointer bekommst du normal die Adresse des Pointervariable. Und das anzusprechen halte ich für nicht ungefährlich. Wobei ich auh gerade sehe, dass du bei deinem Event auch mit Pointern arbeitest. Da wäre es wohl besser, wenn du mit einem TObject wenn nicht sogar mit einem TGUIKlassenBasisObject (oder wie es heißt) arbeitest. Dann kannst du Self auch direkt übergeben und die Delphi Typprüfung bleibt immer erhalten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 04, 2005 16:58 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Zitat:
(soweit ich das im info unterricht richtig mitbekommen habe :D ).
Tielweise. Diese enlose Schleife tut nichts wenn es keine Events ( Massages ) gibt => CPU Auslastung = 0%. Wenn es ein Event gibt, wird er richtig weitergeleitet und entsprechend verarbeitet.

In BallonKiller sources gibt es eine Unit glGUI. Meine Primitive GUI könnte OnClick, OnMouseMove, OnMouseLeave und Dragging verarbeiten.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]