2008-11-25 22 views
5

Rozwijamy się w środowisku typu osadzonego i musimy stworzyć własną strukturę interfejsu użytkownika.Wzorce graficzne GUI?

zrobiłem tego wcześniej, ale jestem zainteresowany w tym trochę badań wokół wspólnych wzorców projektowych dotyczących ram.

Rodzaje rzeczy, które mam na myśli jako wzorów (trochę daleko idące):

  • Widget Focus/defocus
  • Widget Animacja
  • Udostępnianie danych między elementami
  • Mocowanie poleceń widgetów
  • Stan zapisywania (MVC?)

Jaką zalecaną lekturę mają wzory GUI?

Odpowiedz

5

Mam dwie Dla Ciebie, telefonicznego lub zawiadomienie, może to jest to, co nazywamy „dołączenie polecenia do widżetów”, jakoś chcesz reagować na zmiany w stanie w danym elemencie UI. Kontroler musi zostać poinformowany, że nastąpiła zmiana.

Kakao/UIKit ma wzór, który jest nazywany "Delegacją" i powiadomienia o tym celu, inne używają funkcji lub obiektów wywołania zwrotnego (Java Swing) lub "sygnałów i gniazd" (QT).

Bardzo przydatny wzór, który nie pojawia się na wolności bardzo często jest w stanie zapobiec zmianę stanu, najłatwiejszym przypadkiem jest to sprawdzanie danych wejściowych, chcesz zapobiec utracie ostrości z widgetu, gdy tekst w widgecie nie jest zgodny z tym, czego można się spodziewać. Formaty Windowsa miały to na niektórych elementach, nie wszystkie, może to zrobić Cocoa. Można to osiągnąć za pomocą zwracanych wartości lub parametrów odniesienia (lub wskaźników) w wywołaniach zwrotnych, w których wywoływany może komunikować się z widżetem początkowym

Te dni, w których stosuje się style do elementów interfejsu użytkownika, tj. Zmianę wyglądu bez zmiany funkcji, ma również stają się bardzo popularne QT może to zrobić i jestem pewien, że wiele innych bibliotek wzór Gang of Four Decorator jest czasem używany do zwiększenia możliwości widżetu, dzięki czemu można coś przewijalnego zrobić za pomocą dekoratora. Wszystko zależy od tego, jak daleko zajdzie potrzeba z elementami interfejsu użytkownika. Powodzenia, nie jest to łatwe zadanie

EDT: Zastosuj MVC, gdzie tylko możesz. Pierwszymi kandydatami są wszelkiego rodzaju listy wyświetlające, nie powodując, że są odpowiedzialni za utrzymywanie wyświetlanych elementów. To definitywnie odnosi się do pola kombi, pola listy, tabel i drzew, można to zaimplementować do wprowadzania tekstu, ale może nie być warte narzutu.

3

Niektóre rzeczy się nauczyłem, pomagając rozwijać SingStar PS3

  • Pomaga utrzymać swoją logikę komponentów (jak działa przycisk) i swoją logikę wizualną (jak renderowanie obrazu) oddzielny. Jest to szczególnie miłe, gdy wymyślisz zupełnie nowy sposób renderowania i działa on z przezroczystymi przyciskami starego przycisku.
  • Skonfiguruj elastyczny sposób wiązania źródła danych w aplikacji na stronie pełnej komponentów, aby te same komponenty mogły wyświetlać wszystkie utwory na jednej stronie lub wszystkie zdjęcia na drugiej.To tutaj MVC pojawił się w SingStar
  • Modele wysyłania zdarzeń/odbioru zdarzeń (tj. Subskrybowanie kliknięcia przycisku) to całkiem niezły sposób na powiązanie układu strony z kodem. Może stać się spagetti, jeśli nie jesteś ostrożny.
  • Nie wymyślaj innego języka programowania, aby opisać swoją logikę, twój obecny język programowania jest prawdopodobnie w porządku.
  • Podczas przechodzenia z jednej strony na drugą rozważ kroki. Sporo z tego sprowadza się do zużycia pamięci, ale może zaistnieć chwila, w której załadowane zostaną dwie strony lub nie załadowano żadnych stron. Pomyśl o komunikacji między stronami tutaj.
  • Dane-dysk układ strony. Zezwalaj na wymienianie się układem na gorąco (naciśnij klawisz, aby ponownie załadować go z komputera), ponieważ będziesz go intensywnie iterować.
1

Badanie XAML, zwłaszcza wiązań.

Firma Microsoft wykonała naprawdę dobrą robotę na czystym języku XML, aby opisać interfejs GUI. Jeśli użyjesz uproszczonej wersji XAML do opisu interfejsu użytkownika, będziesz mógł użyć swoich narzędzi dla projektantów do makiety interfejsu użytkownika.

4

Zaledwie kilka wskazówek na temat klasycznych wzorów; Myślę, że są one powiązane z budynkiem GUI:

  • MVC pattern Zauważalnie.
  • Observer pattern; na przykład View musi obserwować model (aby wiedzieć, kiedy jego stan się zmienia), a kontroler musi obserwować widok (aby wiedzieć, kiedy kliknięto przycisk).
  • Strategy pattern; w pewnym sensie, używanie kontrolera jako kleju pomiędzy View i Model wybiera strategię. Teoretycznie powinieneś być w stanie przełączyć kontroler w przejrzysty sposób.
  • Composite pattern; Twój widok jest jak drzewo paneli, widżetów i tak dalej. Posiadanie wspólnego interfejsu i sposobu na iterację tej kolekcji jest użyteczne, gdy trzeba wywołać coś takiego jak "view.paint()".

wiem, że poprosił o wzory szkieletowe, ale nadal należy polegać na tych wzorach, ponieważ deweloperzy będą prawdopodobnie korzystać z ramy z tych pojęć w umyśle.

Czy masz wymagania/szczególne potrzeby dotyczące swojej architektury? Prawdopodobnie będziesz chciał stracić kilka "dobrych zasad", jeśli twoja platforma docelowa jest ograniczona w pamięci/CPU.

3

Wzór Chain of Command.

przykład w kontekście GUI:

interface IWidget 
{ 
    bool HandleEvent(Event event); // returns true if event was handled 
            // or false if event was ignored 
} 

class Button : IWidget 
{ 
    public override bool HandleEvent(Event event) 
    { 
     switch(event.Type) 
     { 
      case EventType.MousePressed: DoStuff(); return true; 
      case EventType.MouseScrolled: return false; 
     } 
    } 
} 

Tutaj Przyciski nie dbają o wydarzeniach przewijania, więc niech ich rodzice (łańcuch dowodzenia) je obsłużyć. Tak więc, jeśli masz przycisk w strony HTML, a użytkownik przewija nad przyciskiem, jest to obsługiwane przez widżet nadrzędny (widok HTML), a cała strona przewija.

Aby zapoznać się z przykładem wykorzystania w świecie rzeczywistym w ramach Qt, zobacz bool QWidget::event(QEvent*) i the documentation on event filters.

Zobacz również: Design Patterns in KDE. KDE to wieloplatformowy zbiór bibliotek i oprogramowania C++ zorientowanych obiektowo, bardzo popularny jako środowisko graficzne Linux.Są to slajdy z konferencji KDE z 2003 roku.