POLECAMY
Autor:
Wydawca:
Format:
pdf, ibuk
Biblioteka wxWidgets jest potężnym, wieloplatformowym narzędziem, stworzonym do pisania aplikacji okienkowych, przeznaczonych dla wszystkich popularnych systemów operacyjnych. Jest wzbogacona o szereg narzędzi, umożliwiających realizację większości zadań i wymagań stawianych przed nowoczesnymi programami - w tym m.in. pełną obsługę współbieżności, obsługę protokołów sieciowych, czy też obsługę nowoczesnego OpenGL, choć to jedynie mała część jej możliwości. Co ważne, licencja wxWidgets pozwala na jej dowolne wykorzystanie w projektach każdego rodzaju, natomiast bogaty zestaw rozszerzeń znakomicie zwiększa zakres, w którym może być stosowana.
Biblioteka wxWidgets jest wykorzystywana między innymi przez NASA do tworzenia oprogramowania pracującego z teleskopami kosmicznymi, a także przez koncern zbrojeniowy Lockheed Martin, czy też firmę AMD. Z jej pomocą stworzono szereg popularnych aplikacji, takich jak FileZilla, CodeLite, czy RapidSVN, a także wiele innych.
Niniejsza książka to kompleksowy i wyjątkowy przewodnik po wxWidgets. To publikacja skierowana do wszystkich programistów C++ – także tych, którzy stawiają pierwsze kroki w świecie programowania GUI i programowania wieloplatformowego. Każdy kolejny rozdział wprowadza Czytelnika w coraz bardziej złożone i zaawansowane techniki wxWidgets, a zawarte w niej liczne przykłady kodu można uruchomić na większości popularnych platform systemowych. Możliwe będzie poznanie m.in. wyglądu struktury aplikacji wxWidgets oraz działanie i możliwość wykorzystania kluczowych typów wxWidgets takich jak wxString czy wxDateTime.
Dzięki lekturze Czytelnik nauczy się:
jak utworzyć pierwsze okno, wzbogacając je o pasek stanu i pasek menu oraz inne elementy i kontrolki GUI, pracować ze standardową i dynamiczną obsługą zdarzeń, pisać atrakcyjne programy, wykorzystywać standardowe okna dialogowe oraz pisać własne i kontrolować pozyskiwane przy ich pomocy dane wejściowe, pracować z plikami, czy formatem XML, przechowywać konfigurację programu, tworzyć aplikacje obsługujące różne języki, w jaki sposób napisać własny serwer oraz aplikację kliencką, stworzyć własnego klienta FTP, czy obsłużyć protokół HTTP, projektować oraz realizować własne kontrolki GUI, korzystać z innych zaawansowanych komponentów biblioteki, umożliwiających tworzenie nowoczesnych aplikacji komputerowych różnego typu.
Rok wydania | 2018 |
---|---|
Liczba stron | 1112 |
Kategoria | Aplikacje, programy użytkowe |
Wydawca | Wydawnictwo Naukowe PWN |
ISBN-13 | 978-83-01-19899-2 |
Numer wydania | 1 |
Język publikacji | polski |
Informacja o sprzedawcy | ePWN sp. z o.o. |
POLECAMY
Ciekawe propozycje
Spis treści
Od autora XXVII | |
Podziękowania XXVIII | |
Wprowadzenie XXIX | |
Zakres tematyczny książki XXIX | |
Ważna uwaga o konstrukcji książki, czyli zanim kupisz XXIX | |
Dla kogo jest ta książka? XXXI | |
Konwencje przyjęte w książce XXXI | |
Warsztat XXXIII | |
MS Windows XXXIII | |
Microsoft Visual C++ XXXIII | |
Code::Blocks XXXIII | |
Inne XXXIV | |
PoEdit XXXIV | |
GIMP XXXIV | |
Materiały dodatkowe do książki XXXIV | |
Errata i aktualizacje XXXIV | |
Notka prawna XXXV | |
Część I Poznajemy wxWidgets 3 1 | |
1. Biblioteka 3 | |
1.1. Czym jest wxWidgets? 3 | |
1.2. Pobieranie i instalacja wxWidgets 4 | |
1.2.1. Konwencje numerowania wersji biblioteki 5 | |
1.2.2. Instalacja wxWidgets w systemach MS Windows 5 | |
1.2.2.1. Zmienna systemowa WXWIN 5 | |
1.2.3. Instalacja wxWidgets w systemach Ubuntu i Mint 6 | |
1.2.3.1. Ręczna instalacja biblioteki z archiwum tar 6 | |
1.2.3.2. Instalacja wxWidgets z pakietu Ubuntu/Debian 10 | |
1.3. Foldery i pliki wxWidgets 11 | |
1.4. Kompilacja wxWidgets 13 | |
1.4.1. Plik setup.h i standardowe parametry kompilacji 13 | |
1.4.1.1. Ustawienia globalne (global settings) 13 | |
1.4.1.2. Ustawienia kompatybilności wersji (compatibility settings) 14 | |
1.4.1.3. Ustawienia debugowania (debugging settings) 14 | |
1.4.1.4. Wsparcie standardu Unicode (Unicode support) 14 | |
1.4.1.5. Funkcje globalne (global features) 14 | |
1.4.1.6. Współpraca z biblioteką standardową (Interoperability with the standard library) 15 | |
1.4.1.7. Opcje niezwiązane z GUI (Non GUI features selection) 16 | |
1.4.1.8. Kontrolki GUI (Individual GUI controls) 20 | |
1.4.1.9. Różności GUI (Miscellaneous GUI Stuff) 23 | |
1.4.1.10. Okna dialogowe (common dialogs) 24 | |
1.4.1.11. Wsparcie metaplików (Metafiles support) 25 | |
1.4.1.12. Duże kontrolki GUI (Big GUI controls) 26 | |
1.4.1.13. Przetwarzanie danych (Data transfer) 26 | |
1.4.1.14. Ustawienia różne (Miscellaneous settings) 27 | |
1.4.1.15. Klasy wxDC (wxDC classes for various output formats) 27 | |
1.4.1.16. Wsparcie dla formatów graficznych (image format support) 28 | |
1.4.1.17. Inne opcje pliku setup.h 28 | |
1.4.1.18. Opcje zależne od platformy 29 | |
1.4.2. Kompilacja wxWidgets w systemach MS Windows 29 | |
1.4.3. Kompilacja wxWidgets w systemach Ubuntu Linux i Mint Linux 29 | |
1.5. Struktura biblioteki wxWidgets 29 | |
1.6. Słowo o konwencjach i stylu kodowania w wxWidgets 30 | |
1.6.1. Pliki 31 | |
1.6.2. Konwencje nazewnicze 31 | |
1.6.3. Styl kodowania 31 | |
1.6.4. Jakość kodu 32 | |
1.6.5. Ograniczenia C++ 32 | |
1.6.6. Inne 33 | |
2. Przygotowanie projektu 34 | |
2.1. Visual C++ (MS Windows) 34 | |
2.1.1. Utworzenie projektu 35 | |
2.1.2. Konfiguracja projektu 36 | |
2.1.2.1. Konfiguracja x86 (Win32) 37 | |
2.1.2.2. Konfiguracja x64 43 | |
2.1.3. Dodanie plików źródłowych 50 | |
2.1.4. Zapisanie szablonu projektu 50 | |
2.2. Code::Blocks (Ubuntu i Mint) 52 | |
2.2.1. Utworzenie projektu 52 | |
2.2.2. Konfiguracja projektu 54 | |
2.2.2.1. Ogólne opcje projektu 54 | |
2.2.2.2. Opcje kompilacji i konsolidacji 55 | |
2.2.3. Dodanie plików źródłowych 56 | |
2.2.4. Zapisanie szablonu projektu 58 | |
2.2.5. Rozwiązywanie problemów z kodowaniem plików 58 | |
2.2.6. Rozwiązywanie problemów z wieloma wersjami wxWidgets 58 | |
2.2.6.1. Wybór wersji wxWidgets za pomocą wx-config 58 | |
2.2.6.2. Wybór wersji wxWidgets za pomocą własnego pliku Makefile 59 | |
2.3. O projektach Code::Blocks i wxWidgets w systemach MS Windows 61 | |
2.4. Podsumowanie 62 | |
3. Pierwsze okno 63 | |
3.1. Ogólna struktura aplikacji 63 | |
3.2. Szczegóły głównego okna programu 66 | |
3.2.1. Modyfikowanie konstruktora 68 | |
3.3. Pasek stanu 69 | |
3.3.1. Funkcja CreateStatusBar() 69 | |
3.3.2. Więcej opcji paska stanu 70 | |
3.3.2.1. Modyfikacja rozmiarów pól paska stanu 70 | |
3.3.2.2. Modyfikacja liczby pól paska stanu 72 | |
3.3.3. Zaawansowane tworzenie paska stanu 72 | |
3.4. Pasek menu 73 | |
3.4.1. Realizacja paska menu 73 | |
3.4.2. Sprytne odmiany funkcji Append() 76 | |
3.4.3. Skróty klawiaturowe menu 78 | |
3.4.4. Dygresja graficzna, czyli słowo o ikonach w menu 79 | |
3.4.5. Co dalej? 79 | |
4. Obsługa zdarzeń 80 | |
4.1. Wprowadzenie do obsługi zdarzeń 80 | |
4.1.1. Identyfikatory 80 | |
4.1.2. Funkcje akcji programu 81 | |
4.1.3. Tablica zdarzeń 83 | |
4.1.4. Uzupełniamy program modelowy 84 | |
4.2. Wokół pętli zdarzeń... 86 | |
4.3. Niektóre metody klasy wxCommandEvent 88 | |
4.4. Rozpoznawanie inicjatora zdarzenia za pomocą funkcji GetId() 90 | |
4.4.1. Składanie zdarzeń 90 | |
4.4.2. Zakresowe makra obsługi zdarzeń 91 | |
4.5. Dynamiczna obsługa zdarzeń 92 | |
4.5.1. Odrobina klasyki, czyli funkcje Connect() i Disconnect() 92 | |
4.5.2. Z duchem czasu, czyli funkcje Bind() i Unbind() 94 | |
4.5.3. Standard C++11 i obsługa zdarzeń wxWidgets 96 | |
4.6. Wbudowane identyfikatory wxWidgets 97 | |
4.6.1. Wbudowane identyfikatory wxWidgets i odkrywanie tajemnic menu 98 | |
4.7. Wyjątkowe zdarzenie wxEVT_CLOSE_WINDOW 99 | |
4.7.1. Realizacja pytania o wyjście z programu 99 | |
4.8. Zdarzenia myszy i klawiatury 100 | |
4.8.1. Obsługa zdarzeń myszy 100 | |
4.8.2. Obsługa zdarzeń klawiatury 103 | |
4.8.2.1. Problem globalnej obsługi zdarzeń klawiatury 106 | |
4.9. Inne rodzaje zdarzeń 108 | |
4.10. Pisanie własnych zdarzeń 110 | |
4.10.1. Kiedy i gdzie stosować własne zdarzenia? 110 | |
4.10.2. Realizacja własnych zdarzeń 111 | |
4.10.2.1. Podstawowa realizacja własnych zdarzeń 111 | |
4.10.2.2. Zaawansowana realizacja własnych zdarzeń 112 | |
5. Zanim przejdziemy dalej... 116 | |
5.1. Kod aplikacji wxWidgets w różnych plikach 116 | |
5.2. Podobieństwo konstruktorów i metod, czyli słowo o tym, jak łatwo i szybko opanować wxWidgets 116 | |
5.3. Konstruktor czy Create()? 119 | |
Część II Zdobywamy obszar klienta 121 | |
6. Wisielec, czyli podstawowe kontrolki i techniki wxWidgets 123 | |
6.1. Koncepcja programu 124 | |
6.2. Kilka uwag o menu Wisielca 125 | |
6.3. Klasa wxPanel – podstawowy kontener GUI 126 | |
6.4. Grafika w programie: wxBitmap, wxImage i wxIcon 127 | |
6.4.1. Procedury obsługi grafiki 127 | |
6.4.2. Klasa wxBitmap 128 | |
6.4.2.1. Tworzenie bitmapy i inicjowanie jej danymi 129 | |
6.4.2.2. Tajemniczy format XPM 130 | |
6.4.2.3. Obiekty wxBitmap i grafika wbudowana 131 | |
6.4.2.4. Operacje na wxBitmap 133 | |
6.4.3. Klasa wxImage 135 | |
6.4.3.1. Tworzenie obiektów wxImage 135 | |
6.4.3.2. Operacje na wxImage 136 | |
6.4.3.3. Przekształcanie bitmapy wxBitmap za pomocą wxImage 137 | |
6.4.4. Klasa wxIcon 138 | |
6.5. Lokalizacja plików aplikacji w różnych systemach operacyjnych 139 | |
6.5.4.1. Pomocne funkcje narzędziowe i plik utils.h 142 | |
6.6. Ustawiamy ikonę programu 143 | |
6.7. Pasek narzędzi wxToolBar 144 | |
6.7.1. Realizacja paska narzędzi 144 | |
6.7.2. Zarządzanie paskiem narzędzi 148 | |
6.7.3. Menu w pasku narzędzi 150 | |
6.7.4. Kontrolki w pasku narzędzi 151 | |
6.8. Statyczne elementy GUI 153 | |
6.8.1. Klasa wxStaticText 153 | |
6.8.2. Klasa wxStaticBitmap 154 | |
6.8.3. Klasa wxStaticLine 155 | |
6.8.4. Klasa wxStaticBox 155 | |
6.9. Wprowadzenie do programowania GUI opartego na relacjach 156 | |
6.9.1. Czym są sizery? 157 | |
6.9.2. Klasa wxBoxSizer 157 | |
6.9.3. Klasa wxStaticBoxSizer 159 | |
6.9.4. Analiza przypadków 159 | |
6.9.4.1. Przypadek 1 – prosty sizer liniowy 159 | |
6.9.4.2. Przypadek 2 – klasyczne okno dialogowe 162 | |
6.9.4.3. Przypadek 3 – koncepcja GUI Wisielca 163 | |
6.9.5. Składamy szkielet GUI Wisielca 165 | |
6.10. Czcionki i kolory w wxWidgets 169 | |
6.10.1. Klasa wxFont 169 | |
6.10.1.1. Modyfikacja utworzonych czcionek 171 | |
6.10.1.2. Użycie czcionek wxFont 172 | |
6.10.1.3. Ustawiamy czcionki Wisielca 173 | |
6.10.2. Klasa wxColour, baza kolorów i inne kolorowe ciekawostki 173 | |
6.10.2.1. Przetwarzanie danych koloru 176 | |
6.10.2.2. Słowo o kolorach z wxStockGDI 177 | |
6.10.2.3. Kolory systemowe 178 | |
6.10.2.4. Użycie kolorów wxWidgets 179 | |
6.10.2.5. Ustawiamy kolory GUI Wisielca 180 | |
6.11. Wstęp do podstawowych kontrolek dynamicznych 181 | |
6.11.1. Okno tekstowe wxTextCtrl 182 | |
6.11.1.1. Tworzymy kontrolkę tekstową wxTextCtrl 182 | |
6.11.1.2. Ważniejsze metody klasy wxTextCtrl 184 | |
6.11.1.3. Zdarzenia klasy wxTextCtrl i ich obsługa 187 | |
6.11.2. Świat przycisków wxWidgets 189 | |
6.11.2.1. Klasa wxButton 189 | |
6.11.2.2. Klasa wxToggleButton 191 | |
6.11.2.3. Klasa wxBitmapButton 192 | |
6.11.3. Lista rozwijana wxComboBox 192 | |
6.11.3.1. Klasa wxArrayString 193 | |
6.11.3.2. Realizacja listy rozwijanej 194 | |
6.11.3.3. Niektóre metody klasy wxComboBox 195 | |
6.11.3.4. Obsługa zdarzeń listy rozwijanej 196 | |
6.11.4. Kontrolki numeryczne wxSpinCtrl i wxSpinCtrlDouble 197 | |
6.11.4.1. Klasa wxSpinCtrl 197 | |
6.11.4.2. Klasa wxSpinCtrlDouble 198 | |
6.11.4.3. Style kontrolek numerycznych 199 | |
6.11.4.4. Ważniejsze metody kontrolek numerycznych 199 | |
6.11.4.5. O zdarzeniach kontrolek numerycznych 200 | |
6.12. Inne kontrolki wxWidgets 201 | |
6.12.1. Jak korzystać z dokumentacji klas wxWidgets 202 | |
6.13. Kompletujemy GUI Wisielca 203 | |
6.13.1. Log 203 | |
6.13.2. Ustawienia 205 | |
6.14. Rysowanie szubienicy, czyli tajemnice klasy wxDC 207 | |
6.14.1. Dostępne konteksty urządzeń 207 | |
6.14.2. Rysowanie z wxDC w praktyce 208 | |
6.14.2.1. Pióro i pędzel 208 | |
6.14.2.2. Metody rysujące 210 | |
6.14.3. Pierwsze rysunki 214 | |
6.14.3.1. Rysowanie w obszarze klienta (wxClientDC) 214 | |
6.14.3.2. Rysowanie za pomocą myszy 218 | |
6.14.4. Znaczenie zdarzenia wxEVT_PAINT i wieloplatformowość 219 | |
6.14.4.1. Uniwersalny wieloplatformowy blok rysunkowy 220 | |
6.14.5. Piszemy funkcję rysującą szubienicę 221 | |
6.15. Wykończyć Wisielca! 224 | |
6.15.1. Założenia 224 | |
6.15.2. Niezbędne zmienne i funkcje 225 | |
6.15.3. Wprowadzanie odgadywanych liter z klawiatury 226 | |
6.15.4. Obsługa logu 227 | |
6.15.5. Mierzenie czasu 228 | |
6.15.6. Ustawienie stanu początkowego gry 229 | |
6.15.7. Funkcja wyświetlająca hasło 230 | |
6.15.8. Rozpoczęcie gry 230 | |
6.15.9. Przebieg rozgrywki 232 | |
6.15.10. Zakończenie gry 236 | |
6.15.11. Przerwanie gry 237 | |
6.16. Podsumowanie 238 | |
7. Własny edytor C++, czyli bardziej zaawansowane kontrolki i techniki wxWidgets 239 | |
7.1. Koncepcja programu 240 | |
7.2. Przygotowanie szkieletu aplikacji 241 | |
7.2.1. Tworzymy główne okno 241 | |
7.2.2. Realizujemy pasek menu z ikonami 242 | |
7.2.3. Pasek narzędzi 247 | |
7.2.4. Domykamy szkielet aplikacji 248 | |
7.2.5. Zanim rozpoczniemy pracę nad GUI edytora 251 | |
7.3. Kontener wxSplitterWindow 251 | |
7.3.1. Wstawiamy kontener do programu 253 | |
7.3.2. Wstawiamy kontener prawej kolumny 255 | |
7.3.3. Pozostałe ważniejsze metody klasy wxSplitterWindow, o których warto wiedzieć 255 | |
7.3.4. Obsługa zdarzeń kontenera wxSplitterWindow 257 | |
7.3.5. Edytor C++ – przygotowanie sizerów obszarów GUI 258 | |
7.3.6. Multi Document Interface (MDI) i wxAUI, czyli inne podejście do organizacji GUI 258 | |
7.4. Drzewo projektu, czyli klasa wxTreeCtrl 259 | |
7.4.1. Jak działa drzewo wxTreeCtrl? 260 | |
7.4.2. Trochę teorii o drzewach wxTreeCtrl 260 | |
7.4.3. Obsługa zdarzeń klasy wxTreeCtrl 262 | |
7.4.4. Ikony drzewa i lista wxImageList 262 | |
7.4.5. Operacje drzewa wxTreeCtrl 265 | |
7.4.5.1. Dodawanie, wstawianie i usuwanie elementów drzewa 265 | |
7.4.5.2. Modyfikowanie widoku drzewa 267 | |
7.4.5.3. Zarządzanie drzewem i jego elementami 268 | |
7.4.6. Tworzymy drzewo plików projektu edytora C++ 279 | |
7.4.6.1. Przygotowanie struktury danych plików projektu C++ 279 | |
7.4.6.2. A co z plikami spoza projektu? 281 | |
7.4.6.3. Klasa drzewa projektu, czyli ProjectTreeCtrl 282 | |
7.4.6.4. Wyszukiwanie plików projektu w drzewie 283 | |
7.4.6.5. Wyszukiwanie innych elementów drzewa 285 | |
7.4.6.6. Wstawianie elementów do drzewa 286 | |
7.4.6.7. Inne przydatne metody 287 | |
7.4.6.8. Co dalej z drzewem projektu? 287 | |
7.5. Tworzymy plik projektu, czyli praca z biblioteką wxXML 288 | |
7.5.1. Błyskawiczne wprowadzenie do języka XML 288 | |
7.5.2. Struktura XML pliku projektu 289 | |
7.5.3. Poznajemy bibliotekę składową wxXML i jej klasy 291 | |
7.5.3.1. Klasa wxXmlDocument 291 | |
7.5.3.2. Klasa wxXmlNode i znaczniki XML 293 | |
7.5.3.3. Techniki definiowania znaczników XML z użyciem wxXmlNode 295 | |
7.5.3.4. Przegląd niektórych przydatnych metod klasy wxXmlNode 298 | |
7.5.3.5. Odczyt, przetwarzanie i zapis pliku XML 299 | |
7.5.3.6. Usprawniamy pracę, czyli własna klasa dokumentu XML 305 | |
7.5.4. Realizacja pliku projektu i jego obsługi w edytorze C++ 310 | |
7.5.4.1. Okno wyjścia konsoli 310 | |
7.5.4.2. Drzewo i jego ikony 311 | |
7.5.4.3. Tworzenie nowego pliku projektu 312 | |
7.5.4.4. Otwieranie istniejącego pliku projektu 319 | |
7.5.4.5. Dodawanie plików do projektu 324 | |
7.5.4.6. Zmiana nazwy pliku w projekcie 329 | |
7.5.4.7. Usuwanie plików z projektu 331 | |
7.5.4.8. A co z pozostałymi operacjami na plikach? 332 | |
7.5.4.9. Temat nadobowiązkowy – menu kontekstowe dla plików w drzewie projektu 333 | |
7.6. wxBookCtrlBase i klasy kontenerów pochodnych 334 | |
7.6.1. Klasa wxBookCtrlBase 334 | |
7.6.2. Klasa zdarzeń wxBookCtrlEvent 336 | |
7.6.3. Przegląd kontenerów opartych na klasie wxBookCtrlBase 337 | |
7.6.3.1. Klasa wxNotebook 337 | |
7.6.3.2. Klasa wxChoicebook 339 | |
7.6.3.3. Klasa wxListbook 340 | |
7.6.3.4. Pozostałe kontenery wxBookCtrl 341 | |
7.6.3.5. Sposoby korzystania z kontenerów wxBookCtrl 342 | |
7.6.3.6. Utrudnienia w korzystaniu z kontenerów wxBookCtrl wraz z elementami języka C++11 i nowszych 347 | |
7.6.3.7. Dodajemy kontener do edytora C++ 347 | |
7.7. Serce edytora, czyli klasa wxStyledTextCtrl 348 | |
7.7.1. Przygotowanie biblioteki wxSTC 349 | |
7.7.2. Tworzenie kontrolki edytora wxStyledTextCtrl i jej konfiguracja 349 | |
7.7.2.1. Podstawowy konstruktor klasy wxStyledTextCtrl 349 | |
7.7.2.2. Podstawowa konfiguracja kontrolki wxStyledTextCtrl 350 | |
7.7.3. Zdarzenia klasy wxStyledTextCtrl i ich obsługa 355 | |
7.7.4. Przegląd istotnych możliwości klasy wxStyledTextCtrl 358 | |
7.7.4.1. Słowo o metodach reimplementowanych z wxTextEntry i innych metodach związanych z edycją 358 | |
7.7.4.2. Składanie kodu (code folding) 361 | |
7.7.4.3. Autouzupełnianie kodu (code autocompletion) 367 | |
7.7.4.4. Notatki i komunikaty w kodzie 373 | |
7.7.4.5. Podświetlanie pasujących nawiasów 378 | |
7.7.5. Wnioski 381 | |
7.8. Ten moment, gdy serce zaczyna bić… 381 | |
7.8.1. Otwieranie plików w edytorze 382 | |
7.8.1.1. Przygotowania 382 | |
7.8.1.2. Funkcja obsługująca składanie kodu 386 | |
7.8.1.3. Funkcja otwierająca dokumenty w nowych oknach edytora 386 | |
7.8.1.4. Wyświetlanie pliku dodawanego do projektu 387 | |
7.8.1.5. Wyświetlanie pliku aktywowanego w drzewie projektu 388 | |
7.8.1.6. Wyświetlanie pliku spoza projektu 390 | |
7.8.2. Działania związane z edycją plików 390 | |
7.8.2.1. Wykrywanie edycji i zmiana ikony pliku 390 | |
7.8.2.2. Metody edycyjne 391 | |
7.8.3. Wyszukiwanie i zamiana ciągów znaków 392 | |
7.8.3.1. Wyświetlenie okna dialogowego wyszukiwania i zamiany ciągów znaków 393 | |
7.8.3.2. Metoda wyszukująca 394 | |
7.8.3.3. Realizacja wyszukiwania ciągów znaków 396 | |
7.8.3.4. Realizacja zamiany ciągów znaków 398 | |
7.8.3.5. Właściwe zamykanie okna dialogowego zamiany 399 | |
7.8.4. Zapis i zamykanie dokumentów 400 | |
7.8.4.1. Ogólne metody zapisujące 400 | |
7.8.4.2. Zapis na życzenie użytkownika 402 | |
7.8.4.3. Zamykanie plików aktywnego projektu 403 | |
7.8.4.4. Zamykanie aplikacji a kontrola niezapisanych plików 404 | |
7.8.5. Ostatnie uzupełnienia 404 | |
7.8.6. Wnioski 405 | |
7.9. Zgłębiamy tajemnice listy wxListCtrl 406 | |
7.9.1. Tworzenie listy wxListCtrl i tryby jej pracy 407 | |
7.9.1.1. Pozostałe style klasy wxListCtrl 408 | |
7.9.1.2. Ikony listy 408 | |
7.9.1.3. Elementy listy, czyli klasa wxListItem 409 | |
7.9.2. Obsługa zdarzeń klasy wxListCtrl 411 | |
7.9.3. Ważniejsze metody klasy wxListCtrl 412 | |
7.9.3.1. Zarządzanie elementami listy 412 | |
7.9.3.2. Dane powiązane z elementem listy 414 | |
7.9.3.3. Korzystanie z przełączników typu checkbox w obrębie listy 415 | |
7.9.3.4. Praca z listą w trybie szczegółowym 416 | |
7.9.3.5. Testowanie elementów listy (na przykładzie listy szczegółowej) 419 | |
7.9.3.6. Szersze spojrzenie na atrybuty elementów listy wxListCtrl i klasa wxListItemAttr 420 | |
7.9.4. Zaawansowane zabawy z listą wxListCtrl 420 | |
7.9.4.1. Przemieszczanie wierszy listy w trybie szczegółowym 421 | |
7.9.4.2. Sortowanie listy wxListCtrl 425 | |
7.9.4.3. wxListCtrl jako lista rozwijana kontrolek typu ‘combobox’ 432 | |
7.9.5. Inne klasy list dostępnych w wxWidgets 436 | |
7.9.6. Tworzymy listę statystyk plików programu wxC++ 440 | |
7.9.6.1. Tworzenie listy statystyki 441 | |
7.9.6.2. Aktualizacja danych listy statystyk 441 | |
7.10. Przełącznik wxCheckBox 443 | |
7.10.1. Tworzenie i tryby pracy przełączników wxCheckBox 444 | |
7.10.1.1. Style i obsługa zdarzeń klasy wxCheckBox 444 | |
7.10.1.2. Ważniejsze metody klasy wxCheckBox 444 | |
7.10.2. Korzystanie z przełącznika wxCheckBox (na przykładzie aplikacji wxC++) 445 | |
7.11. Szybkie wprowadzenie do drukowania w wxWidgets 446 | |
7.11.1. Klasa wxHtmlEasyPrinting i inicjowanie środowiska drukowania 447 | |
7.11.2. Konfiguracja wydruku 448 | |
7.11.3. Przygotowanie tekstu do drukowania 449 | |
7.11.4. Wydruk, podgląd wydruku oraz ustawienia strony 450 | |
7.11.5. Littera scripta manet 452 | |
7.12. Pozostałe uzupełnienia i funkcje programu wxC++ 452 | |
7.12.1. Implementacja trybu pełnoekranowego 452 | |
7.12.2. Prosty kreator klas C++ 453 | |
7.13. Aplikacja wxC++ – zakończenie 454 | |
7.13.1. Propozycje udoskonaleń programu 455 | |
8. Level completed, czyli co jeszcze w trawie piszczy? 459 | |
Część III Potęga dialogu 463 | |
9. Standardowe okna i funkcje dialogowe oraz inne techniki interakcji z użytkownikiem 465 | |
9.1. Okna dialogowe związane z pobieraniem danych od użytkownika 466 | |
9.1.1. Pobieranie tekstu 467 | |
9.1.1.1. Pobieranie zwykłego tekstu 467 | |
9.1.1.2. Pobieranie hasła (tekstu ukrytego) 468 | |
9.1.1.3. Ograniczenia funkcji wxGetTextFromUser() i wxGetPasswordFromUser 468 | |
9.1.1.4. Klasa wxTextEntryDialog 468 | |
9.1.1.5. Klasa wxPasswordEntryDialog 470 | |
9.1.2. Pobieranie wartości numerycznych 470 | |
9.2. Okna dialogowe związane z pobieraniem wyborów użytkownika 471 | |
9.2.1. Wybór kroju czcionki 471 | |
9.2.1.1. Klasa wxFontDialog 473 | |
9.2.2. Wybór znaku 474 | |
9.2.3. Wybór koloru 476 | |
9.2.3.1. Klasa wxColourDialog 477 | |
9.2.4. Wybór jednej lub wielu opcji 478 | |
9.2.4.1. Funkcje dialogowe wyboru pojedynczego 478 | |
9.2.4.2. Sprytne funkcje wyboru pojedynczego 481 | |
9.2.4.3. Klasa wxSingleChoiceDialog 482 | |
9.2.4.4. Funkcje dialogowe wyboru wielokrotnego 484 | |
9.2.4.5. Klasa wxMultiChoiceDialog 485 | |
9.2.5. Definiowanie szyku danych 486 | |
9.2.5.1. Klasa wxRearrangeDialog 486 | |
9.2.5.2. Klasach wxRearrangeCtrl i wxRearrangeList 488 | |
9.3. Okna dialogowe systemu plików 488 | |
9.3.1. Okna dialogowe do pracy z katalogami 489 | |
9.3.1.1. Klasa wxDirDialog 489 | |
9.3.2. Okna dialogowe do pracy z plikami 490 | |
9.3.2.1. Tryby pracy dialogów plikowych 490 | |
9.3.2.2. Funkcje dialogowe do pracy z plikami 491 | |
9.3.2.3. Klasa wxFileDialog 494 | |
9.4. Informacyjne okna dialogowe 498 | |
9.4.1. Podstawowe okna informacyjne 498 | |
9.4.1.1. Klasa wxMessageDialog 498 | |
9.4.1.2. Funkcja wxMessageBox() 502 | |
9.4.1.3. Funkcja wxInfoMessageBox() 502 | |
9.4.2. Paski komunikatów 503 | |
9.4.3. Okna informacji o programie 505 | |
9.4.3.1. Funkcja wxAboutBox() i klasa wxAboutDialogInfo 505 | |
9.4.4. Okno komunikatów diagnostycznych, czyli klasa wxLogGui 507 | |
9.4.5. Okna dialogowe i techniki wizualizacji postępu 509 | |
9.4.5.1. Klasy wxGenericProgressDialog i wxProgressDialog 509 | |
9.4.5.2. Klasa wxAppProgressIndicator 512 | |
9.4.6. Okna dialogowe i techniki wizualizowania zajętości 513 | |
9.4.6.1. Wizualizacja zajętości przez wygląd kursora 513 | |
9.4.6.2. Klasa wxBusyInfo 514 | |
9.4.7. Powiadomienia 516 | |
9.4.7.1. Klasa wxNotificationMessage 516 | |
9.4.7.2. Metoda wxTopLevelWindow::RequestUserAttention() 519 | |
9.4.8. Okna dialogowe związane z systemem pomocy i wsparciem 520 | |
9.4.8.1. Porada dnia 520 | |
9.4.8.2. Rozszerzone podpowiedzi 522 | |
9.4.8.3. Okno dialogowe pomocy HTML 523 | |
9.5. Pozostałe okna dialogowe 527 | |
9.5.1. Arkusze właściwości 527 | |
9.5.2. Okno dialogowe wyszukiwania i zamiany ciągu znaków 530 | |
9.5.3. Okno dialogowe konfiguracji drukowania 531 | |
9.5.4. Kreator wxWizard 533 | |
9.6. Kontrolki pochodne od wxPickerBase 538 | |
9.6.1. Klasa wxColourPickerCtrl 538 | |
9.6.2. Klasa wxFontPickerCtrl 540 | |
9.6.3. Klasy wxDirPickerCtrl i wxFilePickerCtrl 541 | |
9.6.4. Przegląd ważniejszych wspólnych metod klas dziedziczących z wxPickerBase 544 | |
9.7. Podsumowanie i słowo o dialogowych kontrolkach GUI 544 | |
10. Walidacja danych wejściowych 545 | |
10.1. Aplikacja przykładowa i funkcja testująca 545 | |
10.2. Pasywne testy danych wejściowych 546 | |
10.2.1. Kontrola pasywna danych wejściowych kontrolki GUI 547 | |
10.2.2. Kontrola pasywna danych wejściowych w oknach dialogowych 547 | |
10.3. Aktywne testy danych wejściowych 548 | |
10.3.1. Kontrola aktywna danych wejściowych kontrolki GUI 548 | |
10.3.2. Kontrola aktywna danych wejściowych w oknach dialogowych 549 | |
10.4. Praca z walidatorami wxWidgets 551 | |
10.4.1. Klasa wxValidator 552 | |
10.4.2. Walidator tekstowy wxTextValidator 553 | |
10.4.3. Walidatory numeryczne wxIntegerValidator oraz wxFloatingPointValidator 555 | |
10.4.4. Walidator generyczny wxGenericValidator 557 | |
10.4.5. Walidacja wyrażeń regularnych 558 | |
10.4.6. Własny walidator uniwersalny 563 | |
10.4.7. Nieco więcej o transferze danych 568 | |
10.5. Podsumowanie rozdziału, czyli jakiej metody walidacji użyć? 568 | |
11. Aplikacja Bibliotekarz i realizacja własnych okien dialogowych 570 | |
11.1. Klasa wxDialog i jej cechy 570 | |
11.1.1. Tworzenie własnych klas okien dialogowych opartych na klasie wxDialog 571 | |
11.1.2. Zdarzenia okna dialogowego wxDialog 572 | |
11.1.3. Sposoby wyświetlania okien dialogowych wxDialog 572 | |
11.1.3.1. C++11 i nowe możliwości wyświetlania okien dialogowych 574 | |
11.1.3.2. Pozostałe metody związane z wyświetlaniem okna dialogowego 574 | |
11.1.4. Metody ułatwiające tworzenie GUI okien dialogowych opartych na klasie wxDialog 575 | |
11.1.4.1. Tworzenie obszaru przycisków 575 | |
11.1.4.2. Usprawnianie tworzenia pozostałych obszarów GUI 576 | |
11.1.5. Adaptacja dużych obszarów zawartości 576 | |
11.1.6. Pozostałe ważniejsze metody klasy wxDialog 579 | |
11.2. Przygotowanie aplikacji Bibliotekarz 579 | |
11.2.1. Główne założenia i przygotowanie do pracy nad programem 579 | |
11.2.1.1. Przygotowanie trzonu aplikacji 580 | |
11.2.1.2. Implementacja prostego systemu przechowywania konfiguracji programu 582 | |
11.2.2. Klasa biblioteki 586 | |
11.2.2.1. Dodanie biblioteki do programu 594 | |
11.3. Piszemy pierwsze okno dialogowe 595 | |
11.3.1. Zanim zaczniemy 596 | |
11.3.1.1. Horyzontalny sizer z etykietą 596 | |
11.3.2. Tworzymy klasę własnego okna dialogowego 597 | |
11.3.3. Piszemy konstruktor klasy BookDialog 599 | |
11.3.4. Pozostałe metody klasy BookDialog 604 | |
11.3.5. Korzystanie z okna dialogowego w programie 606 | |
11.3.5.1. Usuwanie książki z biblioteki 608 | |
11.3.6. Wnioski 609 | |
11.4. Współdziałanie własnych okien dialogowych z własnymi walidatorami 609 | |
11.4.1. Klasa LendBookDialog 609 | |
11.4.2. Implementacja wypożyczania i oddawania książki 611 | |
11.5. Okna dialogowe oparte na klasie wxFrame 612 | |
11.5.1. Klasa MailConfigDialog 612 | |
11.5.2. Implementacja mechanizmu modalnego wyświetlania okna 615 | |
11.5.3. Obsługa standardowych przycisków 617 | |
11.5.4. Zastosowanie klasy MailConfigDialog w programie 618 | |
11.5.5. Wnioski 619 | |
11.6. Ostatnie podejście do pisania własnych okien dialogowych i zmiana zwracanego kodu 619 | |
11.6.1. Klasa SMTPConfigDialog 619 | |
11.6.2. Włączenie okna konfiguracji SMTP do aplikacji 622 | |
11.7. Kończymy aplikację Bibliotekarz 622 | |
11.7.1. Wybór między wxSocketBase, wxEMail a biblioteką POCO 622 | |
11.7.2. Pobieranie i kompilacja biblioteki POCO 623 | |
11.7.2.1. Kompilacja biblioteki POCO w MS Windows 623 | |
11.7.2.2. Kompilacja i instalacja biblioteki POCO w Linux 625 | |
11.7.2.3. Wersja binarna bibliotek dla MS Windows 625 | |
11.7.3. Dodanie biblioteki POCO do projektu 625 | |
11.7.3.1. MS Windows (Visual Studio) 625 | |
11.7.3.2. Linux (Code::Blocks) 626 | |
11.7.3.3. Pliki nagłówkowe 627 | |
11.7.4. Wysyłanie wiadomości e-mail za pomocą biblioteki POCO 627 | |
11.8. Podsumowanie i propozycje udoskonalenia aplikacji 631 | |
Część IV Zaawansowane programowanie wxWidgets 633 | |
12. Tajemnice pracy z ciągami znaków w wxWidgets, czyli klasa wxString i nie tylko... 635 | |
12.1. Klasa wxString i jej stosowanie 635 | |
12.1.1. Tworzenie obiektów wxString 636 | |
12.1.2. Konkatenacja ciągów wxString 638 | |
12.1.2.1. Operatory konkatenacji 638 | |
12.1.2.2. Funkcje wstawiające 638 | |
12.1.3. Dostęp do elementów łańcucha wxString 639 | |
12.1.3.1. Metody dostępu 639 | |
12.1.3.2. Dostęp przez iteratory 639 | |
12.1.4. Konwersja wxString do innych typów i odwrotnie 640 | |
12.1.4.1. Konwersje między wxString a standardowymi typami tekstowymi oraz literałami łańcuchowymi 640 | |
12.1.4.2. Kodowanie znaków w konwersji ciągów znaków 642 | |
12.1.4.3. Konwersje między wxString a typami liczbowymi 644 | |
12.1.5. Testowanie ciągów wxString 646 | |
12.1.6. Przetwarzanie i edycja ciągów wxString 647 | |
12.1.6.1. Wyszukiwanie, zwracanie oraz zamiana ciągów znaków oraz ich fragmentów 647 | |
12.1.6.2. Zmiana wielkości znaków 649 | |
12.1.6.3. Usuwanie ciągu znaków i jego części 649 | |
12.1.6.4. Dzielenie ciągów wxString 650 | |
12.1.7. wxString i łańcuchy formatowane 652 | |
12.1.7.1. Formatowane inicjowanie obiektu wxString 652 | |
12.1.7.2. Formatowane wyjście wxString 652 | |
12.1.7.3. Ciągi wxString w standardowych funkcjach formatujących 653 | |
12.1.8. Makra wxT(), _T(), wxT_2(), wxS() oraz _() 653 | |
12.1.9. wxString i metody STL 653 | |
12.2. Wyrażenia regularne, czyli klasa wxRegEx 654 | |
12.2.1. Testowanie łańcuchów znaków 655 | |
12.2.2. Zmiana ciągów znaków za pomocą wyrażenia regularnego 655 | |
12.3. Gromadzenie ciągów znaków, czyli klasa wxArrayString 656 | |
12.3.1. Tworzenie tablic ciągów znaków i zarządzanie ich elementami 656 | |
12.3.2. Tablice wxArrayString a STL 657 | |
12.3.3. Testowanie tablic wxArrayString 658 | |
12.3.4. Tablice wxArrayString a zarządzanie pamięcią 658 | |
12.3.5. Sortowanie tablic wxArrayString 659 | |
12.4. Klasa wxSortedArrayString 660 | |
12.5. Podsumowanie 661 | |
13. Data i czas w wxWidgets 662 | |
13.1. Klasa wxDateTime i jej stosowanie 662 | |
13.1.1. Tworzenie i inicjowanie obiektów wxDateTime 662 | |
13.1.2. Dostęp do danych daty i czasu 665 | |
13.1.3. Porównywanie wartości dat i czasu 666 | |
13.1.4. Arytmetyka dat i czasu, czyli klasy wxDateSpan oraz wxTimeSpan 668 | |
13.1.4.1. Klasa wxDateSpan i jej właściwości 668 | |
13.1.4.2. Klasa wxTimeSpan i jej właściwości 670 | |
13.1.4.3. Wykonywanie działań na obiektach wxDateTime 673 | |
13.1.5. Parsowanie i formatowanie daty i czasu 677 | |
13.1.5.1. Formatowanie obiektów daty i czasu do łańcuchów znaków 677 | |
13.1.5.2. Własne formatowanie daty i czasu 678 | |
13.1.5.3. Wyświetlanie tekstowych informacji o okresach 686 | |
13.1.5.4. Parsowanie łańcuchów znaków do obiektów daty i czasu 688 | |
13.1.6. Strefy czasowe i tzw. czas letni 690 | |
13.1.7. Pozostałe przydatne metody wxDateTime 692 | |
13.1.7.1. Aktualny czas i aktualna data 692 | |
13.1.7.2. Funkcje kalendarzowe 693 | |
13.2. Pobieranie daty i czasu od użytkownika 693 | |
13.2.1. Prezentacja klas wxCalendarCtrl oraz wxGenericCalendarCtrl 693 | |
13.2.1.1. Zdarzenia klas wxCalendarCtrl oraz wxGenericCalendarCtrl i ich obsługa 695 | |
13.2.1.2. Modyfikacja wyglądu kalendarza generycznego 695 | |
13.2.1.3. Święta i ich definiowanie 695 | |
13.2.1.4. Atrybuty dat kalendarza generycznego 696 | |
13.2.1.5. Inne przydatne metody klas wxCalendarCtrl i wxGenericCalendarCtrl 697 | |
13.2.1.6. Którą kontrolkę kalendarza wybrać? 698 | |
13.2.1.7. Przykład zastosowania i porównanie kontrolek wxCalendarCtrl i wxGenericCalendarCtrl w praktyce 698 | |
13.2.2. Prezentacja klasy wxDatePickerCtrl 700 | |
13.2.2.1. Przykład stosowania kontrolek wxDatePickerCtrl 701 | |
13.2.3. Prezentacja klasy wxTimePickerCtrl 701 | |
13.2.3.1. Przykład stosowania kontrolek wxTimePickerCtrl 702 | |
13.3. Podsumowanie 703 | |
14. Krótka opowieść o przydatnych szablonach i pseudoszablonach wxWidgets 704 | |
14.1. Klasy pojemnikowe 704 | |
14.1.1. Kontener podstawowy, czyli klasa wxVector | |
14.1.2. Stos, czyli klasa wxStack | |
14.1.3. Lista łączona, czyli klasy wxList | |
14.1.4. Kontener asocjacyjny wxHashMap 709 | |
14.1.5. Tablice wxWidgets, czyli klasa wxArray | |
14.2. Sprytne wskaźniki 714 | |
14.2.1. wxSharedPtr | |
14.2.2. wxScopedPtr | |
14.2.3. Klasa wxScopedTiedPtr 716 | |
14.2.4. wxScopedArray | |
14.2.5. wxObjectDataPtr | |
14.2.6. wxWindowPtr | |
14.2.7. wxWeakRef< T > i wxWeakRefDynamic< T > 717 | |
14.3. Niektóre przydatne funkcje szablonowe 718 | |
14.4. Podsumowanie 718 | |
15. Praca z plikami i systemem plików w wxWidgets 719 | |
15.1. Niektóre funkcje zarządzania plikami i systemem plików 719 | |
15.1.1. Funkcje zarządzania katalogami 720 | |
15.1.2. Funkcje zarządzania plikami 721 | |
15.1.3. Inne funkcje systemu plików 724 | |
15.2. Specjalistka od katalogów, czyli klasa wxDir 725 | |
15.2.1. Tworzenie i inicjowanie obiektów wxDir 725 | |
15.2.2. Testowanie katalogów za pomocą wxDir 725 | |
15.2.3. Pobieranie informacji o danej lokalizacji 726 | |
15.2.4. Techniki listowania plików i katalogów z wxDir 726 | |
15.2.4.1. Listowanie plików i katalogów w pętli 727 | |
15.2.4.2. Listowanie plików i katalogów przy wsparciu klasy wxDirTraverser 727 | |
15.2.4.3. Listowanie plików i katalogów za pomocą metody GetAllFiles() 729 | |
15.2.5. Inne przydatne metody wxDir 729 | |
15.3. Klasy wxFile oraz wxFFile i podstawowa obsługa plików 730 | |
15.3.1. Niskopoziomowa obsługa plików, czyli klasa wxFile 730 | |
15.3.1.1. Tworzenie plików wxFile i zapis danych do pliku 730 | |
15.3.1.2. Odczyt danych z pliku 732 | |
15.3.1.3. Deskryptor pliku i pozostałe zagadnienia 733 | |
15.3.2. Wysokopoziomowa obsługa plików, czyli klasa wxFFile 734 | |
15.3.2.1. Tworzenie plików wxFFile i zapis danych do pliku 734 | |
15.3.2.2. Odczyt danych z pliku 735 | |
15.3.2.3. Pozostałe informacje o wxFFile 736 | |
15.4. Więcej narzędzi, czyli klasa wxFileName 736 | |
15.4.1. Tworzenie i inicjowanie obiektów wxFileName 736 | |
15.4.2. Analiza ścieżki, nazwy i rozszerzenia pliku 737 | |
15.4.3. Edycja ścieżki, nazwy i rozszerzenia pliku 740 | |
15.4.4. Ścieżki względne i absolutne 742 | |
15.4.5. Normalizacja ścieżek (skróty, zmienne środowiskowe i inne) 743 | |
15.4.6. Odczyt i edycja czasów pliku 744 | |
15.4.7. Prawa dostępu do pliku lub katalogu 745 | |
15.4.8. Badanie i wyświetlanie rozmiaru pliku 746 | |
15.4.9. Tworzenie i obsługa plików tymczasowych z wxFileName 747 | |
15.4.10. Niektóre pozostałe testy obiektów wxFileName 749 | |
15.4.11. Proste operacje na systemie plików 749 | |
15.5. Wirtualne systemy plików wxWidgets 750 | |
15.6. Praca z archiwami 752 | |
15.6.1. wxArchiveFSHandler i odczyt danych z archiwów 753 | |
15.6.1.1. Listowanie zawartości wybranego archiwum 753 | |
15.6.1.2. Wyświetlanie zawartości pliku w archiwum 753 | |
15.6.1.3. Rozpakowanie wybranego archiwum do wskazanej lokalizacji 754 | |
15.6.2. Prezentacja zaawansowanej obsługi archiwów 755 | |
15.6.2.1. Tworzenie archiwum 756 | |
15.6.2.2. Rozpakowywanie archiwów 758 | |
15.6.2.3. Pozostałe operacje i możliwości pracy z archiwami 759 | |
15.7. Monitorowanie zmian w systemie plików 760 | |
15.8. Pliki tekstowe wxTextFile 762 | |
15.8.1. Analiza pliku 763 | |
15.8.2. Tworzenie i edycja pliku 763 | |
15.8.3. Odczyt danych pliku 764 | |
15.9. Pliki tymczasowe wxTempFile 765 | |
15.10. Ścieżki systemowe, czyli klasa wxStandardPaths 766 | |
15.10.1. Niektóre przydatne metody wxStandardPaths zależne od platformy 767 | |
15.10.1.1. Metody dedykowane MS Windows 767 | |
15.10.1.2. Metody dedykowane Linuksowi 768 | |
15.11. Podsumowanie 768 | |
16. Krótki przegląd niektórych zaawansowanych kontrolek GUI 769 | |
16.1. Prezentacja wxRichTextCtrl 769 | |
16.1.1. Tworzenie i wstępna konfiguracja obiektów wxRichTextCtrl 770 | |
16.1.1.1. Tworzenie obiektu edytora 770 | |
16.1.1.2. Definiowanie arkusza stylów 772 | |
16.1.1.3. Przygotowanie silnika drukowania i włączenie edytora 774 | |
16.1.2. Zarządzanie stylami 774 | |
16.1.2.1. Okno dialogowe wxRichTextStyleOrganiserDialog 774 | |
16.1.2.2. Kontrolki wyboru stylów 775 | |
16.1.3. Podstawowe metody edycji tekstu 776 | |
16.1.3.1. Podstawowe formatowanie tekstu 776 | |
16.1.3.2. Podstawowe metody formatujące 776 | |
16.1.3.3. Aktualizacja elementów GUI w zależności od formatowania w pozycji kursora 777 | |
16.1.4. Rozszerzone formatowanie tekstu 779 | |
16.1.4.1. Badanie zakresu zaznaczenia tekstu oraz położenia kursora 779 | |
16.1.4.2. Przykład implementacji efektu znakowego: indeks górny i dolny 779 | |
16.1.4.3. Przykład implementacji efektu akapitu – zmienna interlinia 781 | |
16.1.5. Szybka zmiana kroju czcionki (i nie tylko) 781 | |
16.1.6. Listy 782 | |
16.1.6.1. Lista numerowana 783 | |
16.1.6.2. Lista wypunktowana 784 | |
16.1.6.3. Niektóre operacje na listach 785 | |
16.1.7. Wstawianie nowych elementów do tekstu 786 | |
16.1.7.1. Wstawianie znaków specjalnych 786 | |
16.1.7.2. Wstawianie URL 787 | |
16.1.7.3. Wstawianie grafiki z pliku 787 | |
16.1.7.4. Wstawianie tabel 788 | |
16.1.8. Drukowanie z kontrolką wxRichTextCtrl 790 | |
16.1.8.1. Podstawowe metody obsługi drukowania 790 | |
16.1.8.2. Nagłówek i stopka 790 | |
16.1.9. Operacje plikowe 794 | |
16.1.9.1. Rozpoznanie formatu pliku 794 | |
16.1.9.2. Otwieranie dokumentów 794 | |
16.1.9.3. Zapisywanie dokumentów 795 | |
16.1.10. Wnioski 795 | |
16.2. Prezentacja wxRibbonBar 796 | |
16.2.1. Struktura paska wxRibbonBar 797 | |
16.2.2. Tworzenie i inicjowanie paska wxRibbonBar 797 | |
16.2.2.1. Metoda Realize() 798 | |
16.2.3. Dodawanie stron do paska wxRibbonBar 798 | |
16.2.4. Dodawanie paneli wxRibbonPanel do stron paska narzędziowego 798 | |
16.2.5. Klasa wxRibbonButtonBar, czyli pasek przycisków 799 | |
16.2.5.1. Rodzaje przycisków paska wxRibbonBar 799 | |
16.2.5.2. Dodawanie paska wxRibbonButtonBar do panelu 800 | |
16.2.5.3. Dodawanie przycisków do wxRibbonButtonBar i ich obsługa 800 | |
16.2.5.4. Skalowanie paneli i jego wpływ na wyświetlanie przycisków 802 | |
16.2.6. Pasek narzędzi wxRibbonToolBar 803 | |
16.2.6.1. Realizacja paska narzędzi wxRibbonToolBar 803 | |
16.2.6.2. Obsługa przycisków paska narzędzi wxRibbonToolBar 804 | |
16.2.7. Galeria danych wxRibbonGallery 804 | |
16.2.7.1. Tworzenie galerii 804 | |
16.2.7.2. Zapełnianie galerii danymi 805 | |
16.2.7.3. Obsługa galerii wxRibbonGallery 807 | |
16.2.8. Dowolne kontrolki GUI w pasku wxRibbonBar 808 | |
16.2.9. Obsługa przycisku pomocy 808 | |
16.2.10. Zmiana wyglądu paska wxRibbonBar 808 | |
16.2.11. Wnioski i jeszcze więcej opcji... 809 | |
16.3. Prezentacja wxPropertyGrid i wxPropertyGridManager 810 | |
16.3.1. Tworzenie menedżera właściwości 811 | |
16.3.2. Hierarchia siatki i rodzaje właściwości 812 | |
16.3.3. Wskaźnik i nazwa, czyli różne sposoby identyfikacji właściwości 813 | |
16.3.4. Realizacja przykładowego menedżera 814 | |
16.3.5. Pobieranie wartości poszczególnych pól siatki 818 | |
16.3.6. Obsługa zdarzeń i rozpoznawanie modyfikowanych właściwości 819 | |
16.3.7. Wnioski 820 | |
16.4. Inne kontrolki zaawansowane 820 | |
16.4.1. Klasa wxGrid 820 | |
16.4.2. Klasa wxWebView 821 | |
16.4.3. Klasa wxMediaCtrl 823 | |
16.5. Podsumowanie 824 | |
17. Tworzenie własnych generycznych kontrolek GUI 825 | |
17.1. Główne zasady tworzenia własnych kontrolek generycznych 825 | |
17.1.1. Program przykładowy 826 | |
17.2. Skalowany panel z obrazkowym tłem 827 | |
17.2.1. Piszemy klasę panelu 828 | |
17.2.2. Piszemy klasę zdarzenia panelu 829 | |
17.2.3. Metody podstawowe, czyli konstruktor, destruktor, Init() i Create() 830 | |
17.2.4. Metoda rysująca kontrolkę 831 | |
17.2.5. Metody inicjujące rysowanie 832 | |
17.2.6. Pozostałe metody 832 | |
17.2.7. Użycie skalowanego panelu graficznego w kodzie programu 833 | |
17.3. Implementacja przycisku graficznego 834 | |
17.3.1. Koncepcja i realizacja klasy przycisku graficznego 834 | |
17.3.2. Piszemy klasę zdarzeń przycisku 835 | |
17.3.3. Podstawowe funkcje klasy przycisku 836 | |
17.3.4. Metody związane z rysowaniem przycisku 838 | |
17.3.5. Metody obsługi i emisji zdarzeń 839 | |
17.3.6. Użycie przycisku graficznego w aplikacji 840 | |
17.3.6.1. Obsługa zdarzeń przycisku 841 | |
17.3.7. Propozycje udoskonaleń kontrolki 842 | |
17.4. Implementacja graficznego paska postępu 842 | |
17.4.1. Koncepcja kontrolki i opracowanie klasy 842 | |
17.4.2. Konstruktor, destruktor oraz funkcje tworzące i inicjujące pasek 844 | |
17.4.3. Funkcje inicjujące rysowanie kontrolki 845 | |
17.4.4. Funkcja rysująca pasek 846 | |
17.4.5. Stosowanie graficznego paska postępu w aplikacji 848 | |
17.4.6. Propozycje udoskonalenia paska graficznego 849 | |
17.5. Implementacja prostego kalendarza 849 | |
17.5.1. Koncepcja i klasa kalendarza, a także klasy pomocnicze 849 | |
17.5.1.1. Klasa imienin 849 | |
17.5.1.2. Klasa dnia miesiąca 851 | |
17.5.1.3. Okno dialogowe pobierania daty 852 | |
17.5.1.4. Klasa kalendarza 852 | |
17.5.2. Klasa zdarzenia kalendarza 854 | |
17.5.3. Obliczanie danych miesiąca 855 | |
17.5.4. Obliczanie współrzędnych siatki kalendarza 856 | |
17.5.5. Metoda Init() 857 | |
17.5.6. Konstruktor, Create() oraz destruktor 858 | |
17.5.6.1. Metody związane z rysowaniem kalendarza 859 | |
17.5.6.2. Metody inicjujące rysowanie 859 | |
17.5.6.3. Metoda rysująca siatkę kalendarza 859 | |
17.5.6.4. Metoda rysująca dane poszczególnych dni w miesiącu 860 | |
17.5.7. Zmiana daty bieżącej 862 | |
17.5.8. Zdarzenia wewnętrzne i emitowane kalendarza 862 | |
17.5.9. Metody obsługi zdarzeń menu kontekstowego 864 | |
17.5.10. Stosowanie klasy MyCalendar w kodzie programu 865 | |
17.5.11. Propozycje udoskonalenia kalendarza 866 | |
17.5.12. Tworzenie kontrolek natywnych 866 | |
17.6. Podsumowanie 867 | |
18. Techniki i modele realizacji GUI aplikacji 868 | |
18.1. Sizery wxWidgets 868 | |
18.1.1. Klasa wxSizer i ogólne aspekty pracy z sizerami 869 | |
18.1.1.1. Określanie atrybutów elementów sizera 869 | |
18.1.1.2. Zarządzanie elementami w obrębie sizera 870 | |
18.1.1.3. Pobieranie wskaźników elementów przypisanych do sizera 872 | |
18.1.1.4. Wyświetlanie i ukrywanie elementów 872 | |
18.1.1.5. Pobieranie i dostosowanie rozmiaru oraz pozycji sizera i jego elementów 873 | |
18.1.1.6. Pozostałe wspólne metody sizerów, dziedziczone z wxSizer 874 | |
18.1.2. Sizery liniowe i ich stosowanie 874 | |
18.1.2.1. Klasa wxBoxSizer 875 | |
18.1.2.2. Klasa wxStaticBoxSizer 876 | |
18.1.2.3. Klasa wxStdDialogButtonSizer 876 | |
18.1.2.4. Klasa wxWrapSizer 877 | |
18.1.3. Sizery tablicowe i ich stosowanie 877 | |
18.1.3.1. Klasa wxGridSizer 877 | |
18.1.3.2. Klasa wxFlexGridSizer 879 | |
18.1.3.3. Klasa wxGridBagSizer 881 | |
18.1.4. Wnioski 882 | |
18.2. Multi Document Interface (MDI) 882 | |
18.2.1. Ogólne zasady tworzenia interfejsu MDI 883 | |
18.2.2. Automatyczne menu nawigacyjne i menu okien podrzędnych 884 | |
18.2.3. Poznajemy bliżej klasę wxMDIParentFrame 885 | |
18.2.4. MDI a model dokument/widok (wxDocument/wxView) 885 | |
18.2.4.1. Model dokument/widok w wxWidgets 886 | |
18.2.4.2. Klasy MDI dedykowane modelowi dokument/widok 886 | |
18.2.4.3. Program przykładowy i koncepcja formatu danych 886 | |
18.2.4.4. Klasa menedżera dokumentów 887 | |
18.2.4.5. Klasy dokumentu oraz danych 887 | |
18.2.4.6. Klasy widoku oraz płótna 889 | |
18.2.4.7. Wyświetlenie ramek MDI w modelu dokument/widok w programie 891 | |
18.2.5. Wnioski 893 | |
18.3. Tworzenie GUI aplikacji przy użyciu wxAUI 893 | |
18.3.1. Przedstawienie elementów wxAUI 894 | |
18.3.1.1. Menedżer ramek wxAuiManager 894 | |
18.3.1.2. Właściwości ramek dokowanych i pływających, czyli klasa wxAuiPaneInfo 896 | |
18.3.1.3. Kontener wxAuiNotebook 899 | |
18.3.1.4. Paski narzędzi wxAuiToolBar 901 | |
18.3.2. Warstwy, wiersze i pozycje, czyli zrozumieć wxAUI 902 | |
18.3.3. wxAUI w praktyce 903 | |
18.3.3.1. Menedżer 903 | |
18.3.3.2. Ramka 1 – edytor (kontener wxAuiNotebook) 903 | |
18.3.3.3. Ramka 2 – okno konsoli (bezpośrednie dodanie kontrolki) 904 | |
18.3.3.4. Ramki 3 i 4 – dodanie nowej warstwy GUI 904 | |
18.3.3.5. Ramka 5 – kontener z sizerem 905 | |
18.3.3.6. Paski narzędzi 906 | |
18.3.3.7. Modyfikowanie wyglądu elementów dokowanych 907 | |
18.3.3.8. To chyba jeszcze nie wszystko! 907 | |
18.3.3.9. Co z tego wyszło? 907 | |
18.3.4. Wnioski 908 | |
18.4. Krótko o pozostałych technikach tworzenia GUI 909 | |
18.4.1. Single Document Interface (SDI) 909 | |
18.4.2. wxXRC i zasoby XML 909 | |
18.5. Słowo o niektórych narzędziach WYSIWYG dedykowanych pracy z wxWidgets 911 | |
18.5.1. wxFormBuilder 911 | |
18.5.2. wxSmith 912 | |
18.5.3. Czy używać narzędzi WYSIWYG? 913 | |
18.6. Podsumowanie 913 | |
19. Drukowanie w wxWidgets od kuchni 914 | |
19.1. Ogólnie o klasie wxPrintout 914 | |
19.1.1. Tworzenie prostego silnika drukowania 915 | |
19.1.2. Kustomizacja własnego silnika drukowania 917 | |
19.1.3. Problemy skalowania wydruku 918 | |
19.1.4. Źródła danych i kilka silników drukowania w jednym programie 919 | |
19.2. Konfiguracja wydruku 920 | |
19.2.1. Klasa wxPrintData 920 | |
19.2.2. Klasa wxPrintDialogData 921 | |
19.2.3. Klasa wxPageSetupDialogData 921 | |
19.3. Klasy wxRichTextBuffer i wxRichTextPrinting oraz drukowanie formatowanego tekstu na skróty 922 | |
19.4. Podsumowanie 923 | |
20. Krótki rozdział o technikach przechowywania konfiguracji programu 924 | |
20.1. Konfiguracja za pomocą klas pochodnych z wxConfigBase 924 | |
20.1.1. Ogólna koncepcja konfiguracji wxConfigBase 924 | |
20.1.2. Klasa wxConfigBase 925 | |
20.1.2.1. Zarządzanie wpisami konfiguracji 925 | |
20.1.2.2. Odczyt i zapis danych konfiguracyjnych 925 | |
20.1.2.3. Pozostałe ważniejsze metody wxConfigBase 926 | |
20.1.3. Plik konfiguracyjny wxFileConfig 926 | |
20.1.3.1. Struktura pliku konfiguracyjnego 927 | |
20.1.3.2. Plik konfiguracyjny w praktyce 928 | |
20.1.4. Konfiguracja w rejestrze systemu, czyli wxRegConfig (MS Windows) 929 | |
20.1.4.1. Konfiguracja wxRegConfig w praktyce 929 | |
20.1.5. Konfiguracja domyślna a platforma systemowa 930 | |
20.2. Zapamiętywanie stanów GUI za pomocą wxPersistanceManager 931 | |
20.3. Podsumowanie i refleksja na temat innych możliwości zapamiętywania konfiguracji programu 931 | |
21. wxWidgets i programowanie współbieżne 933 | |
21.1. Aplikacja wielowątkowa i klasa wxThread 933 | |
21.1.1. Klasa wxThread 934 | |
21.1.1.1. Wybrane metody statyczne klasy wxThread 935 | |
21.1.2. Szkielet aplikacji wielowątkowej 935 | |
21.1.3. Tworzenie klasy wątku 937 | |
21.2. Poradnik dla hazardzistów, czyli zabezpieczanie aplikacji przed wyścigiem do danych 939 | |
21.2.1. Kontrola liczby wątków, czyli klasa wxSemaphore 939 | |
21.2.1.1. Semafor wxSemaphore w praktyce 940 | |
21.2.2. Blokowanie dostępu do zasobów, czyli co nieco o tzw. muteksach 941 | |
21.2.2.1. Korzystanie z wzajemnych wykluczeń w aplikacji 942 | |
21.2.2.2. Dostęp wątków do biblioteki GUI 942 | |
21.2.3. Sekcja krytyczna wxCriticalSection 943 | |
21.3. Wątki i ich zdarzenia 944 | |
21.4. Podsumowanie 946 | |
22. wxWidgets i konsola 947 | |
22.1. Konsolowe aplikacje wxWidgets? 947 | |
22.1.1. Dostosowanie projektu i makefile 947 | |
22.1.1.1. MS Windows i Visual Studio 947 | |
22.1.1.2. Linux i makefile 948 | |
22.1.2. Szkielet aplikacji konsolowej wxWidgets 948 | |
22.2. Obsługa parametrów aplikacji z linii komend 949 | |
22.2.1. Tworzenie list parametrów 949 | |
22.2.1.1. Sposób 1 – definiowanie parametrów za pomocą metod klasy wxCmdLineParser 950 | |
22.2.1.2. Sposób 2 – lista parametrów w postaci tablicy wxCmdLineEntryDesc 952 | |
22.2.1.3. Parsowanie i przetwarzanie parametrów 953 | |
22.2.1.4. Odczyt i wykorzystanie parametrów w aplikacji 953 | |
22.2.1.5. Własny tekst w wiadomości pomocy 954 | |
22.3. Zarządzanie procesami z poziomu aplikacji (wx/utils.h) 955 | |
22.4. Strumień wyjściowy C++ w kontrolce tekstowej 956 | |
22.5. Sprawdzanie liczby instancji programu 957 | |
22.6. Podsumowanie 958 | |
23. Co jest grane? O logach w wxWidgets 959 | |
23.1. Klasa wxLog i ogólne informacje o wyświetlaniu logów 959 | |
23.1.1. Ustawienia ogólne systemu logowania 959 | |
23.1.2. Poziomy logowania i odpowiadające im funkcje piszące 960 | |
23.1.3. Wybór komponentów logujących 961 | |
23.2. Wyjście logu i logowanie w praktyce 962 | |
23.2.1. Charakterystyka klas wyjścia logu 962 | |
23.2.2. Logowanie w praktyce 962 | |
23.2.2.1. Tworzenie obiektów klas wyjścia logu 963 | |
23.2.2.2. Zmiana wyjścia logu 963 | |
23.2.2.3. Sterowanie pracą wyjścia logu 964 | |
23.3. Własny format logu 964 | |
23.4. Podsumowanie 965 | |
24. Nie tylko po polsku, czyli internacjonalizacja aplikacji 966 | |
24.1. Makro _() 966 | |
24.2. Tłumaczenia aplikacji 966 | |
24.2.1. Warsztat tłumacza, czyli oprogramowanie poEdit 967 | |
24.2.2. Przygotowanie tłumaczeń programu z narzędziem poEdit 967 | |
24.2.3. Samodzielne przygotowanie plików tłumaczeń 969 | |
24.3. Implementacja kilku języków w aplikacji 970 | |
24.3.1. Klasa wxLocale i elementy internacjonalizacji 971 | |
24.3.1.1. Konstruowanie i inicjowanie obiektów wxLocale 971 | |
24.3.1.2. Lokalizacja plików tłumaczeń 971 | |
24.3.1.3. Analizowanie danych wczytanego języka 972 | |
24.3.1.4. Ważniejsze statyczne metody klasy wxLocale 973 | |
24.3.2. Internacjonalizacja w praktyce, czyli prosty przykład wykorzystania wxLocale 973 | |
24.4. Regionalizacja aplikacji 975 | |
24.5. Podsumowanie 976 | |
25. Programowanie sieciowe z wxWidgets 977 | |
25.1. Klasa wxSocketBase i komunikacja serwer/klient 977 | |
25.1.1. Klasa wxSocketBase 977 | |
25.1.1.1. Ważniejsze metody klasy wxSocketBase 978 | |
25.1.1.2. Zdarzenia wxSocketBase i ich obsługa 981 | |
25.1.2. Piszemy prosty serwer, czyli korzystanie z wxSocketServer 982 | |
25.1.2.1. Przygotowanie niektórych elementów aplikacji 982 | |
25.1.2.2. Tworzenie serwera 983 | |
25.1.2.3. Klasa wątku połączenia 984 | |
25.1.2.4. Tworzenie nowych wątków połączeń 987 | |
25.1.3. Piszemy prostego klienta, czyli korzystanie z wxSocketClient 988 | |
25.1.3.1. Przygotowanie i koncepcja aplikacji 988 | |
25.1.3.2. Tworzenie i usuwanie obiektu klienta 988 | |
25.1.3.3. Inicjowanie połączenia z serwerem 989 | |
25.1.3.4. Nawiązanie połączenia i obsługa zdarzeń gniazda 990 | |
25.1.3.5. Wysyłanie danych na serwer 991 | |
25.1.3.6. Rozłączanie klienta 991 | |
25.1.4. Testowanie komunikacji klient/serwer za pomocą wykonanych aplikacji 992 | |
25.1.5. Programowanie z protokołem UDP 992 | |
25.2. Klasa wxProtocol i obsługa podstawowych protokołów sieciowych 992 | |
25.2.1. Klasa protokołu wxProtocol 993 | |
25.2.2. Obsługa protokołu HTTP (wxHTTP) 993 | |
25.2.2.1. Ważniejsze metody klasy wxHTTP 994 | |
25.2.2.2. Prosty przykład – pobieranie źródła strony do bufora lokalnego 994 | |
25.2.3. Obsługa protokołu FTP w praktyce, czyli piszemy własnego klienta (wxFTP) 995 | |
25.2.3.1. Przygotowanie aplikacji 995 | |
25.2.3.2. Dodajemy obiekt wxFTP 997 | |
25.2.3.3. Piszemy funkcje narzędziowe 998 | |
25.2.3.4. Łączenie z serwerem FTP 999 | |
25.2.3.5. Zamykanie połączenia 1001 | |
25.2.3.6. Zmiana aktywnego katalogu FTP 1001 | |
25.2.3.7. Niektóre operacje na zdalnym systemie plików 1002 | |
25.2.3.8. Klasa wątku pobierania i pobieranie pliku z FTP 1003 | |
25.2.3.9. Klasa wątku wysyłania i wysyłanie plików na FTP 1005 | |
25.2.3.10. Testowanie klienta FTP 1007 | |
25.3. Podsumowanie 1007 | |
26. wxWidgets i nowoczesny OpenGL 1008 | |
26.1. Klasa wxGLCanvas 1009 | |
26.2. Klasa wxGLContext 1011 | |
26.3. Inicjowanie obsługi nowoczesnego OpenGL w aplikacji wxWidgets 1012 | |
26.4. Przykładowy program i renderowanie sceny 1013 | |
26.5. Podsumowanie 1015 | |
27. Zagadnienia programowania bazodanowego z wxWidgets 3+ 1016 | |
27.1. Przykładowy warsztat 1016 | |
27.1.1. Biblioteka SOCI 1016 | |
27.1.1.1. Konfiguracja projektu SOCI w CMake 1017 | |
27.1.2. Serwer Firebird 1017 | |
27.1.3. Narzędzie FlameRobin 1017 | |
27.2. Szybkie wprowadzenie do relacyjnych baz danych i SQL 1018 | |
27.2.1. Relacyjne bazy danych 1018 | |
27.2.2. Podstawy języka SQL 1019 | |
27.2.2.1. Grupa instrukcji Data Definition Language (DDL) 1019 | |
27.2.2.2. Grupa instrukcji Data Manipulation Language (DML) 1020 | |
27.2.2.3. Data Query Language (DQL) i instrukcja SELECT 1021 | |
27.2.2.4. Grupa instrukcji Data Control Language (DCL) 1022 | |
27.2.2.5. Dla ambitnych, czyli automatyczne nadawanie identyfikatorów 1022 | |
27.3. Prosty przykład, czyli bazy danych i wxWidgets 3+ w praktyce 1023 | |
27.3.1. Przygotowanie projektu 1023 | |
27.3.2. Tworzenie nowej bazy danych za pomocą narzędzia FlameRobin 1024 | |
27.3.3. Zasady kreowania podstawowych zapytań do bazy danych za pomocą SOCI 1026 | |
27.3.4. Przykładowy program 1027 | |
27.3.4.1. Ogólna koncepcja oraz elementy GUI aplikacji ‘Sklep’ 1027 | |
27.3.4.2. Otwieranie i zamykanie sesji z bazą danych 1028 | |
27.3.4.3. Pobieranie i wyświetlanie informacji statystycznych i list zamówień 1030 | |
27.3.4.4. Dodawanie towarów do sklepu 1032 | |
27.3.4.5. Dodawanie klientów sklepu 1034 | |
27.3.4.6. Tworzenie i zamykanie zamówień 1036 | |
27.3.4.7. Wysyłanie własnych zapytań do bazy danych 1040 | |
27.4. Podsumowanie 1040 | |
28. Bonus na koniec, czyli jak wykonać ekran startowy 1042 | |
28.1. Ekran startowy wxSplashScreen 1042 | |
28.2. Wzbogacony ekran startowy 1043 | |
28.3. To wciąż za mało! 1046 | |
Zakończenie 1047 | |
Dodatek A Krótki leksykon standardowych elementów GUI wxWidgets 1049 | |
Kontrolki statyczne 1049 | |
Kontrolki dynamiczne 1053 | |
Kontenery GUI 1080 | |
Dodatek B Niektóre ważniejsze rozszerzenia wxWidgets 1087 | |
wxPdfDocument 1087 | |
wxMIDI 1087 | |
wxChart 1088 | |
wxThumbnail 1089 | |
Dodatek C Licencje 1090 | |
wxWindows Library Licence, Version 3.1 1090 | |
GNU Library General Public License 1091 | |
Indeks 1097 | |