KeyDown Event innerhalb eines Panels



  • Folgendes Problem:

    Einige von euch haben es bestimmt schon mitbekommen - es geht um eine Sidebar.
    Auf der Sidebar selber befindet sich ein Panel Element in etwa der selben größe.

    Meine Plugins füge ich zu den Controls des Panel Elements hinzu und instanziere sie via:

    Sidebar::iconpanel^ instanz2 = gcnew Sidebar::iconpanel (this);	
    		instanz2->TopLevel = false;
    		instanz2->Dock = DockStyle::None;
    		panel1->Controls->Add(instanz2);
    		instanz2->Show ();
    		panelanzahl++;
    

    Nun gibt es bei der ganzen Sache einen MoveModus um die ganze Sache von Hand neu zu ordnen. Hierzu benutzte ich das KeyDown Event in der Basisklasse der "PlugIn - Panels".

    void Sidebar::panelklasse::mousemoveevent (System::Windows::Forms::KeyEventArgs^  e)
    	{
    	if (movemodus != 1 || this->Location.Y < 0 || this->Location.Y > form1instanz->Size.Height) return;
    
    	System::Drawing::Rectangle thisbounds = this->Bounds;
    	System::Drawing::Point temppoint, thislocation, panellocation;	
    
    	if (e->KeyCode == Keys::Down)
    		{
    		// <-- prüfen ob verschieben nach unter überhaupt möglich -->//
    		if ( (this->Location.Y + this->Size.Height) > (form1instanz->Size.Height - this->Size.Height) ) return;
    
    		thisbounds.Height = thisbounds.Height + ABSTAND; // <-- wegen überschneidungsschwierigkeiten beim verschieben, ansonsten werden die Panels überlagert
    
    		// <-- alle Panels durchlaufen
    		for each (Control^ panel in panelliste)
    			{
    			if (panel == this) continue;
    
    			// <-- prüfen ob Bounds des aufrufenden Panels sich mit einem anderen überschneiden
    			if (thisbounds.IntersectsWith (panel->Bounds) == true ) 
    
    					{	
    					// <-- hier noch prüfen ob das verschobene Panel gleich groß ist,
    					// <-- bzw. ob die neue Postion genug Platz bietet
    
    					/*** Bounds vertauschen ***/					
    					temppoint = this->Location;
    					this->Location = panel->Location;
    					panel->Location = temppoint;
    					SetCursorPos (this->Location.X + (this->Size.Width / 2), this->Location.Y + (this->Size.Height / 2));					
    					return;
    					}	
    
    			}// <-- Ende überschneidungsabfrage
    			// <-- Panels überschneiden sich nicht -->
    			this->Location = System::Drawing::Point ( this->Location.X, this->Location.Y + this->Size.Height);
    			SetCursorPos (this->Location.X + (this->Size.Width / 2), this->Location.Y + (this->Size.Height / 2));
    
    			return;
    			} // Ende KeyDown DOWN
    
    	else if (e->KeyCode == Keys::Up)
    		{
    		// <-- prüfen ob verschieben nach oben überhaupt möglich -->//
    		if ( (this->Location.Y - this->Size.Height) < 0) return;
    
    		thisbounds.Y = thisbounds.Y - ABSTAND; // <-- wegen überschneidungsschwierigkeiten beim verschieben, ansonsten werden die Panels überlagert
    
    		// <-- alle Panels durchlaufen
    		for each (Control^ panel in panelliste)
    			{
    			if (panel == this) continue;			
    
    			// <-- prüfen ob Bounds des aufrufenden Panels sich mit einem anderen überschneiden
    			if (thisbounds.IntersectsWith (panel->Bounds) == true )
    					{	
    					// <-- hier noch prüfen ob das verschobene Panel gleich groß ist,
    					// <-- bzw. ob die neue Postion genug Platz bietet
    
    					/*** Bounds vertauschen ***/
    					temppoint = this->Location;
    					this->Location = panel->Location;
    					panel->Location = temppoint;
    					SetCursorPos (this->Location.X + (this->Size.Width / 2), this->Location.Y + (this->Size.Height / 2));					
    					return;
    					}
    
    			} // Ende überschneidungsabfrage			
    			// <-- Panels überschneide sich nicht -->
    			this->Location = System::Drawing::Point ( this->Location.X, this->Location.Y - this->Size.Height );
    			SetCursorPos (this->Location.X + (this->Size.Width / 2), this->Location.Y + (this->Size.Height / 2));
    
    			return;
    			}			
    	} // Ende FUNKTIO
    

    Das klappte alles nach ewigem versuchen auch wunderbar, bis ich mich eben dazu entschied, diese Panels in einen Container zu packen.

    Hier reagieren die Panels jedoch nicht auf das KeyDown Event. Eine Idee hierzu?



  • Ja, ich habe eine Idee dazu.
    Du musst das KeyDown-Event neu zuweisen.
    Da das Event nicht mit übernommen wurde.
    Einfach im Eigenschaften-Fenster unter Ereignisse das Event wieder zuweisen.



  • Laut Designer ist der Basis Klasse das KeyDown Event weiterhin zugewiesen. Das Problem scheint der aktuelle Focus zu sein. In einem Element habe ich eine DGV, welche ebenfalls das KeyDown abfängt. Hier funktioniert es einwandfrei.

    private: System::Void dataGridView1_KeyDown(System::Object^  sender, System::Windows::Forms::KeyEventArgs^  e) 
    				 {
    				 panelklasse::OnKeyDown (e); // <-- um Panels zu verschieben
    				 }
    

    Welche Möglichkeit habe ich den Panel Controls ein Event zu entlocken?



  • Wie setze ich den Eingabefocus auf ein Element des Panels? Im Moment versuche ich folgendes über ein MouseHover :

    void Sidebar::Form1::movecontrol (Control^ formcontrol)
    	{	
    	panel1->Controls[panel1->Controls->GetChildIndex (formcontrol)]->Focus ();
    	}
    


  • Select?

    Warum nicht formcontrol->Select() anstelle von panel1->Controls[panel1->Controls->GetChildIndex (formcontrol)]->... ?


Anmelden zum Antworten