Tworzenie grafiki GDI
GDI Graphical Device Interface standard API Windows przeznaczony do reprezentowania obiektów graficznych i przesyłania ich do urządzeń wyjściowych jak monitory lub drukarki. Istnieje praktycznie od początku Windows.
GDI Program dla Windows nie komunikuje się bezpośrednio z urządzeniami wyjściowymi, np. kartą graficzną. Program korzysta z API, które umożliwia tworzenie wyjścia i przesłanie go do dowolnego urządzenia lub strumienia (pamięć, plik). Windows, poprzez sterowniki, generuje obraz na urządzeniu zewnętrznym.
GDI+ W Windows XP i Windows 2003 Server zaimplementowano nową wersję GDI. Jest instalowana jako dodatek do starszych wersji Windows (>95). Więcej funkcji i rodzajów obiektów graficznych. API jest zorientowane obiektowo.
GDI+ Trzy podstawowe elementy GDI+ to: Grafika wektorowa 2D, Grafika rastrowa przetwarzanie obrazów, Typografia.
GDI+ i.net Wszystkie klasy związane z API GDI+ są obudowane klasami znajdującymi się w przestrzeni nazw: System.Drawing W szczególności: System.Drawing.Drawing2D, System.Drawing.Imaging, System.Drawing.Text.
GDI+ i.net Rysowanie zawsze odbywa się za pomocą obiektu klasy Graphics. Każdy widoczny komponent ma skojarzony ze sobą taki obiekt. Na potrzeby rysowanie obiekt można uzyskać korzystając z metody CreateGraphics. Można go też otrzymać poprzez obsługę zdarzenia Paint.
Obiekt Graphics Należy zwracać uwagę, dla jakiego obiektu uzyskaliśmy obiekt Graphics!
Struktura Color. Kolory Stałe dla 128 kolorów, np. Color.Green. Możliwość zdefiniowania dowolnego koloru ze składowych (A), R, G, B: Metody GetHue, GetSaturation, GetBrightness konwertujące kolor do przestrzeni HSB. Typ wyliczeniowy KnownColor zawierający też kolory systemowe, np. KnownColor.ActiveBorder
Kolory predefiniowane
Kolory systemowe
Linie i wypełnienia Do rysowania linii służy obiekt klasy Pen. Najważniejsze właściwości klasy Pen: grubość, kolor. Do rysowania wypełnień, np. figur, służy obiekt klasy Brush. Klasa Brush jest abstrakcyjna!!! Klasa Pen może korzystać z klasy Brush.
Pióra Pióro może mieć ustawione różne zakończenia linii poprzez właściwości StartCap i EndCap o wartościach z typu wyliczeniowego LineCap.
Pióra Pióro może też mieć zdefiniowany styl linii we właściwości DashStyle z typu DashStyle.
Pióra własne Pióro może mieć zdefiniowany w postaci tablicy kształt.
Linie i wypełnienia Można korzystać z listy predefiniowanych piór o grubości 1, np. Pens.Blue. Podobnie jest dla klasy Brush, np. Brushes.Chocolate. Specjalizacje klasy Brush: SolidBrush równy kolor, HatchBrush wzorek, LinearGradientBrush pędzel gradientowy, PathGradientBrush pędzel gradientowy dla ścieżek, TextureBrush pędzel teksturowy
Pędzle typu Hatch
Pędzel typu Hatch
Pędzle teksturowe
Jednostki Domyślną jednostką w trakcie rysowania są piksele. Można zmienić jednostkę na: Display 1/75 cala, Document 1/300 cala, Inch cal, Milimeter, Pixel, Point 1/72 cala, World podobne do piksela, lepiej nie używać.
DrawArc DrawBezier DrawBeziers DrawClosedCurve* DrawCurve DrawEllipse* DrawIcon DrawImage Rysowanie Klasa Graphics ma dwa rodzaje metod służących do rysowania: metody typu Draw i Fill. DrawLine DrawPath* DrawPie* DrawPolygon* DrawRectangle* DrawRectangles* DrawString FillRegion *mają odpowiedniki typu Fill
Kolory
Jednostki cd.
Punkty, rozmiary, prostokąty Punkt na płaszczyźnie jest reprezentowany przez klasy: Point (składowe X i Y), PointF (liczby zmiennoprzecinkowe). Rozmiary podobnie: Size (składowe Width i Height), SizeF. I prostokąty Rectangle, RectangleF.
Prostokąty Prostokąty są często używane do wyznaczania różnych figur, np. elips i okręgów. Zawierają metody przydatne przy sprawdzaniu zawierania w obszarze lub nakładania obszarów: Contains(), Intersect(), IntersectWith() I przekształcaniu: Inflate(), Offset().
Rysowanie Należy pamiętać, że większość metod służących do rysowania jest przeciążonych, tak aby np. mogły korzystać z różnych sposobów podawanie rozmiarów.
Czcionki i tekst Podstawową klasą jest klasa Font reprezentująca czcionkę. Klasa FontFamily odpowiada rodzinie czcionek określonej przez nazwę. Do rysowania tekstu służy metoda DrawString klasy Graphics (wiele wersji).
Wyrównanie tekstu Metoda DrawString może rozmieszczać tekst w zadanym obszarze. Można stosować wyrównywanie tekstu.
Rozmiar tekstu Gdy nie wiemy ile miejsca zajmie tekst możemy to obliczyć za pomocą metody MeasureString klasy Graphics.
Przekształcenia Dostępne są trzy rodzaje przekształceń: Skalowanie ScaleTransform Przesunięcie TranslateTransform Obrót RotateTransform Każdy obiekt narysowany po zdefiniowaniu przekształcenia będzie przekształcony. Przekształcenia się kumulują.
Tekst pod kątem
Tekst przekształcony
Ścieżki Ścieżki (GraphicsPath) łączą wiele kształtów prostych w jeden obiekt. Klasa GraphicsPath ma metody odpowiadające metodom Draw klasy Graphics i zaczynające się od Add:
Stosowanie maski Aby ograniczyć obszar, na którym rysujemy można stosować maskę (Clipping). Służy do tego metoda SetClip klasy Graphics. Za maskę może służyć: Cały obszar (obiekt klasy Graphics) Prostokąt (Rectangle) Ścieżka (GraphicsPath) Region (Region)
Maska
Rysowanie obrazów Do rysowania obrazów służy metoda DrawImage, która ma kilka wersji. Rysuje obraz w podanym punkcie Rysuje obraz w prostokącie Rysuje obraz w równoległoboku
Własności obrazów Plik graficzny może w sobie zawierać wiele dodatkowych informacji np. dane EXIF. Dostęp do nich można uzyskać poprzez kolekcję PropertyItems klasy Image. Niestety rodzaj informacji określany jest przez liczbę i konieczne jest skorzystanie ze słownika. Mogą one też być binarne, tekstowe, itp.
Własności obrazów
Formaty plików Obrazy można zapisywać w różnych formatach. Format wybiera się z typu wyliczeniowego ImageFormat.
Kompresja Dla wybranego formatu można ustawiać parametry kompresora.
Drukowanie Drukowanie nie różni się wiele od rysowania na ekranie. Nadal korzystamy z klasy Graphics, tylko jest ona skojarzona z drukarką. Drukowanie odbywa się przy wykorzystaniu klasy PrintDocument. Klasa ta ma trzy ważne zdarzenia: BeginPrint EndPrint PrintPage
Drukowanie W zdarzeniu PrintPage umieszcza się drukowanie pojedynczej strony. Jeżeli stron jest więcej to należy odpowiednio obsłużyć komunikat i nastąpi ponowne uruchomienie tego zdarzenia.
Drukowanie
Właściwości drukowania Ustawienia dotyczące drukarki i drukowania dostępne są jako obiekty klas PrinterSettings i PageSettings. Do ustawiania opcji można wykorzystać komponent PageSetupDialog.
Tworzenie własnych kontrolek
Własne kontrolki Na platformie.net można tworzyć własne kontrolki Muszą one dziedziczyć pośrednio po klasie Control Mogą być elementem projektu (Assembly)lub znajdować się w osobnej bibliotece DLL
Rodzaje nowych kontrolek Kontrolki będące rozszerzeniem już istniejących, Kontrolki złożone z innych kontrolek, Kontrolki tworzone od podstaw.
Tworzenie biblioteki kontrolek
Pusta kontrolka
Pusta kontrolka Domyślnie kontrolka dziedziczy po klasie UserControl
Rozszerzenie funkcjonalności Na przykładzie TextBox a ValidatedTextBox: sprawdza poprawność np. n-ru PESEL, zmienia kolor, gdy jest aktywny uniemożliwia wpisywanie głupot
Dziedziczenie Dziedziczymy po istniejącej kontrolce - TextBox Zmianie ulega widok w projektancie
FocusColor Dodajemy pole i właściwość FocusColor Dodajemy obsługę zdarzeń Enter i Leave
Odrzucanie znaków W przypadku wpisywania n-ru PESEL chcemy mieć tylko cyfry
Walidacja danych Sprawdzanie poprawności numeru PESEL
Komunikat Aby wyświetlić informację o błędzie możemy dodać do kontrolki element ErrorProvider i obsługę zdarzenia Validate
Kontrolka złożona Dzień liturgiczny: kontrolka kalendarz etykietka
Kod w VB
Kontrolka złożona FilterBox podobny jak w MacOS X Ponownie dziedziczymy po UserControl Dodajemy zwykły TextBox
Styl zachowania W konstruktorze ustawiamy style zachowania kontrolki A potem dodajemy metody wiążące wygląd kontrolki z TextBox em
Rysowanie kontrolki Kontrolkę rysujemy przeciążając metodę OnPaint
Rysowanie kontrolki
Rysowanie kontrolki
Efekt rysowania Rysowanie przezroczystych kontrolek lub kontrolek o nietypowym kształcie nie jest proste! Ustawianie koloru na Transparent nic nie da! Windows zakłada, że kontrolka ma kształt prostokątny i w całym tym obszarze jest ona odpowiedzialna za narysowanie się.
Region Musimy poinformować Windows, że kontrolka ma nietypowy kształt
Zdarzenia Taka kontrolka powinna informować o zmianie swojej zawartości Definiujemy argumenty zdarzenia zawierające tekst
Generowanie zdarzenia Wciskanie klawiszy powoduje wygenerowanie zdarzenia z opóźnieniem (Timer)
Kontrolka własna ProgressIndicator - podobnie jak w MacOS X Znowu dziedziczymy po UserControl
Pola i właściwości
Konstruktor
Rysowanie
Właściwości kontrolki Nowe właściwości kontrolki domyślnie trafiają do kategorii Misc Możemy tym sterować za pomocą atrybutów
Atrybuty kontrolki Sama kontrolka też może mieć atrybuty
Designer Zachowanie kontrolki w trakcie projektowania można kontrolować Konieczne jest utworzenie klasy dziedziczącej po klasie ControlDesigner Klasa ta jest potem kojarzona z kontrolką
ControlDesigner Trzeba dodać referencję na System.Design
Usunięte właściwości
Verbs Właściwości pojawiające się w menu kontekstowym
Dodawanie komponentów Chcąc dodać nowe komponenty klikamy prawym klawiszem na pasku kompenentów
Dodawanie komponentów Jeżeli komponent nie jest zarejestrowany w systemie można go poszukać korzystając z przycisku Browse.
Dodawanie komponentów Dodawać można także kontrolki ActiveX (OCX)
Dodawanie komponentów Dla kontrolek typu COM (ActiveX) tworzone są pliki opisujące ich interfejs w postaci plików DLL, których nazwy zaczynają się od Interop.. Przykład dla Excela i IE
Dystrybucja komponentów Użytkownikowi końcowemu trzeba dostarczyć z programem wszystkie wykorzystywane pliki DLL. Najlepiej przechowywać je w katalogu programu, ewentualnie w katalogu System32. Komponenty można dodać do globalnego repozytorium, tak aby były widoczne dla innych aplikacji.