webForumDet fria alternativet

Buttons trycks ner med kod.

.NETur .NET

18 svar · 402 visningar · startad av saw

sawMedlem sedan mars 20011 880 inlägg
#1

Det här låter kanske konstigt, men jag är på jakt efter en kodsnutt för att kunna trycka ner knappar(buttons).

Jag har lagt ett antal knappar, så att det ser ut som ett piano-klaviatur, och jag ville att det skulle synas när man kodvägen trycker på dessa. :birp

nikoMedlem sedan juni 20022 599 inlägg
#2

Det enda jag kan komma på på rak arm är att man via Win32 "fejkar" ett tryck på SPACEBAR (ascii 32):

using System.Runtime.InteropServices;
// ..
const int WM_KEYUP      = 0x101;
const int WM_KEYDOWN = 0x100;
[DllImport("user32.dll", CharSet=CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd,
	int msg,
	IntPtr wParam,
	IntPtr lParam);
// ..
SendMessage(dinknapp.Handle,WM_KEYDOWN, new IntPtr(32), new IntPtr(0));
Application.DoEvents();
System.Threading.Thread.Sleep(300);
SendMessage(dinknapp.Handle,WM_KEYUP, new IntPtr(32), new IntPtr(0));
// ..

Visuellt funkar det bra. (Man får experimentera med sleep-tiden.)

sawMedlem sedan mars 20011 880 inlägg
#3

Hej niko, jag är inte säker på att jag förstår. Säg att det är buton1 och buton två som skall tryckas ner, hur gör jag då?

Tanken med det hela är en "transport" applikation som jag bygger och har med musik att göra.

Jag får bl a fram att akordet C innehåller C E G.
Jag har sedan lagt en massa butons i en label, och fått ett utseende som ett piano-klaviatur, nu anar du vad jag ville, att knapparna trycks ner, så att man kan se akordet.

Marcus EMedlem sedan maj 20021 466 inlägg
#4

Ska du ha en klaviatur fungerar det mycket bättre om du ritar den själv i OnPaint.

nikoMedlem sedan juni 20022 599 inlägg
#5

Säg att det är buton1 och buton två som skall tryckas ner, hur gör jag då?

Det handlar väl mest om att du trycker ner och släpper upp dem samtidigt:

//Tryck ner knappar.
SendMessage(button1.Handle,WM_KEYDOWN, new IntPtr(32), new IntPtr(0));
SendMessage(button2.Handle,WM_KEYDOWN, new IntPtr(32), new IntPtr(0));
Application.DoEvents();

//Släpp upp knappar.
SendMessage(button1.Handle,WM_KEYUP, new IntPtr(32), new IntPtr(0));
SendMessage(button2.Handle,WM_KEYUP, new IntPtr(32), new IntPtr(0));
Application.DoEvents();

Men annars tycker jag nog som Marcus E att det kanske är bättre om du "ritar" tangenterna snarare än att låta dem byggas upp av kontroller.

sawMedlem sedan mars 20011 880 inlägg
#6

Tach men jag undrar om det inte är en överkurs för mig. Jag är glad att jag har kommit så här långt, och ändå så är jag ju tvungen att fråga, titt som tätt.

GladhMedlem sedan maj 20012 812 inlägg
#7

Jag hade nog gjort som Markus föreslår, att använt mig av 2 bilder, en på en nedtryck knapp och en på en knapp som inte är nedtryck, lagt in de i en image och sedan bara byt bild i imagen när en knapp blir nedtryck, och sedan byt tillbaka när knappen in ät nedtryck längre.

- M

sawMedlem sedan mars 20011 880 inlägg
#8

Mera problem

Tack alla ni för förslagen, men faktum är att nikos första förslag fungerar kanon.

Dock där är ett problem...
I t ex VB 6, så gick det ju att lägga buttons indexerat.
(knapp(1),knapp(2)osv), deta gå ju inte här.
Nu är det ju button1, button2 som gäller.
Vad jag nu menar är att jag skulle behöva acossiera namnet dynamiskt.

Jag får fram en ton via TotalKey(min variabel). Denna innehåller ett tal mellan 1 och tolv.
Därefter lite matte:

ett =	Translater.Class1.OmvandTransport(OmvTal(TotalKey));
					tva =	Translater.Class1.OmvandTransport(OmvTal(TotalKey +4));
					tre =	Translater.Class1.OmvandTransport(OmvTal(TotalKey+7));
					ackord = ett + " " + tva + " " + tre;
					ettaTon=Convert.ToInt32(ett);
					tvåaTon=Convert.ToInt32(tva);
					treaTon=Convert.ToInt32(tre);

..där variablerna ettaTon, tvåaTon, treaTon och ibland fyraTon är en integer och innehåller alltså ett tal.

När det sedan gällde att få fram den knappen så hadde jag tänkt..

buton + ettaTon

Tanken är nog god, men jag får ett error.
Något tips på hur jag kan gå förbi detta?

nikoMedlem sedan juni 20022 599 inlägg
#9

Nu är jag inte så musikalisk, men efterom det finns ett konstant antal tangenter på ett klaviatur så kan du väl lägga in alla knappar i en array vid uppstart och sen referera till dem indexerat:

Button[] Tangent=new Button[ANTALET_TANGENTER-1];
Tangent[0]=button0;
Tangent[1]=button1;
Tangent[2]=button1;
// .. osv
SendMessage(Tangent[i].Handle,WM_KEYDOWN, ...
// osv ..
sawMedlem sedan mars 20011 880 inlägg
#10

Det ser ut som om jag lyckas att krabba till det i alla fall.
MAO jag har problem...


private Button[] Tangent;
public int TotalKey;//här ligger det sparat värde 1-12

public int ettaTon;
		public int tvåaTon;
		public int treaTon;
		public int fyraTon;

Button[] Tangent=new Button[13];
			Tangent[0]=button0;
			Tangent[1]=button1;
			Tangent[2]=button2;
			Tangent[3]=button3;
			Tangent[4]=button4;
//osv

ettaTon=0;
			tvåaTon=0;
			treaTon=0;
//osv
ettaTon=TotalKey; 			
tvåaTon=TotalKey +4;				
treaTon=TotalKey+7;
MessageBox.Show(ettaTon.ToString() + tvåaTon.ToString() + 
 treaTon.ToString());//här kan jag se att jag har värden med mig

SendMessage(Tangent[ettaTon].Handle,WM_KEYDOWN, new 
IntPtr(32), new IntPtr(0));

//nu visar jag bara en knapp, och här kommer felet:

An unhandled exception of type 'System.NullReferenceException' occurred in Translater.exe

Additional information: Objektreferensen har inte angetts till en
 instans av ett objekt.

När jag försökte med ANTALET_TANGENTER-1 så fick jag ännu
mera problem...

Det känns som om jag är där i närheten, men jag hittar inte
riktigt det sista.

sawMedlem sedan mars 20011 880 inlägg
#11

NU lyckades jag:

Tangent = new Button[13];

Man skall tydligen inte sitt uppe på nätterna.
Tack alla och framförallt niko.
Det känns snart som om du borde få ett fång rosor :-)

sawMedlem sedan mars 20011 880 inlägg
#12

Så här blev det

Tänkte bara vis hur utseendet blev

applikation.1jpg.jpg
nikoMedlem sedan juni 20022 599 inlägg
#13

saw skrev:

Tänkte bara vis hur utseendet blev

Ser rätt proffsigt ut, tycker jag. Och eftersom tangenter faktiskt uppför sig helt analogt med buttons (de är nere så länge man trycker på dem och uppe annars) så tycker jag faktiskt det inte är en särskilt dum idé att implementera dem som just buttons. I synnerhet som det bara finns 12 av dem.

sawMedlem sedan mars 20011 880 inlägg
#14

Tack för det niko, jag är ganska så nöjd själv. Jag hittade några exempel på nätet ang rita dem, men detta blev mycket bättre.

Det jag funderar på nu är att lägga till midi-ljud el dyl.
Jag har någonstans set hur man kan lägga till ljud, och refferera till en viss frekvens för att få rätt ton, men jag är inte f-n till att hitta det.

Marcus EMedlem sedan maj 20021 466 inlägg
#15

Det är visst en dum idé. ;)

Fast lösningen kanske fungerar för ditt program. I mitt program, där det finns 128 tangenter som man ska kunna spela på, fungerar det inte alls med en knapplösning.

Istället för att leta efter exempel hela tiden bör du fundera på hur du kan lösa det själv. Är det för avancerat bör du börja med något lättare.

sawMedlem sedan mars 20011 880 inlägg
#16

Käkat nubb till frukost?? ;-)
Jag utgår ju hela tiden efter mitt program, men trots det så är jag ganska så säker på att man skulle kunna få det att fungera med fler knappar, kanske inte 128(verkar vara väl många).

Att söka efter lösningar på nätet torde nog vara den bästa lösningen, efter böcker. Hur många böcker man än har, så är det sällan som de uppgifterna passar in på det man skall göra.
Tack och lov så finns sådana här forum, och trots att jag har frågat mycket, och fått mycket hjälp, så är det en droppe i havet, mott de lösningar som jag har hittat, och kunna skriva om för mitt programm.
I och med att man börjar att intressera sig för att programera, så har man skaffat sig problem, men de problemen är till för att lösas, och inte för att man skall sitta som åskådare och popöst säga, "Det är visst en dum idé".
Allting är ju anpassat efter just den applikationen som man håller på med, och därför att jämmföra med en annan applikation på 128 knappar är helt horibelt (bara för att en tangs har en 20-30 hjul så behöver en VW inte ha mer än 4:a).

Marcus EMedlem sedan maj 20021 466 inlägg
#17

Jag skrev det med glimten i ögat. Jag har mycket lång erfarenhet av programmering och vet mycket väl vilken lösning som är bäst för olika situationer. Jag vet inte exakt hur ditt program fungerar, men jag är ganska säker på att en knapplösning är en dålig lösning för ditt program oavsett om det ska vara 128 eller 12 knappar. Det är ingen kritik mot dig, bara en åsikt som jag har.

Visst kan det vara bra att söka efter exempelkod på Internet, men själva nöjet i programmering är för många att självständigt lösa ett problem och eventuellt fråga på Internet när man kör fast. Om man får hela lösningen serverad på guldfat lär man sig inte att lösa problemen själv. Den dagen man inte hittar lösningen på Internet kanske man inte lyckas komma vidare.

Du får ursäkta om jag låter sur, men jag har för närvarande en dålig period i mitt liv.

sawMedlem sedan mars 20011 880 inlägg
#18

Om du har en dålig period av ditt liv,då tycker jag synd om dig, men ger dig ändå ingen rätt trycka ner mig.
Jag får ingenting serverat, jag letar efter lösninga som jag kan i viss mån använda i mitt program.
Att uppfinna hjulet igen, är ingen bra stategi, men att utnytja det och förändra/förbättra är ju efterstävandsvärt.

Jag brukar normalt inte bita ifrån, utan jag brukar lyssna och försöka lära så mycket som möjligt, men använder man den tonen som du hadde, då kan jag inte annat.

Skall vi gräva ner yxan nu och fortsätta programmera?

Marcus EMedlem sedan maj 20021 466 inlägg
#19

Vad pratar du om? Jag har inte tryckt ned dig! Jag har bara föreslagit en i mitt tycke bättre lösning på ett problem.

134 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)