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
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.
Das Problem ist, die Farben sind festgelegt, alle haben die gleiche Farbe!! leider, sonst wärs eine gute Idee, Danke lg Albert
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.
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;
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.
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!
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.
Wenn die Rechtecke gleichmäßig in einer Matrix angeordnet sind, lässt sich deren Position berechnen ...
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.
>> 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...)
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
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.
> 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.
@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.
>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...)
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.
>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.
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.