Form scrollen



  • Hi...

    Meine Form ist größer als die Working Area und reagiert auf das Mausrad. Irgendwie bekomme ich es nicht hin die Form programmgesteuert nach unten und oben zu scrollen. Wenn AutoScroll auf true steht sollte es doch über AutoScrollPosition möglich sein - oder welche Eigenschaft ist dafür zuständig?



  • System::Drawing::Point _point = System::Drawing::Point(23,34);
    this->AutoScrollPosition::set(_point);
    

    Oder habe ich Dich falsch verstanden?



  • Ja das hatte ich bereits versucht - nur klappt das nicht ganz. Wie bekomme ich denn heraus - welcher Bereich der Form aktuell angezeigt wird ?. Frage ich AutoscrollPosition::get ab, erhalte ich auf Y immer 0, auch wenn ich die Form bereits gescrollt habe. Müsste sich der AutoscrollPosition.Y Wert micht verändern ?

    Womit lässt sich der aktuell sichtbare bereich abfragen ?



  • Also wenn ich die Form zusammen schiebe und meine Controls aus der Form laufen und ich dann die ScrollBalken benutze um meine Controls wieder zu holen, geht der Wert auch in den Minus-Bereich.
    Kann Dein Problem jetzt nicht ganz nachvollziehen.

    Hier nochmal ein bisschen Code...Testcode...

    In Form1 Schroll...

    private: System::Void Form1_Scroll(System::Object^  sender, System::Windows::Forms::ScrollEventArgs^  e) 
    			 {
    				 this->Text = this->AutoScrollPosition::get().ToString();
    			 }
    


  • Was soll ich sagen: Ein peinlicher Fehler. Ich habe die AutoscrollPosition in den positiven Bereich verschoben - es hätte natürlich ein negativer Wert sein sollen. Ich denke - so werde ich nun weiterkommen. THX



  • Habe das ganze nun so gelöst - sieht weicher aus:

    void Sidebar::Form1::scrollform ( System::Windows::Forms::MouseEventArgs^ e)
    	{
    	using namespace System::Drawing;	
    
    	//this->SuspendLayout ();
    
    	if (e->Delta < 0)
    		{
    		//Maus Wheel nach unten
    
    		this->Text = plugins[0]->Location.ToString ();
    
    		if (plugins[plugins->Count - 1]->Location.Y < this->DisplayRectangle.Bottom ) return;
    
    		for each (UserControl^ ctl in plugins)
    			{			
    			ctl->Location = System::Drawing::Point (ctl->Location.X, ctl->Location.Y - ( 140 + ABSTAND));
    			}
    		//this->ResumeLayout (true);		
    		return;
    		}
    
    	else if (e->Delta > 0)
    		{
    		//Maus Wheel nach oben	
    
    		this->Text = plugins[0]->Location.ToString ();
    
    		if (plugins[0]->Location.Y + plugins[0]->Size.Height > this->DisplayRectangle.Top ) return;
    
    		for each (UserControl^ ctl in plugins)
    			{			
    			ctl->Location = System::Drawing::Point (ctl->Location.X, ctl->Location.Y + ( 140 + ABSTAND));
    			}
    		//this->ResumeLayout (true);
    		return;
    		}
    

    Allerdings ergibt sich hierbei ein Problem. Das ganze funktioniert nicht bei einem FormBorderStyle None. Liegt es daran, dass DisplayRectangle in diesem Fall nicht den Virtuellen Arbeitsbereich der Form liefert? Eine Idee wie ich das umgehen könnte ?



  • OK ... die Abfrage passte hier ohne die Border Höhe abzuziehen nicht mehr. So klappt es nun:

    if (plugins[plugins->Count - 1]->Location.Y < this->DisplayRectangle.Bottom - 24 ) return;
    


  • (wie bin ich denn hier rein gekommen ... Sorry)


Anmelden zum Antworten