Forum: Mikrocontroller und Digitale Elektronik Tastatur


von Albert Huber (Gast)


Lesenswert?

Hallo,

ich habe eine Tastatur (40 Tasten) auf dem Bildschirm, die aus lauter 
Kreisen bestehen. Ich möchte über diese in meinem Programm Rechtecke 
drüberziehen und wenn in einem Rechteck die Maus gedrückt wird dann wird 
in einem Array der dazupassende Eintrag auf 1 gesetzt.

Mein Problem ist jetzt, ich möchte nicht alle 40 Tasten nach folgender 
Art abfragen:
   if ((TasteX >= 35 && TasteX <= 75) && (TasteY >= 355 && TasteY <= 
395))
    Tastendruck[0] = 1;
   usw. 40x

Weiß vielleicht jemand eine bessere Lösung? mit for oder switch case 
oder so

Vielen Dank für Eure Antworten!!

lg
Albert

von Kai (Gast)


Lesenswert?

Leg dir eine (nicht sichtbare) Bitmap an und fülle den Hintergrund mit 
schwarz (0, 0, 0).
Nun zeichne in dieser Bitmap jeden Button mit einer anderen Farbe, z.B. 
Button 1: (1, 1, 1), Button 2: (2, 2, 2) ...
Wennn du nun einen Mausklick bekommst, so schaust du einfach in der 
Bitmap nach, welche Farbe der entsprechende Pixel hat und schon weißt 
du, auf welchen Button geklickt wurde.

von Albert Huber (Gast)


Lesenswert?

Das Problem ist, die Farben sind festgelegt, alle haben die gleiche 
Farbe!!

leider, sonst wärs eine gute Idee, Danke

lg Albert

von Kai (Gast)


Lesenswert?

Du sollst auf die nicht sichtbare Bitmap mit anderen Farben malen, als 
auf deine eigentlichen Form.
Wenn du in deinem eigentlichen Fenster ein Kreis für einen Button malst, 
dann malst du diesen Kreis auch noch auf die unsichtbare Bitmap, 
allerdings mit einer anderen Farbe und zwar für jeden Button einen 
andere Farbe. Später im Programmlauf, wenn der Benutzer mit der Maus auf 
einen Button klickt bekommst du die Nachricht WM_MOUSEDOWN inkl. der 
Koordinaten. Nun mußt du mit diesen Koordinaten in der unsichtbaren 
Bitmap nachschauen, was diese für eine Farbe an dieser Stelle hat. 
Anhand der Farbe kannst du dann feststellen, welcher Button geklickt 
wurde.

von Albert Huber (Gast)


Lesenswert?

Das ist nicht möglich, die Grafik ist sehr groß und da würd ich dann 
wieder so viel Speicher brauchen,

Ich habs jetzt mal so programmiert für 12 Tasten, bin aber unglücklich 
damit,
kann man das vielleicht irgendwie einfacher machen

  if ((keyX >= 35 && keyX <= dX) && (keyY >= 355 && keyY <= dY))
      mtxKey[8] = 1;
        if ((keyX >= 85 && keyX <= dX) && (keyY >= 355 && keyY <= dY))
      mtxKey[9] = 1;
    if ((keyX >= 135 && keyX <= dX) && (keyY >= 355 && keyY <= dY))
      mtxKey[10] = 1;
    if ((keyX >= 35 && keyX <= dX) && (keyY >= 405 && keyY <= dY))
      mtxKey[17] = 1;
    if ((keyX >= 85 && keyX <= dX) && (keyY >= 405 && keyY <= dY))
      mtxKey[18] = 1;
    if ((keyX >= 135 && keyX <= dX) && (keyY >= 405 && keyY <= dY))
      mtxKey[19] = 1;

    if ((keyX >= 35 && keyX <= dX) && (keyY >= 455 && keyY <= dY))
      mtxKey[24] = 1;
    if ((keyX >= 85 && keyX <= dX) && (keyY >= 455 && keyY <= dY))
      mtxKey[25] = 1;
    if ((keyX >= 135 && keyX <= dX) && (keyY >= 455 && keyY <= dY))
      mtxKey[26] = 1;

    if ((keyX >= 35 && keyX <= dX) && (keyY >= 505 && keyY <= dY))
      mtxKey[33] = 1;
    if ((keyX >= 85 && keyX <= dX) && (keyY >= 505 && keyY <= dY))
      mtxKey[34] = 1;
    if ((keyX >= 135 && keyX <= dX) && (keyY >= 505 && keyY <= dY))
      mtxKey[35] = 1;

von Kai (Gast)


Angehängte Dateien:

Lesenswert?

Es reicht auch, wenn du die Maske mit mit 8-Bit Farbtiefe anlegst. 
Selbst wenn dein Programm den kompletten Bildschirm belegt, dann wäre 
das nur 1,25MB (bei 1280x1024).
Aussehen würde das dann in etwa so, wie auf dem angehängten Bild. Links 
dein Programm mit den vielen Buttons, rechts die Maske, die eigentlich 
nicht sichtbar ist. Ich habe zur besseren Verdeutlichung nur den roten 
Farbkanal benutzt und die Abstände zwischen den Farben auf 10 
vergrößert.

Wenn du deine Buttons in gleichbleibenden Abständen angeordnet hast, 
dann kannst du mit einer kleinen Rechnung aus den x- und y-Werten die 
Zeile bzw. Spalte berechnen und daraus den Index des angeklickten 
Buttons. Die Gültigkeitsbereiche der Mausklicks wären dann halt 
rechteckig und nicht rund wie deine Buttons selbst, aber das machst du 
im Moment ja auch so.

von Kai (Gast)


Lesenswert?

Das könnte etwa so aussehen:

col = ((keyX - 35) / 50);
if (((keyX - 35) % 50) > dX)
{
    // auf keinem Button, da rechts am Button in der Spalte vorbei
    col = -1;
}
row = ((keyY - 355) / 50);
if (((keyY - 35) % 50) > dY)
{
    // auf keinem Button, da unter dem Button in der Zeile vorbei
    row = -1;
}
if ((row != -1) && (col != -1))
{
    index = col + row * ButtonsPerRow;
}

Es kann sein, dass du ein paar Werte noch anpassen mußt!

von G. Nicht (Gast)


Lesenswert?

Warum schreibst Du die Koordinaten der Rechtecke nicht in ein Feld 
(array) und suchst dann mit einer for-Schleife den Index, der der Taste 
entspricht.
Verkürzend brauchst Du bei gleichen Tastengrößen nur X0/Y0 speichern, da 
Ylen und Xlen immer gleich sind.
Wenn die Koordinaten sortiert angelegt sind, kannst Du auch iterativ den 
Feldindex suchen.

von G. Nicht (Gast)


Lesenswert?

... X0/Y0 zu speichern, ...

Soviel Zeit muß sein :-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wenn die Rechtecke gleichmäßig in einer Matrix angeordnet sind, lässt 
sich deren Position berechnen ...

von Karl H. (kbuchegg)


Lesenswert?

Rufus t. Firefly wrote:
> Wenn die Rechtecke gleichmäßig in einer Matrix angeordnet sind, lässt
> sich deren Position berechnen ...

Rechnen? Da müsste man ja nachdenken wie man das
berechnen könnte. Das macht doch heute kein Mensch mehr.
Dafür haben wir ja Computer.

von Rahul, der Trollige (Gast)


Lesenswert?

>> Wenn die Rechtecke gleichmäßig in einer Matrix angeordnet sind, lässt
>> sich deren Position berechnen ...

>Rechnen? Da müsste man ja nachdenken wie man das
>berechnen könnte. Das macht doch heute kein Mensch mehr.
>Dafür haben wir ja Computer.

Rufus hat nur ein paar Buchstaben vergessen:
> Wenn die Rechtecke gleichmäßig in einer Matrix angeordnet sind, lässt
> MAN sich deren Position DURCH DEN COMPUTER berechnen ...

Wenn die Koodinaten (Mittelpunkt) der Kreise und deren Radius bekannt 
sind, kann ziemlich einfach die Grenzen berechnen...(das geht auch auf 
Papier...)

von Albert Huber (Gast)


Lesenswert?

Danke für Eure Beiträge,
ich habs schon, das Problem war auch, dass die Tasten nicht gleichmässig 
angeordnet waren, nur manche, ich habs jetztunterteilt in gleichmäßig 
angeortnete und die anderen eben,
ABER DANKE FÜR EURE IDEEN!!1

lg
Albert

von OlFi (Gast)


Lesenswert?

Bei 40 Tasten in Vollbild Darstellung, hätte jede Taste eine bestimmte 
Höhe und Breite.

z.B.:

4 Zeilen mit jeweils 10 Tasten

1024 --> 102,4 breit
768  -->  192 hoch

Man könnte jetzt die Mauskoordinaten nehmen und durch diese Faktoren 
teilen.

Angenommen der Nullpunkt ist oben links in der Ecke des Bildschirms.

Beispiel:

Mausposition: X0=1000; Y0=700

1000/102,4 = 9,77
700/192  = 3,65

Nachkommastellen sind uninteressant.

Der Cursor steht bei Taste (Taste=3 * 9 = 27

Jetzt füllst du einen String mit 40 Zeichen (z.B. char Zeichen[40])und 
gibst auf dem Bildschrim Zeichen[Taste-1] aus.

von Karl H. (kbuchegg)


Lesenswert?

> angeortnete und die anderen eben,

Wenn sie nicht regelmässig angeordnet sind, dann kannst
du das so machen:
1
struct Taste_t {
2
  int Links;
3
  int Oben;
4
  uint8_t Code;
5
}
6
7
struct Tasten_t Tasten[] = {
8
  { {  35, 104, 1 },   // 'A'
9
    {  85, 104, 2 },   // 'B'
10
    { 120, 102, 3 },   // 'C'
11
    ...
12
  }
13
};
14
15
....
16
17
   TastenCode = -1;
18
19
   for( i = 0; i < sizeof( Tasten ) / sizeof( *Tasten ); ++i ) {
20
     if( ClickPositionX > Tasten[i].Links &&
21
         ClickPositionX < Tasten[i].Links + Tastenbreite &&
22
         ClickPositionY > Tasten[i].Oben &&
23
         ClickPositionY < Tasten[i].Oben + Tastenhöhe ) {
24
       TastenCode = Tasten[i].Code;
25
       break;
26
     }
27
   }
28
29
   // Tastencode enthält hier die Nummer der identifizierten
30
   // Taste oder -1, wenn die Position nicht über einer
31
   // Taste war

Das hat dann den Vorteil, dass neue Tasten sehr einfach
hinzuzufügen sind: Einfach ins Array eintragen.

Wenn die interessierenden Bereiche nicht gleich gross sind,
dann nimmt man auch noch die Breite und Höhe mit in die
Struktur auf.

von G. Nicht (Gast)


Lesenswert?

@Karl-Heinz

Schön, dass Du meine Idee aufgreifst :-)
Wichtig wäre noch, die struct mit den Koordinaten -1,-1 abzuschließen, 
um das Ende variabel zu gestalten.

Damit kann man dann auch unterschiedliche Tastenfelder (z.b. numerische 
Eingabe + variable Parameterlisten) zur Laufzeit zusammenbinden und 
abarbeiten. Beachten muß man dabei nur, dass die Tastencodes 
unterschiedlich sind.
Bei größerem RAM-Speicher macht man soetwas vorteilhaft auf dem heap.

von Rahul, der Trollige (Gast)


Lesenswert?

>Wichtig wäre noch, die struct mit den Koordinaten -1,-1 abzuschließen,
>um das Ende variabel zu gestalten.

Hä? Die Variable-Grösse wird durch das "sizeof"-Gedöns realsiert.
Den dritten Parameter in Karl Heinz Struct könnte man für alles mögliche 
benutzen. Der Tastenindex ist ja schon durch die Schleife vorgegeben 
(Man muß ich sich nur merken...)

von Karl H. (kbuchegg)


Lesenswert?

G. Nicht wrote:

> Wichtig wäre noch, die struct mit den Koordinaten -1,-1 abzuschließen,
> um das Ende variabel zu gestalten.

Schau dir nochmal genau an, wie ich die Endebedingung in
der for-Schleife realisiert habe.

> Bei größerem RAM-Speicher macht man soetwas vorteilhaft auf dem heap.

Beachte auch, dass es den Begriff 'Heap' in C nicht gibt.
Wenn du unter heap das verstehst was ich drunter verstehe
(Speicher, der für malloc/free benutzt wird), dann: nein,
das willst du ganz sicher nicht am heap machen.

von G. Nicht (Gast)


Lesenswert?

>Schau dir nochmal genau an, wie ich die Endebedingung in
>der for-Schleife realisiert habe.

Gut, für eine konstante Tabelle ist das natürlich in Ordnung. Wenn 
jedoch unterschiedliche Tastatur-Layouts verwendet werden, scheint es 
sinvoller, nur eine Suchroutine zu haben, die das Ende der Struktur 
selber erkennen kann.

>... das willst du ganz sicher nicht am heap machen.

Doch, genau dort, dazu ist der Haufen da.
Statische Strukturen im RAM brauchen immer Speicher, auch wenn sie nicht 
aktiv sind. Lokale Strukturen - wenn man sie zusammenbinden will - 
lassen sich zur Laufzeit am besten mit malloc() und free() verwalten. 
Meine Meinung.




von michael k. (Gast)


Lesenswert?

hallo zusammen
ich hab ein problem und zwa is das flachbandkabel von der g15 tastatur 
am display gerissen. hat jemand eine idee oder wo bekommt man ein neues 
display her?
gruss micha

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

@michael k.

dies ist nicht der Sammelthread für alle Hardware und Software Probleme 
im Zusammenhang mit irgendeiner "Tastatur". Mach bitte einen neuen 
Thread auf, denn dein spezielles Problem wird hier niemand suchen und 
vermuten. Und nimm einen gescheiteren Betreff als nur das Wort 
"Tastatur".

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.