"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