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