Nach DrawRectangles und scrollen mit ScrollBar verschmiert alles
-
Hallo zusammen,
Habe seit einigen Tagen ein kleines bis grösseres Problem mit dem verschmieren meiner gezeichneten Rechtecken. Die gezeichnete Fläche mit Rechtecken ist grösser als der sichtbare Bereich. Wenn ich nach unten scrolle, funktioniert alles. Wenn ich jetzt aber wieder nach oben scrolle, weisst der gezeichnete Bereich, der vorher verdeckt war entweder Pausen auf, oder es verschmiert...
Gezeichnet auf Panel mit AutoScroll = true;
Damit überhaupt Scrollbars angezeigt werden, habe ich Buttons auf dem Panel platziert.Volgender Code:
System::Void pnltableau8erS_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { System::Drawing::Pen^ penCurrent = gcnew Pen(Color::LightSlateGray); array<Rectangle>^ Rect = { Rectangle(0, 30, 110, 20), Rectangle(0, 50, 110, 20), Rectangle(0, 84, 110, 20), Rectangle(0, 104, 110, 20), Rectangle(0, 138, 110, 20), Rectangle(0, 158, 110, 20), Rectangle(0, 192, 110, 20), Rectangle(0, 212, 110, 20), Rectangle(0, 246, 110, 20), Rectangle(0, 266, 110, 20), Rectangle(0, 300, 110, 20), Rectangle(0, 320, 110, 20), Rectangle(0, 354, 110, 20), Rectangle(0, 374, 110, 20), Rectangle(0, 408, 110, 20), Rectangle(0, 428, 110, 20), Rectangle(0, 462, 110, 20), Rectangle(0, 482, 110, 20), Rectangle(0, 516, 110, 20), Rectangle(0, 536, 110, 20), Rectangle(0, 570, 110, 20), Rectangle(0, 590, 110, 20), Rectangle(0, 624, 110, 20), Rectangle(0, 644, 110, 20), Rectangle(0, 678, 110, 20), Rectangle(0, 698, 110, 20), Rectangle(0, 732, 110, 20), Rectangle(0, 752, 110, 20), Rectangle(0, 786, 110, 20), Rectangle(0, 806, 110, 20), Rectangle(0, 840, 110, 20), Rectangle(0, 860, 110, 20) }; e->Graphics->DrawRectangles(penCurrent, Rect); delete penCurrent; System::Drawing::Pen^ penCurrent1 = gcnew Pen(Color::LightSlateGray); array<Point> ^ Coordinates1 = { Point(110, 50), Point(220, 50), Point(220, 50), Point(220, 104), Point(220, 104), Point(110, 104), Point(220, 104), Point(220, 77), Point(220, 77), Point(330, 77), Point(330, 77), Point(330, 185), Point(330, 185), Point(220, 185), Point(220, 185), Point(220, 158), Point(220, 158), Point(110, 158), Point(110, 158), Point(220, 158), Point(220, 158), Point(220, 212), Point(220, 212), Point(110, 212), }; e->Graphics->DrawLines(penCurrent1, Coordinates1); delete penCurrent1; Coordinates1->Clear(Coordinates1,0,Coordinates1->Length); System::Drawing::Pen^ penCurrent3 = gcnew Pen(Color::LightSlateGray); array<Point> ^ Coordinates2 = { Point(110, 266), Point(220, 266), Point(220, 266), Point(220, 320), Point(220, 320), Point(110, 320), Point(220, 320), Point(220, 293), Point(220, 293), Point(330, 293), Point(330, 293), Point(330, 401), Point(330, 401), Point(220, 401), Point(220, 401), Point(220, 374), Point(220, 374), Point(110, 374), Point(220, 374), Point(220, 428), Point(220, 428), Point(110, 428) }; e->Graphics->DrawLines(penCurrent3, Coordinates2); delete penCurrent3; Coordinates2->Clear(Coordinates2,0,Coordinates2->Length); System::Drawing::Pen^ penCurrent4 = gcnew Pen(Color::LightSlateGray); array<Point> ^ Coordinates3 = { Point(330, 347), Point(440, 347), Point(440, 347), Point(440, 131), Point(440, 131), Point(330, 131), Point(440, 131), Point(440, 239), Point(440, 239), Point(550, 239) }; e->Graphics->DrawLines(penCurrent4, Coordinates3); delete penCurrent4; Coordinates3->Clear(Coordinates3,0,Coordinates3->Length); }
Vielen Dank schon im Voraus und Grüsse den Profis
-
Vielleicht mal ein Refresh auslösen?
this->Refresh();
Gruß, Doug_HH
-
Danke für Deine rasche Antwort.
Wenn ich die ScrollBar scrolle, flackert der gezeichnete Bereich und die Rechtecke verändern ihre Position leider nicht.
Gibt es noch andere Möglichkeiten, wie dies funktionieren kann?
Besten Dank und Gruss
-
HyHy
Erstens musst du die Punkte deiner Zeichnungen auch anhand des standes der Scrollbar berechnen, und nicht einfach nur fest vorgeben.
Desweiteren wegen dem Flackern, wann rufst du denn das ->Refresh() auf?
Bzw zeig doch mal deinen ganze aktuellen Code...
Mfg Marc-O
-
Eine Alternative besteht darin, in ein Bitmap zu zeichnen und dieses darzustellen. Benötigt aber Speicher.
Ansonsten musst Du den Scrolloffset berechnen und addieren, wie Marc-O das schon sagte.
-
Besten Dank für Eure Hilfe.
Habe aber noch eine Frage. Wie soll ich die Punkte mit dem Stand der Scrollbar denn berechnen?
Das ->Refresh() löse ich wie folgt aus:
[cpp]
private: System::Void pnltableau8erS_Scroll(System::Object^ sender, System::Windows::Forms::ScrollEventArgs^ e){this->pnltableau8erS->Refresh();
}Würde mich nochmals sehr auf Eure Antworten freuen.
Grüsse
-
Wie übergebe ich dann dem array die neuen Punkte, wenn gescrollt wurde?
Besten Dank und Gruss
-
Schau' Dir in der msdn-Doku mal AutoScrollPosition des Panels an:
ScrollableControl::AutoScrollPosition Property:
To detect when AutoScrollPosition changes, create an event handler for the Paint event, save the old position value in a private variable, and compare the new value to the old value on subsequent Paint events.Ich weiß nicht, ob es einfacher geht.
-
Besten Dank. Vielleicht findet man auf der Microsoft-Site auch mal was brauchbares