Ne ocupăm de bara de parcurgere în

La prima vedere, elementele Scrollbars par a fi foarte simple, dar recent am descoperit că, pentru nevoile mele, implementarea lor în .NET necesită ajustări minore. Am decis să scriu o mică aplicație de testare în scopul studierii acestui element și în special modul în care setările diferite ale proprietăților sale afectează partea externă și funcțională a aplicației.
  • Descărcați un proiect demo - 8,23 kb

Ne ocupăm de bara de parcurgere în

intrare

Unii termeni utilizați în articol:

"Derulare pagină": - când conținutul părții vizibile a documentului (imagine etc.) este înlocuit cu următoarea porțiune a conținutului de aceeași dimensiune ca fragmentul curent. De exemplu, aveți o parte vizibilă a documentului limitată la 20 de linii de text, apoi dacă faceți clic pe butonul săgeată în jos, veți vedea următoarele 20 de linii de text.

"Scrollbar" - în versiunea rusă este "Scrollbar". Pentru cei care se află în rezervor: barele de derulare sunt, de regulă, două benzi de-a lungul marginilor ferestrei (una este orizontală dedesubt, cealaltă verticală este spre dreapta). "Bara de derulare" constă din următoarele elemente:
  • "Traseul" face parte din bara de derulare, care este o bandă (care ar fi crezut altfel :)), simbolizând dimensiunea liniară (lățimea sau înălțimea) documentului.
  • Două butoane cu săgeți (butoane săgeată) de la ambele capete ale benzii (pista). De regulă, acestea sunt două butoane, totuși, în tot cuvântul cunoscut există patru (cu excepția derulării paginilor, butoanele de dezvoltatori adăugate "mergi la începutul documentului" și "du-te la sfârșitul documentului").
  • "Slider" (degetul mare)

"Thumb" (degetul mare) - partea în mișcare a barei de defilare, sub forma unui dreptunghi. Folosit pentru a accesa o locație arbitrară în document. Precizia poziționării depinde de precizia ochiului și de duritatea mâinii utilizatorului :).

"sub-pagină" este ceea ce se află în afara părții vizibile a documentului.

Cum funcționează ScrollBar?

Există trei lucruri în bara de derulare pe care le personalizați în mod normal atunci când le folosiți:

  • „Rotor“ (degetul mare), astfel încât acesta afișează raportul dintre porțiunea vizibilă a documentului la dimensiunea totală a documentului, care este simbolizat prin înălțimea benzii (sau lățimea, în cazul unui scrollbar orizontal). (Aprox. Traducere. Cu alte cuvinte, documentul mai mare, cu atât mai puțin de sine „glisorul“. Înălțimea (lățimea) a barei de defilare reprezintă 100% din înălțimea (lățimea) a documentului, un „slider“ dimensiune reprezintă procentajul porțiunii vizibile a documentului cu privire la întregul document. )
  • Cum să configurați bara de derulare astfel încât să deruleze documentul corect când utilizatorul face clic pe piesa în sine.
  • Cum se configurează bara de derulare, astfel încât să puteți urmări cu acuratețe modificările „sub-pagini“, atunci când utilizatorul deplasează „cursorul“ (degetul mare) sau utilizează în aceste scopuri butoanele săgeată de pe fiecare capăt al scrollbar.

Toate acestea sunt destul de simple pentru a face în. NET, folosind următoarele proprietăți:

  • LargeChange specifică dimensiunea părții vizibile a documentului - mărimea "paginii".
  • Maximum specifică dimensiunea totală a documentului.

Instalarea acestor două proprietăți în raport cu bara de derulare este important pentru dimensiunea „slider“ proporționalitate reflectă partea vizibilă - „pagina“, și dimensiunea corespunzătoare (lățime sau înălțime) a documentului propriu-zis. Următoarea formulă arată relația dintre atitudinea față de LargeChange și „slider“ Lungimea maximă (degetul mare lungime) la lungimea de defilare (Aici am folosi lungimea pentru a influența una dintre dimensiuni, lățime sau înălțime):

Ca urmare, atunci când utilizatorul face clic pe bandă, valoarea valorii barei de derulare se va schimba la valoarea LargeChange (adică se va răsturna).

Derularea sub-paginilor

pentru că acum nu pot determina „dreaptă“ (în sensul unui număr de divizat în componente mai mici) pentru SmallChange (această proprietate este de tip int). În schimb, a trebuit să scriu ceva de genul:

Dar e ghinion. Acum "glisorul" meu nu mai este proporțional cu partea vizibilă a documentului ("pagină")! Acum, "cursorul" reflectă raportul dintre un rând și întregul document, în loc de o "pagină" la întregul document. Întrucât aceasta afectează și funcționalitatea aplicației într-o oarecare măsură, este imposibil să se măsoare cu un astfel de aspect "distorsionant" vizual.

Modul de ieșire din această situație este partiția LargeChange (care este utilizată pentru a seta dimensiunea corectă a "cursorului") și modificarea reală pentru valoare. când utilizatorul face un clic pe "pistă". Acest lucru se realizează prin suprasolicitarea metodei WndProc și interceptarea mesajelor despre derularea "paginii" în sus / în jos :

Aceasta controlează comportamentul implicit al barei de derulare și modifică valoarea Valorii. pe baza valorii mele preferate pentru derulare (pentru proprietatea ValLargeChange).

concluzie

Puteți vedea această diferență în "acțiunea" din aplicația demonstrativă. Rețineți că acest cod nu este perfect, dar scopul său principal este de a studia problema cu care se confruntă "perfect".