Avatar billede burningice Nybegynder
07. februar 2005 - 12:15 Der er 3 kommentarer og
1 løsning

Scrollbars maxvalue er for høj

Jeg har lidt af et problem. Jeg har lavet mig en Control som tegner et blueprint af en bygning og et tilhørende SpotMatrix. Det er muligt at zoome ind på blueprintet, og hvis dens nye størrelse overstiger størrelsen på controlstørrelsen kommer der scrollbars på.

Nu sker der dog det underlige, at jo længere man zoomer ind, jo større bliver afvigelsen i scrollbarenes maxvalue's. Dvs. at man kan scrolle for langt til højre og nedaf.

Jeg sætter ZoomLevel sådan her:

public int ZoomLevel
        {
            set
            {
                this.zoomPercentage = value;
               
                this.blueprintZoomHeight = (int)(this.blueprint.Height * value/100);
                this.blueprintZoomWidth = (int)(this.blueprint.Width * value/100);
               
                this.displayScrollBars();
                this.setScrollBarValues();
                this.Invalidate();
            }
        }

og beregner de forskellige værdier for scrollbarene sådan her:

private void setScrollBarValues()
        {
            //
            //TODO: There is a bug wich gives the scrollbars increasingly higher maxvalues than they should
            //

            this.vScrollBar.Minimum = this.hScrollBar.Minimum = 0;

            // If the offset does not make the Maximum less than zero, set its value.
            if( (this.blueprintZoomWidth - this.rectToDrawIn.Width) > 0)
            {
                this.hScrollBar.Maximum = this.blueprintZoomWidth - (int)this.rectToDrawIn.Width;
            }
            this.hScrollBar.LargeChange = this.hScrollBar.Maximum / 10;
            this.hScrollBar.SmallChange = this.hScrollBar.Maximum / 20;
            this.hScrollBar.Maximum += this.hScrollBar.LargeChange;
   
            // If the offset does not make the Maximum less than zero, set its value.   
            if( (this.blueprintZoomHeight - this.rectToDrawIn.Height) > 0)
            {
                this.vScrollBar.Maximum = this.blueprintZoomHeight - (int)this.rectToDrawIn.Height;
            }

            this.vScrollBar.LargeChange = this.vScrollBar.Maximum / 10;
            this.vScrollBar.SmallChange = this.vScrollBar.Maximum / 20;
            this.vScrollBar.Maximum += this.vScrollBar.LargeChange;
        }


Er der nogen der umiddelbart kan se en fejl? Jeg er ved at stirre mig blind på det :S
Avatar billede jtbroad Nybegynder
07. februar 2005 - 12:34 #1
hvorfor ligger du large change værdien til scrollbarenes max værdier hver gang du zoomer?
Avatar billede burningice Nybegynder
07. februar 2005 - 12:44 #2
du tænker på den her?

this.hScrollBar.Maximum += this.hScrollBar.LargeChange;

Det er fordi at man skal tage højde for selve sliderens størrelse, så hvis den ikke blev lagt til vil man ikke have mulighed for at scrolle det sidste stykke som slideren er høj/bred.
Avatar billede burningice Nybegynder
07. februar 2005 - 12:56 #3
Hvis du forestiller dig en vertical slider, så vil dens toppunkt bestemme scrollbarens value. Hvis man ikke lægger sliderens højde til Maximimum vil man ikke kunne scrolle helt ned til bunden af billedet, da toppunktet af slideren jo ikke vil kunne komme helt i bund.

Det er dog ikke det der gør det, for en udkommentering hjælper ikke det helt store :(
Avatar billede burningice Nybegynder
26. marts 2005 - 16:06 #4
nok på tide jeg får lukket der her spm. Problemet viste sig at være forholdsvis banalt, da jeg regnede max og min-værdier ud fra nogle forkerte rektangler. Istedet for at ruge rectToDrawIn skulle jeg selvfølgelig tage værdierne fra rectToDrawFrom.

private void setScrollBarValues()
        {
            Rectangle rectToDrawFrom = this.modelPainter.RectangleToDrawFrom;

            // If the image is wider than the Control, show the HScrollBar.
            if (this.modelPainter.HorizontalScrollNeeded)
            {
                this.hScrollBar.Maximum = this.modelPainter.BlueprintSize.Width - rectToDrawFrom.Width;

                this.hScrollBar.LargeChange = this.hScrollBar.Maximum / 10;
                this.hScrollBar.SmallChange = this.hScrollBar.Maximum / 20;
                this.hScrollBar.Maximum += this.hScrollBar.LargeChange;

                this.hScrollBar.Enabled = true;
            }
            else
            {
                this.hScrollBar.Enabled = false;
            }

            // If the image is taller than the Control, show the VScrollBar.
            if (this.modelPainter.VerticalScrollNeeded)
            {
                this.vScrollBar.Maximum = this.modelPainter.BlueprintSize.Height - rectToDrawFrom.Height;

                this.vScrollBar.LargeChange = this.vScrollBar.Maximum / 10;
                this.vScrollBar.SmallChange = this.vScrollBar.Maximum / 20;
                this.vScrollBar.Maximum += this.vScrollBar.LargeChange;

                this.vScrollBar.Enabled = true;
            }
            else
            {
                this.vScrollBar.Enabled = false;
            }
        }
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB