Wie überprüft man welches Steuerelemt geklickt wurde?

...komplette Frage anzeigen

3 Antworten

Lass die Finger von zweidimensionalen Listen - das ist eine höchst eigenartige Datenstruktur. Du meinst vermutlich zweidimensionale Arrays (Vektoren/Matrizen).

Zu deiner Frage: Normalerweise macht man das nicht alles selbst. Die entsprechende GUI-Bibliothek sucht das passende Steuerelement für dich heraus und ruft dann eine Callback-Funktion auf oder löst ein Event aus. Wenn du es dennoch selbst machen willst, ist dein letzter Vorschlag schon mal sehr ungeeignet, wie ein Überschlag beweist: Ein Zeiger auf ein Steuerelement ist unter x86 32 Bit, also 4 Bytes, groß. Wenn der Nutzer nun auf "Vollbild" klickt und eine Full-HD-Bildschirm besitzt, haben wir grob überschlagen etwas weniger als 1920 * 1080 = ca. 2000 * 1000 = 2 Mio. Pixel zu verarbeiten. Es fällt davon natürlich noch die Taskbar weg sowie die Titelleiste des Fensters. Aber für eine grobe Rechnung reichts trotzdem: 2 Mio. Pixel * 4 Bytes/Pixel = 8 MB.

Das ist deutlich zu groß für ein effektives Speichermanagement - besser, du machst eine Liste mit Zeigern auf die entsprechenden Objekte. Diese sollen dann eben Funktionen beinhalten, die selbst überprüfen, ob die Maus über dem Objekt ist. Ist etwas schwerer zu implementieren, aber deutlich RAM-effizienter und vermutlich auch schneller, weil nicht jedes Mal, wenn dein Fenster in seiner Größe geändert wird, das Riesen-Pixel-Array neu geschrieben werden muss.

imaginerus 02.07.2013, 21:08

Erstmal: natürlich meinte ich Arrays (ich bin da nur etwas geschädigt von meinem Informatiklehrer, der mich immer anmotzt wenn ich die Teile in Python Arrays und nicht Listen nenne, welche ja eigentlich nur eindimensionale Arrays sind) Eine GUI Bibliothek hat die Nspire API leider nicht, lediglich eine Grafikbibliothek mit der ich die Buttons zeichnen lasse. Der Taschenrechner hat leider nicht ganz HD-Auflösung sondern nur einen nutzbaren Bereich von 212*318=67416 Pixeln. Das ganze wird in Lua geschrieben, das heißt es gibt keine 2-dimensionale Arrays im eigentlichen Sinne, man müsste halt eine Liste von Listen erstellen. Im Optimalfall braucht der Rechner als Zeiger nur ein einfaches Byte, das auf das Steuerelement in einer Liste an übergebenem Index steht, zeigt. Der Rechner hat 32MB Ram (abzüglich OS-Anteil), d. h. mit 67KB bis maximal ca. 200KB müsste ich mir keine Gedanken machen. Aber du hast Recht, effektives Speichermanagement ist das wirklich nicht, deßhalb werde ich wohl die Variante mit der Liste benutzen denn damit kann man auch leichter der Grafikteil umsetzen! Danke für deine Antwort!

0

Da wäre die erste Frage, in welcher Sprache du schreibst. Häufig musst du dich darum nicht selber kümmern, Buttons haben je nach dem ActionListener oder vergleichbares eingebaut. In dem Listener kannst du dann eine beliebige Funktion hinterlegen, die ausgeführt wird, sobald der Knopf gedrückt wird.

imaginerus 02.07.2013, 17:38

Lua unterstützt zwar objektorientiertes Programmieren aber es gibt keine vordefinierten Klassen (jedenfalls nicht so komplexe). Das heißt ich muss alles von der Anfrage bis zur Anzeige selbst machen.

0
Wutklumpen 03.07.2013, 09:43
@imaginerus

Ah, Lua also. Dann ist das natürlich kniffeliger. Dann gefällt mir der Listen-Ansatz ganz gut, aber doch etwas anderes. Ist zwar etwas Handarbeit, aber du kannst dir eine Klasse schreiben, die die Steuerelemente sowie deren Position speichert:

class CoordinatedControl
{
    Control control;
    Int x; //coordinates left upper corner
    Int y;
    Int w; //coordinates right lower coner
    Int h;
}

Das machste für jedes Steuerelement, packst alle diese in eine List/Array/Collection( "allControls"), und prüfst dann:

function Control checkControlsForClick(int clickX,int clickY)
{
    for (Control control in allControls) do
        if(control.x < clickX && control.w > clickX)
            if(control.y < clickY && control.h > clickY)
                return control;
}

Alles Pseudocode, aber am Geiste könnte das so funktionieren. Happy coding!

0
Wutklumpen 03.07.2013, 10:05
@Wutklumpen

Oder kennen ger die Steuerelemente selbst ihre Position und größe? Dann kannst du dir die Hilfsklasse komplett sparen.

0

"neues Kommentar in Antwort"-Notification^^

Was möchtest Du wissen?