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.
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.
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.
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
structTaste_t{
2
intLinks;
3
intOben;
4
uint8_tCode;
5
}
6
7
structTasten_tTasten[]={
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".