Tastensteuerung in Windows Forms



  • Hallo zusammen,

    ich arbeite zur Zeit an meinem Schulprojekt Tetris. Das Forum hier hat mir schon viel geholfen. Jedoch jetzt steh ich mal wieder auf dem Schlauch und durch langwieriges Suchen im Forum bin ich auch nicht weiter gekommen.

    Also ...

    Ich möchte eine Tastesteuerung machen, die (im Beispiel hier) ein Array neu einfärbt. Soweit so gut. Folgenden Code hab ich.

    private: System::Void Form1_KeyDown(System::Object^  sender, System::Windows::Forms::KeyEventArgs^  e) 
    		{ 
    			switch(e->KeyData) 
                    { 
                        case Keys::Left: 
    						this->F[129]->BackColor = System::Drawing::Color::Firebrick;
                        break; 
    
                        case Keys::Right: 
    						this->F[12]->BackColor = System::Drawing::Color::Firebrick;
                        break;
                    } 
    		}
    

    Es zeigt keine Fehlermeldung und ich habe auch keine aktiven Buttons, die die Tastaturabfrage behindern könnten.

    Danke schonmal für eure Antworten :))

    Anbei ist mein kompletter Code, falls das hilf.

    Oder habe ich den Code auch nur an der falschen Stelle eingefügt?

    #pragma once
    
    namespace TetrisUltimate {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    
    	/// <summary>
    	/// Zusammenfassung für Form1
    	/// </summary>
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    
    			F = gcnew array <Label ^>(500);
    
                int a=1; 
                int b=1; 
                int c=1; 
    
                for(a=1; a<=200; a++) 
                { 
                    F[a] = gcnew Label(); 
                    F[a]->AutoSize = false; 
                    F[a]->BackColor = System::Drawing::Color::IndianRed; 
                    F[a]->Cursor = System::Windows::Forms::Cursors::Hand; 
                    F[a]->Location = System::Drawing::Point(30*c, 30*b); 
                    F[a]->Size = System::Drawing::Size(30, 30);   
                    F[a]->Name = L"F" + Convert::ToString(a); 
                    F[a]->Text = ""; 
    				F[a]->Enabled = false;
                    Controls->Add(F[a]); 
    
                    if(c==10) 
                    { 
                        b=b+1; 
                        c=1; 
                    } 
    
                    else {c++;}
    			}
    
    		}
    
    	array <Label ^> ^F;
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    
    	private: System::Windows::Forms::Label^  lblNext;
    	private: System::Windows::Forms::Label^  lblHold;
    
    	private: System::Windows::Forms::Label^  lblLevel;
    
    	private: System::Windows::Forms::Label^  lblNextName;
    	private: System::Windows::Forms::Label^  lblHoldName;
    	private: System::Windows::Forms::Label^  lblLevelName;
    
    	private: System::Void Form1_KeyDown(System::Object^  sender, System::Windows::Forms::KeyEventArgs^  e) 
    		{ 
    			switch(e->KeyData) 
                    { 
                        case Keys::W: 
    						this->F[129]->BackColor = System::Drawing::Color::Firebrick;
                        break; 
    
                        case Keys::D : 
    						this->F[12]->BackColor = System::Drawing::Color::Firebrick;
                        break;
                    } 
    		}
    
    	private:
    		/// <summary>
    		/// Erforderliche Designervariable.
    		/// </summary>
    		System::ComponentModel::Container ^components;
    
    	#pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Erforderliche Methode für die Designerunterstützung.
    		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    			this->lblNext = (gcnew System::Windows::Forms::Label());
    			this->lblHold = (gcnew System::Windows::Forms::Label());
    			this->lblLevel = (gcnew System::Windows::Forms::Label());
    			this->lblNextName = (gcnew System::Windows::Forms::Label());
    			this->lblHoldName = (gcnew System::Windows::Forms::Label());
    			this->lblLevelName = (gcnew System::Windows::Forms::Label());
    			this->SuspendLayout();
    			// 
    			// lblNext
    			// 
    			this->lblNext->BackColor = System::Drawing::Color::IndianRed;
    			this->lblNext->Location = System::Drawing::Point(360, 30);
    			this->lblNext->Name = L"lblNext";
    			this->lblNext->Size = System::Drawing::Size(300, 120);
    			this->lblNext->TabIndex = 0;
    			// 
    			// lblHold
    			// 
    			this->lblHold->BackColor = System::Drawing::Color::IndianRed;
    			this->lblHold->Location = System::Drawing::Point(360, 180);
    			this->lblHold->Name = L"lblHold";
    			this->lblHold->Size = System::Drawing::Size(300, 120);
    			this->lblHold->TabIndex = 1;
    			// 
    			// lblLevel
    			// 
    			this->lblLevel->BackColor = System::Drawing::Color::IndianRed;
    			this->lblLevel->Location = System::Drawing::Point(360, 330);
    			this->lblLevel->Name = L"lblLevel";
    			this->lblLevel->Size = System::Drawing::Size(300, 60);
    			this->lblLevel->TabIndex = 2;
    			// 
    			// lblNextName
    			// 
    			this->lblNextName->AutoSize = true;
    			this->lblNextName->BackColor = System::Drawing::Color::IndianRed;
    			this->lblNextName->Font = (gcnew System::Drawing::Font(L"Verdana", 14.25F, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point, 
    				static_cast<System::Byte>(0)));
    			this->lblNextName->ForeColor = System::Drawing::Color::Firebrick;
    			this->lblNextName->Location = System::Drawing::Point(364, 36);
    			this->lblNextName->Name = L"lblNextName";
    			this->lblNextName->Size = System::Drawing::Size(67, 23);
    			this->lblNextName->TabIndex = 4;
    			this->lblNextName->Text = L"NEXT";
    			// 
    			// lblHoldName
    			// 
    			this->lblHoldName->AutoSize = true;
    			this->lblHoldName->BackColor = System::Drawing::Color::IndianRed;
    			this->lblHoldName->Font = (gcnew System::Drawing::Font(L"Verdana", 14.25F, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point, 
    				static_cast<System::Byte>(0)));
    			this->lblHoldName->ForeColor = System::Drawing::Color::Firebrick;
    			this->lblHoldName->Location = System::Drawing::Point(364, 186);
    			this->lblHoldName->Name = L"lblHoldName";
    			this->lblHoldName->Size = System::Drawing::Size(70, 23);
    			this->lblHoldName->TabIndex = 5;
    			this->lblHoldName->Text = L"HOLD";
    			// 
    			// lblLevelName
    			// 
    			this->lblLevelName->AutoSize = true;
    			this->lblLevelName->BackColor = System::Drawing::Color::IndianRed;
    			this->lblLevelName->Font = (gcnew System::Drawing::Font(L"Verdana", 14.25F, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point, 
    				static_cast<System::Byte>(0)));
    			this->lblLevelName->ForeColor = System::Drawing::Color::Firebrick;
    			this->lblLevelName->Location = System::Drawing::Point(364, 336);
    			this->lblLevelName->Name = L"lblLevelName";
    			this->lblLevelName->Size = System::Drawing::Size(75, 23);
    			this->lblLevelName->TabIndex = 6;
    			this->lblLevelName->Text = L"LEVEL";
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->BackColor = System::Drawing::Color::Firebrick;
    			this->ClientSize = System::Drawing::Size(690, 660);
    			this->Controls->Add(this->lblLevelName);
    			this->Controls->Add(this->lblHoldName);
    			this->Controls->Add(this->lblNextName);
    			this->Controls->Add(this->lblLevel);
    			this->Controls->Add(this->lblHold);
    			this->Controls->Add(this->lblNext);
    			this->Name = L"Form1";
    			this->Text = L"Tetris";
    			this->ResumeLayout(false);
    			this->PerformLayout();
    
    		}
    #pragma endregion
    
    };
    
    }
    


  • Hallo Todeshuhn,

    was ein Nick!?

    Setze mal einen Haltepunkt, um zusehen ob das Form1_KeyDown ausgelöst wird.
    Ich vermute ein anderes Steuerelement besitzt den Focus, d.h. das der Code in Form1_KeyDown nicht abgearbeitet wird.



  • Ja daran hab ich auch schon gedacht.
    Wie kann ich mir den das Element, das den Focus gerade trägt, anzeigen lassen?



  • Ich habs. ENDLICH :))

    Ich weiß nicht warum es geht, aber ich muss nur _1 anhängen.

    Es sieht nun folgendermaßen aus.

    private: System::Void Form1_KeyDown_1(System::Object^  sender, System::Windows::Forms::KeyEventArgs^  e)
    

    Danach dann eben die Funktion die ausgeführt werden soll.
    Endlich klappt es :))



  • Dann war wahrscheinlich das Event nicht richtig mit der Methode verknüpft.

    Der Form halber würde ich die Methode wieder in

    private: System::Void Form1_KeyDown(System::Object^  sender, System::Windows::Forms::KeyEventArgs^  e)
    

    ändern.
    Der Editor - zumindest bei 2010Prof. - sollte so freundlich sein und Dir so ein Roten Balken am Ende des Namens anzeigen.
    Wenn du darüber fährst und auf die Schaltfläche klickst, erscheint ein Menü. Klicke auf >>"[..]" umbenennen in "[..]"<<.

    Alternativ gehe in den Designer wähle im Eigenschaftenfenster des Formulars die Eventabteilung und wähle bei KeyDown die umbenannte Methode.

    LG 🙂


Anmelden zum Antworten