2009-06-04 10 views
2

Ich arbeite an einem Programm, das ein Panel innerhalb eines Formulars bewegt. Ich verwende eine Bildlaufleiste, um die Panels zu ändern. Top-Eigenschaft. Diese Eigenschaft wird jedoch nur -32768 erreichen. In diesem Fall muss ich es viel höher (oder niedriger o0) gehen. Gibt es sowieso ich kann es zu einem 32bit int ändern, so dass es bis zu -2147483648 gehen kann?C# Change Control.Top Von 16bit zu 32bit Int (WinForms)


bearbeiten, vielleicht, wenn ich erklären, was ich zu tun versuchen, denken Sie viel gewohnt wird es für useability schlecht sein.

Gestern fragte ich diese Frage: How to use VScrollBar and HScrollBar together with a RichTextBox?

Aber weil ich eine Antwort finden könnte nicht und no1 antwortete mir anders, ich hatte eine andere Art und Weise zu denken, eine richtextbox zu blättern. Meine Lösung bestand also darin, die Textboxhöhe auf die gleiche Größe zu bringen (Textfeldschrifthöhe * gesamte Zeilen). Das würde bedeuten, dass keine Bildlaufleisten in der Textbox angezeigt würden. Jetzt verwende ich die Bildlaufleiste, um die obere Position der Textfelder zu verschieben, um einen Pseudo-Scroll-Effekt zu erstellen. Es funktioniert perfekt, wenn die Textbox etwa 2000 Zeilen bei 13 Pixel als Schrifthöhe hat. Aber danach ist es höher als ein 16bit Int. Deshalb muss ich es zu einem 32bit int ändern.

+0

Ich schlage vor, Sie überlegen sorgfältig, ob diese UI verwendbar sein wird. Es klingt wie es sehr schwierig für Benutzer sein wird, mit dieser Bildlaufleiste zu navigieren ... – Ant

+2

Sie könnten dies eine aufschlussreiche lesen, in Bezug auf Grenzen und was es bedeutet, wenn Sie auf sie stoßen: http: //blogs.msdn. com/oldnewthing/archive/2007/03/01/1775759.aspx –

Antwort

3

Die Windows-Bildlaufleisten selbst sind an 16-Bit-Werte gebunden. Die WinForm-Bildlaufleisten spiegeln nur dieses Limit wider. Sie können es nicht ändern, ohne selbst ein eigenes Scrollbar-Steuerelement zu schreiben.

Aber Sie müssen das nicht tun. Es gibt keinen physikalischen Grund, so viele Werte in einer Bildlaufleiste zu haben, weil Sie nicht feiner scrollen können, als es dort auf dem Bildschirm Pixel gibt, und Ihr Monitor ist nicht mehr als 30000 Pixel hoch (oder breit).

Das normale Muster besteht darin, den Domänenwert durch eine geeignete Zahl zu teilen. Normalerweise wird eine Konstante ausreichen, aber Sie können auch Ihr Maximum verwenden. Dann verwenden Sie diesen Wert als die tatsächlichen Scrollbar-Indizes.

Nehmen wir an, Sie haben Werte von 0 bis 1200355. Sie können den maximalen Wert der Bildlaufleiste auf 10000 setzen, und dann können Sie den aktuell ausgewählten Wert als myScrollbar.Value * (10000/1200355) (oder einige so - ich habe nicht die genaue Syntax zur Hand.

Ja, das bedeutet, dass Sie etwas an Präzision verlieren - Sie können keinen Wert auf der Bildlaufleiste auswählen, der sich nur um 3 Einheiten unterscheidet. Wenn Sie diese Präzision wirklich benötigen, ist das Rollbalken-Steuerelement nicht das richtige Werkzeug.

+1

Ich denke, nach Ihrer Antwort zu urteilen, haben Sie nicht ganz verstanden, was ich dachte. Meine Bildlaufleiste ist nur eine normale Bildlaufleiste mit maximal 1000.es ist das Panel, das eine Spitze von mehr als 30000 haben muss – Ozzy

1

Wenn Sie ein Panel haben, das den Grenzwert einer Bildlaufleiste überschreiten muss, können Sie den Bildlaufleistenwert mit einem bestimmten Multiplikator multiplizieren.

panel1.top = scrollbar1.value * 3; 

Der Multiplikator kann ein beliebiger Wert sein, der für Ihre Anforderungen geeignet ist. Davon abgesehen ist ein Bildschirm mit über 30000 Pixeln ziemlich groß.

Zusätzlich können Sie Ihren Bildlaufleistenwert proportional zu Ihrem maximalen Wertebereich machen.

areaHeight = 60000; 
scrolldelta = areaHeight/scrollbar1.MaxValue; 

panel1.Top = scrolldelta * scrollbar1.value;