Autor Wątek: GUI skalowalność kontrolek  (Przeczytany 1868 razy)

Offline tomaszwir

  • Użytkownik

# Kwiecień 21, 2012, 23:24:45
Witam!

Dobijają mnie ostatnio pewne szczegółowe kwestie przy pisaniu GUI, no ale do rzeczy, kontrolki powinny byc skalowalne no ale w jakim stopniu, np zmieniam rozmiar okna
to zmienia się rozmiar przycisku który jest w tym oknie no ale tylko rozmiar przycisku ? Co z rozmiarem czcionki która wyświetla napis na przycisku, też wypada skalować ?
Kolejna sprawa to kontrolka UpDown posiada ona dwa przyciski oraz pole do wyświetlania aktualnej wartości no co w przypadku zmiany rozmiaru okna, zmienia się rozmiar całej kontrolki
ale jak powinny się zmieniac te dwa przyciski, chodzi mi o szerokośc, np czy powinny mieć stałą szerokośc czy powinny zajmować powiedzmy 20% całej szerokości ?
Oczywiście mozna twożyć flagi które będa odpowiadały czy skalować tą szerokośc, rozmiar czcionki tylko że takich flag można ustozyć nieskończoność i jeszcze trochę więcej.
Najsensowniejsze i podstawowe wydają się takie:
FLAG_STATIC_POSITION_X - pomimo zmiany rozmiaru okna pozycja w osi x zostaje stała ( nie zależy od rozmiaru okna tylko jest takie jak podaje się przy tworzeniu )
FLAG_STATIC_POSITION_Y - pomimo zmiany rozmiaru okna pozycja w osi Y zostaje stała ...
FLAG_STATIC_WIDTH - pomimo zmiany rozmiaru okna szerokość zostaje stała ...
FLAG_STATIC_HEIGHT - pomimo zmiany rozmiaru okna wysokość zostaje stała ...

Nie wiem są jakieś zasad co w kontrolce powinno być stałe a co może się dowolnie zmieniać ?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline gemGreg

  • Użytkownik
    • gemGreg's homepage

# Kwiecień 22, 2012, 14:06:07
Ja np. lubię jak w grach jest możliwość wybrania rozmiaru gui w opcjach z kilku dostępnych. Wtedy programista sobie każdy rozmiar pre-dostosowuje żeby ładnie wyglądał nie martwiąc się o automatykę.

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Kwiecień 22, 2012, 22:10:44
Tutaj są moim zdaniem dwa osobne tematy.

Pierwszy to temat rozmiaru najbardziej podstawowych elementów GUI, czyli wielkość czcionki, szerokość wszelkich krawędzi i ramek itp. Możesz go rozwiązać na takie sposoby:

1. Nie skalować w ogóle. Bitmapy z krawędziami i inne elementy graficzne oraz czcionkę masz przygotowaną w określonej rozdzielczości i zawsze chcesz je pokazywać na ekranie dokładnie piksel w piksel. Oczywiście wtedy jakość będzie najlepsza i tak jest zrobić najprościej, ale z tego powodu w większej rozdzielczości wszystko będzie malutkie.
2. Skalować razem z rozdzielczością ekranu. Ponieważ są różne proporcje rozdzielczości (4:3, 16:10, 16:9), najlepiej brać rozdzielczość pionową. Wtedy ustalasz że np. rozmiar czcionki albo grubość krawędzi kontrolek wynosi zawsze ileś % tej rozdzielczości i całe GUI skaluje się, wyglądając dzięki temu tam samo (w sensie rozmiaru) niezależnie od rozdzielczości.
3. Skalować jak w punkcie 2, ale dać użytkownikowi możliwość zmiany, coś w rodzaju wyboru DPI. To jest moim zdaniem najlepsze rozwiązanie, bo rozdzielczość ekranu nie zawsze jest obiektywnym wyznacznikiem jakiej wielkości w pikselach powinno być wszystko w GUI. Ktoś może zmienić monitor 17" na 24", wtedy ma większą rozdzielczość ale i powierzchnię ekranu, więc wolałby zamiast mieć wszystko powiększone to móc zmieścić na ekranie więcej okien. Z drugiej strony ktoś może mieć słaby wzrok albo kupić laptopa który ma małą przekątną ekranu ale rozdzielczość bardzo dużą i wtedy wolałby sobie całe GUI powiększyć, choć z rodzielczości wynikałoby że należy rysować wszystko bardzo małe.

Drugi temat to rozszerzanie lub przemieszczanie kontrolek na powierzchni okna, kiedy to okno można rozszerzać. Tutaj są dwie szkoły:

1. Tradycja windowsowa (czyli jak z WinAPI): Każda kontrolka ma na stałe podane parametry pozycja (X, Y) i rozmiar (Width, Height). Większości okien w ogóle rozszerzać się nie da, a te które się da same muszą sobie zaimplementować algorytm zarządzania kontrolkami na ich powierzchni.
2. Tradycja linuksowa (jak w Qt, GTK, wxWidgets, ale także .NET, Delphi): Kontrolki mają dodatkowe parametry mówiące o ich zachowaniu względem zmiany rozmiaru okna które je zawiera i/lub w oknie trzeba układać dodatkowe niewidzialne kontenery (sizery), które zawierają kolejne sizery albo właściwe kontrolki i zarządzają ich rozmieszczeniem. Zobacz jak to jest zrobione w tych bibliotekach np. parametry Dock i Anchor z .NET albo klasa wxBoxSizer z wxWidgets.

Offline Kos

  • Użytkownik
    • kos.gd

# Kwiecień 22, 2012, 23:00:19
BTW Jak obsługa różnych DPI wygląda w nowym-windowsowym WPF? Wiem tyle, że jakoś chyba wygląda, ale nie wiem jak... :)

Offline tomaszwir

  • Użytkownik

# Kwiecień 23, 2012, 02:23:32
Co do ustalania rozmiaru/pozycji, to zamiast impletować kontenery wymyśliłem coś takiego:
Jakaś kontrolka ma mieć stałą wysokość np ma mieć zawsze 50pixeli, ale szerokość ma się zmieniać w zależności od jej rozmiaru. Przy tworzeniu podaję szerokość 80pixeli no i teraz najważniejsze, jeżeli wysokość ma stałą wartość to trzymam ją w "normalnej" postaci: m_Height = 50.0f; ale szerokość się zmienia czyli w zmiennej m_Width trzymam podaną szerokość(80pixeli) sprowadzoną do przedziału 0-1.0f (szerokość okna / szerokość kontrolki) i przy rysowaniu konwertuję tą szerokość na "normalną" wartość i rysuję...