2010-02-16 11 views
5

Gibt es eine bevorzugte, schnelle Methode des Scrollens innerhalb eines Benutzersteuerelements in GDI +?Wie kann man legitim mit GDI + blättern?

Ich habe ein Steuerelement erstellt, das ein horizontal scrollbares Diagramm grafisch darstellt.

Gegenwärtig wird bei meiner Steuerung die Position einer horizontalen Bildlaufleiste in einen Offset in die Daten umgewandelt. Das Steuerelement gibt dann die Daten wieder, die zwischen diesem Startpunkt und einem Endpunkt vorhanden sind, der basierend auf der Breite des Steuerelements berechnet wird.

Diese Methode funktioniert, ist aber sehr langsam. Ich möchte nicht die gesamte Bedienoberfläche bei jedem Scroll-Event manuell neu zeichnen müssen. Statt dessen möchte ich das Steuerelement initialisieren, indem ich die Gesamtheit (oder einen Teil) der grafischen Daten auf eine Offscreen-Oberfläche male und dann virtuell durch die Steueroberfläche scrolle, indem es die vorgerenderten Grafikdaten ab dem Offset liest berechnet durch die Position der horizontalen Bildlaufleiste.

Ist BitBlt der einzige Weg, dies zu tun? Muss ich Grafikdaten wirklich manuell von einer Oberfläche auf eine andere kopieren? Kann ich nicht einfach das Paint-Ereignis übernehmen und veranlassen, dass es beim Rendern die Daten von der Offscreen-Oberfläche liest? Auf diese Weise sind die Kopier- und die Renderaktion identisch.

Oder sollte ich etwas Hokey wie Farbe direkt zu einem Panel-Steuerelement tun und dann nur buchstäblich das Panel selbst von links nach rechts scrollen?

KLARSTELLUNG: Im Grunde möchte ich die richtige Art und Weise wissen, vorgerenderten Daten zu blättern. Wie scrollt man grafische Daten innerhalb eines Controls? Neuzeichnen der vorgerenderten Grafik ist KEINE korrekte Option.

+0

Wie groß kann die Oberfläche des gesamten scrollbaren Grundstücks bekommen? Zeichnen Sie immer alle Punkte oder nur die, von denen Sie wissen, dass sie sichtbar sind? –

+0

Ich zeichne nur die Punkte, die im sichtbaren Bereich liegen. Die gesamte Fläche des Diagramms kann bis zum 200-fachen der Breite des Steuerelements betragen. Ich möchte einen Grafikpuffer etwa doppelt so groß wie die Steuerfläche erstellen und den Puffer bei Bedarf nur durch Lesen der erforderlichen Daten in einer festgelegten Chunkgröße auffüllen. – James

Antwort

3

Ja, ich würde versuchen, Doppel-Pufferung. Wenn Sie eine Bitmap außerhalb des Bildschirms rendern, können Sie einfach die Bitmap scrollen.

Sie können versuchen, den gesamten Graphen zu einer großen Bitmap zu rendern und die Bildlaufleisten bewegen zu lassen. Wenn Ihr Diagramm jedoch extrem groß ist, müssen Sie die Größe der Bitmap auf den sichtbaren Bereich beschränken, nur das, was für sie sichtbar ist, malen und virtuell so scrollen, wie Sie es jetzt sind.

Testen auf 32-Bit-Windows XP, fand ich die Beschränkung irgendwo um 237,9 Millionen Pixel. Das ist für die meisten Steuerelemente sicherlich ausreichend, aber für Ihre Anwendung möglicherweise nicht ausreichend.

Für die Neugierigen, hier sind die maximalen Windows-Bitmap-Größen wir in der Lage waren zu erstellen und zu verwenden:

 
Width Height Area (pixels) 
====== ====== =========== 
32,767 7,261 237,921,187 
25,000 9,517 237,925,000 
23,792 10,000 237,920,000 
20,000 11,896 237,920,000 
15,861 15,000 237,915,000 
15,000 15,861 237,915,000 
11,896 20,000 237,920,000 
10,000 23,792 237,920,000 
9,517 25,000 237,925,000 
7,261 32,767 237,921,187 
+1

Wie "scrollt" man nur die Bitmap herum? Indem Sie Bereiche der Offscreen-Bitmap manuell auf die Bildschirm-Bitmap kopieren? Indem man einen Referenz- und Scroll-Offset in eine bestimmte GDI + -Funktion eingibt? – James

+1

In C# gibt es mehrere Graphics.DrawImage-Überschreibungen, mit denen Sie einen Teil eines Bildes an einen bestimmten Ort zeichnen können. Sie könnten ein Bitmap erstellen und dann das Rechteck beginnend am Bildlaufort und die Größe des sichtbaren Bereichs des Steuerelements zeichnen. –

+0

@James, ja, das meinte Paul.Ihre Frage: "Kann ich nicht einfach das Paint-Ereignis übernehmen und veranlassen, dass es die Daten von der Offscreen-Oberfläche liest, während es gerendert wird?" zeigt dein Missverständnis. Das Paint-Ereignis selbst macht nichts - es rendert nicht; Es teilt Ihrem Code lediglich mit, dass die IT etwas zeichnen muss. Das Zeichnen eines Teils des vorgerenderten Bilds mit DrawImage() ist daher eine korrekte Methode zum Scrollen. – Qwertie

Verwandte Themen