Post on 02-Dec-2014
description
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
PRZYK£ADOWY ROZDZIA£PRZYK£ADOWY ROZDZIA£
IDZ DOIDZ DO
ZAMÓW DRUKOWANY KATALOGZAMÓW DRUKOWANY KATALOG
KATALOG KSI¥¯EKKATALOG KSI¥¯EK
TWÓJ KOSZYKTWÓJ KOSZYK
CENNIK I INFORMACJECENNIK I INFORMACJE
ZAMÓW INFORMACJEO NOWO�CIACH
ZAMÓW INFORMACJEO NOWO�CIACH
ZAMÓW CENNIKZAMÓW CENNIK
CZYTELNIACZYTELNIA
FRAGMENTY KSI¥¯EK ONLINEFRAGMENTY KSI¥¯EK ONLINE
SPIS TRE�CISPIS TRE�CI
DODAJ DO KOSZYKADODAJ DO KOSZYKA
KATALOG ONLINEKATALOG ONLINE
MySQL. Budowanieinterfejsów u¿ytkownika.Vademecum profesjonalistyAutor: Matthew Stucky
T³umaczenie: Tomasz Miszkiel
ISBN: 83-7197-885-5
Tytu³ orygina³u: MySQL Building User Interfaces
Format: B5, stron: 582
Przyk³ady na ftp: 1098 kB
MySQL jest szybkim, przeno�ny i — co najwa¿niejsze — darmowym systemem
bazodanowym, który zdoby³ ogromn¹ popularno�æ w zastosowaniach internetowych.
Ksi¹¿ka „MySQL. Budowanie interfejsów u¿ytkownika.” poka¿e Ci jak u¿ywaæ tej bazy
tak¿e poza Internetem. Nauczysz siê z niej budowania atrakcyjnych interfejsów
u¿ytkownika wspó³pracuj¹cych z t¹ baz¹. W tym celu wykorzystana zostanie
biblioteka GTK+.
Ksi¹¿ka jest przeznaczona g³ównie dla programistów, którzy rozwa¿aj¹ wykorzystanie
Linuksa w tworzonych przez siebie rozwi¹zaniach, dla osób posiadaj¹cych pewne
do�wiadczenie w tworzeniu systemów opartych na architekturze klient-serwer (np. za
pomoc¹ Visual Basica i SQL Server). Aby w pe³ni skorzystaæ z informacji zawartych
w ksi¹¿ce, wystarczy znaæ jêzyk C i podstawy programowania baz danych.
• Poznasz mocne strony i zalety bazy MySQL
• Nauczysz siê tworzyæ programy w systemie Linuks, a nastêpnie, korzystaj¹c z ich
kodu �ród³owego, kompilowaæ je w systemie Windows.
• Dowiesz siê, w jaki sposób mo¿na instalowaæ programy korzystaj¹c ze skryptów
lub pakietów RPM (RedHat Pakage Manager).
• Nauczysz siê korzystaæ z interfejsu jêzyka C dla MySQL w aplikacjach, w których
u¿yto bibliotekê GTK+.
• Poznasz sposoby wy�wietlania danych pochodz¹cych z MySQL
w obiektach GTK+.
• Bêdziesz w stanie utworzyæ (w jêzyku C) aplikacje, które wygl¹dem
i zachowaniem przypominaj¹ programy Windowsowe
• Utworzysz aplikacje, które bêd¹ dynamicznie tworzyæ graficzny interfejs
u¿ytkownika, dziêki czemu bêdziesz móg³ zmieniæ wygl¹d interfejsu bez
konieczno�ci rekompilacji kodu �ród³owego
• Prze�ledzisz krok po kroku proces powstawania kompletnej aplikacji korzystaj¹cej
z MySQL.
����������������� �
��� ����� ��� ��� ��� � ��
���������� ��Dla kogo przeznaczona jest ta książka? ........................................................................ 12Układ książki ............................................................................................................. 12Konwencje przyjęte w książce..................................................................................... 13
�������� ���� ��������� �� �������������������������������������������������������
����������� ���������������� ������!�����"��#����#!��� ���������$� �%Dlaczego właśnie MySQL?......................................................................................... 17Licencje .................................................................................................................... 18Porównanie typów danych MySQLz typami dostępnymi w Access 2000 i SQL Server 7 .................................................. 19
Czego brakuje w MySQL?.......................................................................................... 21MySQL, MYSQL i mysql — trzy podobne słowa, trzy różne znaczenia.......................... 27Tylko dla użytkowników programu Access: demony i usługi.......................................... 29Skąd pobrać pakiet instalacyjny MySQL?..................................................................... 30Decyzja dotycząca metody instalacji — wszystkie za i przeciw ...................................... 31Pliki potrzebne do instalacji RPM................................................................................ 33Instalacja ................................................................................................................... 34Pierwsze spotkanie z MySQL: tworzenie, wykorzystywanie i usuwanie bazy danych....... 38Niestandardowe, unikatowe konstrukcje SQL wykorzystywane w MySQL(rozszerzenie standardu ANSI SQL92) ...................................................................... 40
Programy użytkowe w MySQL ................................................................................... 45Interfejs API języka C dla MySQL .............................................................................. 53
���������&� '()*��������+���� �!��#���� ��,- � ����.� ����/� � 0�Dlaczego powinniśmy korzystać z GTK+?................................................................... 60Gdzie zdobyć GTK+ i jak dokonać jego instalacji?........................................................ 61Licencje .................................................................................................................... 61Ogólny opis biblioteki GTK+...................................................................................... 63Pojemniki GTK+ jako odpowiedniki kontrolek zmieniających rozmiary.......................... 71Podstawowe widgety w programie ............................................................................... 73
���������1� ��2 ,����+�!��'()* �0Widget GtkCombo ..................................................................................................... 95GtkProgressBar i GtkStatusBar ................................................................................... 99GtkFrame i GtkAspectFrame..................................................................................... 106Okna dialogowe i informacyjne, czyli obiekty GtkDialog, GtkFileSelection,GtkColorSelectionDialog i GtkFontSelectionDialog ................................................. 110
Systemy menu: obiekty menu, „fabryka elementów” i elementy menu kontekstowego.... 117
6 MySQL. Budowanie interfejsów użytkownika. Vademecum profesjonalisty
���������3� 4����� ������5�#���'()* �&%GtkTable ................................................................................................................. 127GtkTree i GtkCTree ................................................................................................. 132GtkFixed ................................................................................................................. 137GtkLayout ............................................................................................................... 140GtkScrolledWindow................................................................................................. 142GtkNotebook........................................................................................................... 144GtkPaned ................................................................................................................ 147
���������0� '�����������+���� �!��#���� ��,- � ����.� ����/� � �0�Środowisko Glade .................................................................................................... 151Pierwsze spotkanie z Glade: aplikacja WitajSwiecie .................................................... 153Szczegółowa analiza wybranych plików projektu WitajSwiecie.................................... 162Glade i widgety........................................................................................................ 170Tworzenie projektu: trzeba poznać hierarchię obiektów............................................... 173Komunikacja pomiędzy oknami w projekcie utworzonym w Glade............................... 174Zmienne o zasięgu globalnym a poprawne pisanie programów ..................................... 180
��������� �������� ��������� ������������������������������������������������������ ���
���������6� 7��,#����������� �����������������#� ,������,2 ������!����� �80Projekt aplikacji ....................................................................................................... 186Interfejs użytkownika ............................................................................................... 189Tworzenie bazy danych............................................................................................ 193Wdrożenie aplikacji.................................................................................................. 195Modernizacja aplikacji.............................................................................................. 199
���������%� 9������������#� ,������5 ��+�����!��:������;�< &��Tworzenie interfejsu użytkownika za pomocą Glade ................................................... 202Funkcje aplikacji ...................................................................................................... 214Połączenie interfejsu i funkcji wykonujących poszczególne zadania programu............... 248Kompilacja programu ............................................................................................... 259Uwagi dotyczące utworzonego programu ................................................................... 259
���������8� ����#� ,������� �����������,��=����,#����������� &61Przedstawienie problemu .......................................................................................... 264Interfejs użytkownika ............................................................................................... 267Baza danych, przygotowanie autoryzacji .................................................................... 271Tworzenie bazy danych............................................................................................ 273
����������� )�� ���# ,������#� ,��7�����, &8�Budowanie interfejsu użytkownika za pomocą Glade .................................................. 281Kontrola wyświetlanych danych ................................................................................ 286Funkcje tworzonej aplikacji....................................................................................... 289Powiązanie funkcji „narzędziowych” z obiektami interfejsu użytkownika— funkcje zwrotne w pliku callbacks.c.................................................................... 318
Uwagi dotyczące utworzonego programu ................................................................... 325
������������ <� ���� ,������#� ,������� �����������,� 1&%Kompilacja z wiersza poleceń.................................................................................... 327Korzyści płynące z zastosowania Make...................................................................... 328Instalowanie aplikacji ............................................................................................... 330Kompilacja programu dla Win32 za pomocą MS Visual C++....................................... 341
Spis treści 7
������������ 7��,#������#� ,��������� 10�Definicja problemu................................................................................................... 351Interfejs użytkownika ............................................................................................... 352Baza danych, uprawnienia użytkowników .................................................................. 356Tworzenie bazy danych............................................................................................ 357
����������&� )�� ���# ,������#� ,��������� 16�Opis problemu ......................................................................................................... 361Aplikacja sterująca: Raporty...................................................................................... 361Raport 1. Tabela....................................................................................................... 371Raport 2. Wykres kołowy ......................................................................................... 377Raport 3. Wykres liniowo-kolumnowy....................................................................... 387Raport 4. Wykres punktowy...................................................................................... 393
����������1� )������ ,������ ���� ,������#� ,��������� 3�1Kompilacja i dystrybucja w formie pliku RPM ........................................................... 403Kompilacja programów za pomocą MinGW dla Win32 ............................................... 408
���������� ���������������������������������������������������������������������������������� ���
����������3� >����� ���������������?, ���"��#����#��������� -�@�� 3�%Jeszcze raz program „Witaj Swiecie” ......................................................................... 417Komunikacja pomiędzy oknami................................................................................. 422Dokonywanie zmian w aplikacji bez konieczności ponownej kompilacji ....................... 430
���!�� ���������������������������������������������������������������������������������������������� ���
>����#��� 7��#����+������������'����=�����#� ,�������;�< 310interface.c................................................................................................................ 435sesi.glade................................................................................................................. 460
>����#�/� 7��#����+������������'����=�����#� ,��7�����, 3��interface.c................................................................................................................ 499prowizje.glade.......................................................................................................... 516
>����#�A� 7��#����+������������'����=�����#� ,��������� 03%Pliki dla programu głównego..................................................................................... 547Pliki dla programu tworzącego raport w formie tabeli .................................................. 551Pliki dla programu tworzącego wykres kołowy ........................................................... 556Pliki dla programu tworzącego raport w postaci wykresu liniowo-kolumnowego ........... 559Pliki dla programu generującego raport w postaci wykresu punktowego........................ 562
�#������� 0%�
Rozdział 4.
������������
����� ����W tym rozdziale opisano zaawansowane obiekty GTK+, służące do rozmieszczania i pre-
zentacji innych elementów. Szczegółowo opisano tu następujące widgety:
� ��������,
� ������ i ������,
� ����� ��,
� ���������,
� ����������������,
� �����������,
� ��������.
��������
Obiekt �������� działa na zasadzie siatki, w której można umieszczać inne obiekty. Moż-
na powiedzieć, że �������� jest połączeniem dwóch prostokątnych pojemników (pozio-
mego i pionowego). Na rysunku 4.1 przedstawiono obiekt ��������, który utworzymy
w przykładowym programie (listing 4.1). W �������� można umieścić obiekt w kilku
komórkach (poziomo lub pionowo).
Przykładowy program przedstawia działanie obiektu ��������. Pokazano tu również
nowy trend tworzenia „programów w akcji”, gdzie w odpowiedzi na wystąpienie zda-
rzeń tworzy się (lub niszczy) określone widgety. Należy pamiętać, że jeśli będziemy ko-
rzystać z tej metody w tworzonych aplikacjach, to jednocześnie będziemy musieli zna-
leźć sposób na przechowanie danych, które mają być przekazane tworzonym na nowo
obiektom.
Rysunek 4.1 przedstawia okno utworzonej aplikacji, której kod źródłowy znajduje się
w listingu 4.1.
128 Część I � Szybkie wprowadzenie
���������Uruchomiony
przykładowy program
� �� �����Prezentacja obiektu GtkTable
���������� ��� ���
�� ������������������� �����������
���������� ��!��� �������������������"�� #�����"$� ������������"��!��������������%��"�����"$���������$� �����!&�����"'��������$� �����!��� ����%���
�� �����������$�$��� �����������'�$��� �����������(�$��� �����������$�'��� �����������$�)��� �����������)�'��� �����������'�)��� �����������)�)��� ��������� �$�
*���������!�����+,�*����� ���������������+,�*����������"������+,�*�������$�$����� ��+,�*�������'�$����� ��+,�*�������(�$����� ��+,�*�������$�'����� ��+,�*�������$�)����� ��+,�*�������)�'����� ��+,�*�������'�)����� ��+,�*�������)�)����� ��+,�
��������+��������&���������*-.,/
�� �����+0����&0���*,�
���������1�� �"����"���"+�#2��3456��#6�78987,�
Rozdział 4. � Zaawansowane obiekty GTK+ 129
�� �"����"����������+�#2��3456�+���������,&:���������%�������!���� ��":,�
�� ���������������+�#2�6;<8=#+���������,&:������!:&�#2�>3�4?7�@A4=+������!�����,&4A77,�
�� ���������������+,�
��3���%������%� ��!��� �"���!����"����������!���!�����> ���!����!����� ����������������������+,������������ �%��������"������+,&"��������������%�������������� �%��� ����������������������+,���
�� ����������������������+�#2�#?;78+���,&����$�$&B&$&B&$,��� ����������������������+�#2�#?;78+���,&����'�$&B&$&$&),��� ����������������������+�#2�#?;78+���,&����(�$&B&(&)&(,��� ����������������������+�#2�#?;78+���,&����$�'&$&'&B&',��� ����������������������+�#2�#?;78+���,&����$�)&'&)&B&$,��� ����������������������+�#2�#?;78+���,&����)�'&$&'&'&),��� ����������������������+�#2�#?;78+���,&����)�)&'&)&'&),��� ����������������������+�#2�#?;78+���,&����'�)&'&(&$&',�
�� �$1�� ����� ����������"�"���������+:���!��� "!����:,�
�� ����������������������+�#2�#?;78+���,&�� �$&)&(&B&$,�
�� ��������������+�#2�=64#?348C+���������,&���,�
�� �"���������"����+���������,��� �����+,�������B�
D
*���������!�����+,/�� ������E���+,�D
*����������"������+�����6�#364>&������?=234�,/�� �������������+�#2�#?;78+���,&����$�$&B&$&B&$&�6�#364>&�6�#364>&��?=234�&��?=234�,��� �������������+�#2�#?;78+���,&����'�$&B&$&$&)&�6�#364>&�6�#364>&��?=234�&��?=234�,��� �������������+�#2�#?;78+���,&����(�$&B&(&)&(&�6�#364>&�6�#364>&��?=234�&��?=234�,��� �������������+�#2�#?;78+���,&����$�'&$&'&B&'&�6�#364>&�6�#364>&��?=234�&��?=234�,��� �������������+�#2�#?;78+���,&����$�)&'&)&B&$&�6�#364>&�6�#364>&��?=234�&��?=234�,��� �������������+�#2�#?;78+���,&����)�'&$&'&'&)&�6�#364>&�6�#364>&��?=234�&��?=234�,��� �������������+�#2�#?;78+���,&����)�)&'&)&'&)&�6�#364>&�6�#364>&��?=234�&��?=234�,�
130 Część I � Szybkie wprowadzenie
�� �������������+�#2�#?;78+���,&����'�)&'&(&$&'&�6�#364>&�6�#364>&��?=234�&��?=234�,��� �������������+�#2�#?;78+���,&�� �$&)&(&B&$&�6�#364>&�6�#364>&��?=234�&��?=234�,�D
*����� ���������������+,/���1�� ���������"+(&(&#CA8,�
����������! �"!����%��� �%���F����!& �����!&����������%���������������
����$�$1�� ����������"�"���������+:�! ��������G���� ����:,��� ���������������+�#2�6;<8=#+����$�$,&:���� ��:&�#2�>3�4?7�@A4=+����$�$����� ��,&4A77,�����'�$1�� ����������"�"���������+:A���"H�� �%�H�@377:,��� ���������������+�#2�6;<8=#+����'�$,&:���� ��:&�#2�>3�4?7�@A4=+����'�$����� ��,&4A77,�����(�$1�� ����������"�"���������+:�!������ �%�>IC342:,��� ���������������+�#2�6;<8=#+����(�$,&:���� ��:&�#2�>3�4?7�@A4=+����(�$����� ��,&4A77,�����$�'1�� ����������"�"���������+:�!�����H�6 �%�H�8J�?45:,��� ���������������+�#2�6;<8=#+����$�',&:���� ��:&�#2�>3�4?7�@A4=+����$�'����� ��,&4A77,�����$�)1�� ����������"�"���������+:�!�����H�6 �%�H�@377H��H�>IC342:,��� ���������������+�#2�6;<8=#+����$�),&:���� ��:&�#2�>3�4?7�@A4=+����$�)����� ��,&4A77,�����)�'1�� ����������"�"���������+:�!�����H�6 �%�H�>IC342H��H�8J�?45:,��� ���������������+�#2�6;<8=#+����)�',&:���� ��:&�#2�>3�4?7�@A4=+����)�'����� ��,&4A77,�����)�)1�� ����������"�"���������+:�!�����H�� �%�H�@377H��H�8J�?45:,��� ���������������+�#2�6;<8=#+����)�),&:���� ��:&�#2�>3�4?7�@A4=+����)�)����� ��,&4A77,�����'�)1�� ����������"�"���������+:�!������ �%�H�@377&8J�?45�>IC342:,��� ���������������+�#2�6;<8=#+����'�),&:���� ��:&�#2�>3�4?7�@A4=+����'�)����� ��,&4A77,��� �$1�� ����� ����������"�"���������+:���!��� "!����:,�D
Rozdział 4. � Zaawansowane obiekty GTK+ 131
*�������$�$����� ��+,/��#�"! ���!����! ���� ���"��!��� �%��� �"������������!��������������� ��!��� � ������!� �"�� ��������!�������!���"���!�����"����������������� ������K����!�� ���� ��&������ ��� #������� ��������� �%�������������4�"����!�!�� ������� �%���������&������!��� "! ���!��������"���!� ������ ��!"���� �����!����� �%���� ������ ��!��� ��%��� ������������!�&���%����������������"! ����!�����!������������������� ��""�������%���&�������!�!������������� �"���������������!��L�����!���������� ���� ����������
�� �"������������!+���,��� ���������������+,��������"������+B&G,��� ��������������+�#2�=64#?348C+���������,&���,��� �"���������"����+���������,�D
*�������'�$����� ��+,/�� �"������������!+���,��� ���������������+,��������"������+�#2�@377&B,��� ��������������+�#2�=64#?348C+���������,&���,��� �"���������"����+���������,�D
*�������(�$����� ��+,/�� �"������������!+���,��� ���������������+,��������"������+�#2�>IC342&B,��� ��������������+�#2�=64#?348C+���������,&���,��� �"���������"����+���������,�D
*�������$�'����� ��+,/�� �"������������!+���,��� ���������������+,��������"������+�#2�8J�?45&B,��� ��������������+�#2�=64#?348C+���������,&���,��� �"���������"����+���������,�D
*�������$�)����� ��+,/�� �"������������!+���,��� ���������������+,��������"������+�#2�@377M�#2�>IC342&B,��� ��������������+�#2�=64#?348C+���������,&���,�
132 Część I � Szybkie wprowadzenie
�� �"���������"����+���������,�D
*�������)�'����� ��+,/�� �"������������!+���,��� ���������������+,��������"������+�#2�>IC342M�#2�8J�?45&B,��� ��������������+�#2�=64#?348C+���������,&���,��� �"���������"����+���������,�D
*�������)�)����� ��+,/�� �"������������!+���,��� ���������������+,��������"������+�#2�@377M�#2�8J�?45&B,��� ��������������+�#2�=64#?348C+���������,&���,��� �"���������"����+���������,�D
*�������'�)����� ��+,/�� �"������������!+���,��� ���������������+,��������"������+�#2�>IC342M�#2�@377M�#2�8J�?45&B,��� ��������������+�#2�=64#?348C+���������,&���,��� �"���������"����+���������,�D
��������������
Obiekty ������ i ������ służą do prezentacji drzewa elementów. Litera „C” w na-
zwie ������ oznacza „kolumny” (C pochodzi od angielskiego słowa Columns); moż-
na powiedzieć, że ������ jest skrzyżowaniem dwóch, znanych z VB kontrolek: kon-
trolki prezentującej dane i kontrolki drzewa (rysunek 4.2, listing 4.2). W GTK+ obiekt
���������� jest obiektem nadrzędnym dla �������, ������� i ������. ������ po-
chodzi od �������, ale podobny związek nie istnieje pomiędzy ������ i �������.
���������Drzewa elementów,czyli GtkTree
i GtkCTree
W tym programie porównano cechy i wygląd widgetów ������ (po lewej stronie okna)
i ������ (po prawej stronie okna). Główną różnicą pomiędzy tymi obiektami jest fakt,
że ������ akceptuje tylko mapy pikselowe i tekst, a w ������ można umieścić dowol-
ne widgety potomne.
Rozdział 4. � Zaawansowane obiekty GTK+ 133
� �� �����GtkTree i GtkCTree
���������� ��� ���
�� ������������������� ����������������&��������������� �������������������'��� �������������������)��� ���������������"�������
*���������!�����+,�*��������!�����������!������� ��+,�*��������!�����N ���������� ��+,�
��������+��������&���������*-.,/
�� ����������N�����&�*��N�����&�*��N��������� ��������*�$�����$&��*�$�����'��� �������"�������������� �������������"�����&��������"�����&����� ���N�"�������� �����������'�����$&�����'�����$�����$��� �����������������&������������&����� ���N�������� ������������!�����������!��&������!�����N ������
�� =#���4��������������$��� =#���4��������������'��� =#���4��������������)�
��������%" �����!�����" � �����"���� ���=������>���� ��� �����!%���� ������� ������������������"!������" �&���� ��������&%� ����"�������
�������������������-'.1/:���!�%�:&:3�������%�:D�
����������$�����-'.1/:����$:&:����:D�����������'�����-'.1/:����':&:#�� ������"���! ��������:D�����������)�����-'.1/:���"����$:&:���"�����:D�
�� �����+0����&0���*,�
���������1�� �"����"���"+�#2��3456��#6�78987,�
�� �"����"����������+�#2��3456�+���������,&:���������%�"������"����":,�
�� ���������������+�#2�6;<8=#+���������,&:������!:&�#2�>3�4?7�@A4=+������!�����,&4A77,�
���N�����1�� ����N���"+#CA8&B,�*��N�����1�� �*��N���"+#CA8&B,�*��N������1�� �*��N���"+@?7>8&B,�
�����"��������� ������!�� #������ =#����%���+�� ����&%� �����!�� 7������ =7���,�� �&����� #���� �� ��%�"��!�� ��"�����!&
134 Część I � Szybkie wprowadzenie
���� =#���O�!� ��� ! � ����"���� �����
���������1�� ��������"+,�
��5���"����%��� ��!����!����� ���&%������������"������4��������������"������"!����������"������"�%��������� ����������
�*�$�����$1�� �������������"�"���������+:������$&8������$:,��*�$�����'1�� �������������"�"���������+:������$&8������':,�
�� ������� ���+�#2�#C88+���������,&�*�$�����$,��� ������� ���+�#2�#C88+���������,&�*�$�����',�
��4���������������"� ��! ������������% �������!��P����!����"������������%"�������&��!��������!"���� ������"���������"�����%����������������%��"����"��"� ���� �"& ������ �"���%����� ���� ������"����4���������!����������:����"�"����"��:&���������!�����"���������������"����
������������'1�� ��������"+,�����'�����$1�� �������������"�"���������+:������'&8������$:,��� ������� ���+�#2�#C88+������������',&����'�����$,�
�� ����������������������+�#2�#C88�3#8K+�*�$�����',&������������',�
��#����������%�"��� � �����������! ������"����<������!� �"�� �������!�������! ������"�&������ ����"�����%��������&�����������!����������������������
�� �"���������"+����'�����$,�
������������)1�� ��������"+,�����'�����$�����$1�� �������������"�"���������+:������)&8������$:,��� ������� ���+�#2�#C88+������������),&����'�����$�����$,�
�� ����������������������+�#2�#C88�3#8K+����'�����$,&������������),�
�� �"���������"+����'�����$�����$,�
"�����������1�� �������������"�"���������+:������!:,��� ������� ���+�#2�#C88+���������,&"�����������,�
��������"������1�� ��������"+,��� ����������������������+�#2�#C88�3#8K+"�����������,&��������"������,�
��5���%�! �� �"������"������"����4�% ���"��"���!�!��! ����F���
Rozdział 4. � Zaawansowane obiekty GTK+ 135
����������1�� �������������"+,�������"�����1�� ���������"+:#�%�����! ����:,��� ��������������+�#2�=64#?348C+����������,&������"�����,��� ������� ���+�#2�#C88+��������"������,&����������,��� �"���������"+������"�����,��� �"���������"+����������,�
��4���� �����������!"����"�� ��!��� ���
�����������1�� �������������"+,��������"�����1�� ����������"�"���������+:#�%��� ��!��� �:,��� ��������������+�#2�=64#?348C+�����������,&�������"�����,��� ������� ���+�#2�#C88+��������"������,&�����������,��� �"���������"+�������"�����,��� �"���������"+�����������,�
��?����� ���"!�������
���� ���N�����1�� �������������"+,����� ���N�"�����1�� ����� ����������"�"���������+:#�%��� ���"!�����:,��� ��������������+�#2�=64#?348C+���� ���N�����,&���� ���N�"�����,��� ������� ���+�#2�#C88+��������"������,&���� ���N�����,��� �"���������"+���� ���N�"�����,��� �"���������"+���� ���N�����,�
������"��%�!�������"��=#������
�����������1�� ���������"�"����������+'&B&�������������,�
����������$1�� ������������������+�#2�=#C88+�����������,&4A77&4A77&����$�����&B&4A77&4A77&4A77&4A77&@?7>8&#CA8,�����������'1�� ������������������+�#2�=#C88+�����������,&4A77&4A77&����'�����&B&4A77&4A77&4A77&4A77&@?7>8&#CA8,�����������)1�� ������������������+�#2�=#C88+�����������,&����������'&4A77&����)�����&B&4A77&4A77&4A77&4A77&@?7>8&#CA8,�
��2������ �%�����"�=#���%����������� ����������!������!��"���!�%��������� ��������"������&������ �����"���!�"���!�����!�%��"������"����"���6��� �������!������ �%��� ������������������F�������6��� �=#����� �����6������"������������!&4A77���"�������"�������������6������"����:���������!:�4A77���� ������������������N�#�������"���������� ����������!�� �������������"�������%�����"��������� ����������������!��"�������� �����7����� � ���� ������!���� ��������"����� ������ �N�� �������H������� �������H6� �"������� ��!&"!�"�������&� �N�� �� �������!"����%������"�����!����"�����!�������� �� ����������������������������� �����%���&��!����������%���"������
136 Część I � Szybkie wprowadzenie
�#CA8�������&��������������"����"����" �������!���+�����������������������!��"����" �������!��,���N ��������������������� �����%���&��!���!"�����%������"�����!��!�������
�����!�����������!��1�� ����������"�"���������+:>�!�������:,��� ���������������+�#2�6;<8=#+�����!�����������!��,&:���� ��:&�#2�>3�4?7�@A4=+�����!�����������!������� ��,&4A77,�
�����!�����N �����1�� ����������"�"���������+:>�!�����"�%���!:,��� ���������������+�#2�6;<8=#+�����!�����N �����,&:���� ��:&�#2�>3�4?7�@A4=+�����!�����N ���������� ��,&4A77,�
�� ���N� �� ������+�#2�;6J+*��N�����,&���������&#CA8&#CA8&B,��� ���N� �� ������+�#2�;6J+*��N������,&�����������&#CA8&#CA8&B,��� ���N� �� ������+�#2�;6J+*��N������,&�����!�����������!��&#CA8&@?7>8&B,��� ���N� �� ������+�#2�;6J+*��N������,&�����!�����N �����&#CA8&@?7>8&B,�
�� ���N� �� ������+�#2�;6J+���N�����,&*��N�����&#CA8&#CA8&B,��� ���N� �� ������+�#2�;6J+���N�����,&*��N������&#CA8&#CA8&B,��� ��������������+�#2�=64#?348C+���������,&���N�����,�
�� �"���������"����+���������,��� �����+,�������B�
D
*���������!�����+,/�� ������E���+,�D
*��������!�����������!������� ��+,/�����������������!��1$�
��+�������!��11(,�������!��1$������������!��QQ�
�"����+�������!��,/����$F�� ������������������!��+�#2�=#C88+�����������,&�#2�=#C88�7348>�4648,����� �����'F�� ������������������!��+�#2�=#C88+�����������,&�#2�=#C88�7348>�>6735,����� �����)F�� ������������������!��+�#2�=#C88+�����������,&�#2�=#C88�7348>�56##85,����� �
Rozdział 4. � Zaawansowane obiekty GTK+ 137
����(F�� ������������������!��+�#2�=#C88+�����������,&�#2�=#C88�7348>�#?;;85,����� ��������F�� ����+:#��������� �"�����!�"�������RR:,����� �D
D
*��������!�����N ���������� ��+,/�����������N ��������!��1$�
��+�N ��������!��11(,�N ��������!��1$������N ��������!��QQ�
�"����+�N ��������!��,/����$F�� ������������N ��������!��+�#2�=#C88+�����������,&�#2�=#C88�8J�?458C�4648,����� �����'F�� ������������N ��������!��+�#2�=#C88+�����������,&�#2�=#C88�8J�?458C�>SA?C8,����� �����)F�� ������������N ��������!��+�#2�=#C88+�����������,&�#2�=#C88�8J�?458C�#C3?4�78,����� �����(F�� ������������N ��������!��+�#2�=#C88+�����������,&�#2�=#C88�8J�?458C�=3C=A7?C,����� ��������F�� ����+:#��������� �"�����!�"�������RR:,����� �D
D
��� ����
Obiekt ����� �� jest obiektem docenianym szczególnie przez programistów wykorzy-
stujących wcześniej VB lub VC++ ze względu na jedną, ważną właściwość. Otóż w tym
obiekcie możemy umieszczać inne widgety bezpośrednio na jego powierzchni (pokrytej
siatką, ułatwiającą lokalizację rozmieszczanych widgetów — rysunek 4.3). Nie korzy-
stamy tu z obiektów-pojemników, których stosowanie jest główną własnością GTK+.
Większość programistów zamiast tego obiektu wybierze ���������, ze względu na jego
większe możliwości (obiekt zaprezentowano w kolejnej sekcji, „���������”).
Program umieszczony w listingu 4.3 jest bardzo prosty. Wykorzystano w nim obiekt
����� �� i jeden przycisk, który po każdym kliknięciu zmienia swoją pozycję na po-
wierzchni okna ����� ��. Porównajmy ����� �� z obiektem ��������� przed podjęciem
decyzji, który z nich lepiej nadaje się do wykorzystania w naszych aplikacjach.
138 Część I � Szybkie wprowadzenie
���������Obiekt GtkFixed
� �� �����Prezentacja GtkFixed
���������� ��� ����������������������;������� ����������%��� �����������"!���������"�����������"!��"��� �%��"�����%��������������"����� ���������� �������������� ��!��� � �� �"������������ ���� @�N�����
�� �������������N����� ���������N���������� ����������$�
*���������!�����+,�*������$����� ��+,�
��������+��������&���������*-.,/�� �����+0����&0���*,�
������N��1�� �"����"���"+�#2��3456��#6�78987,�
�� �"����"����������+�#2��3456�+������N��,&:���������%����� ���� @�N��:,�
�� ���������������+�#2�6;<8=#+������N��,&:������!:&�#2�>3�4?7�@A4=+������!�����,&4A77,�
��N�������1�� ���N�����"+,�
���� @�N��%������� ��� ����!�"��!����4����!� ����"� �������� �������� ������"������ ��������&���������������� �"���������� @�N���?��!���!����&��N ���& �������������������!����������� �!� ������&������������� �"���������� @�N��&�������!��������%��"����%����%��!������& ��"���%��!�����"!�"����������#� ���������"����������� ��� @�N��& ���!���������!��������%��"����������� �"���������� ����& ����������"!�"���������"��!�� ���%������� ��"�<����"����� �����!�������� ���������!� ���������!�������� @�N��&��"���������������� �"��������"�%�"!����!�� &��! ���������!���� �������!�"������!��<�������� � �����!�������� �����%����������!"���� ��� �����"����&�� @�N����������%��!�������!�������"�% �"������������K����� ��"����������"�!���������� �"��!�������"��
Rozdział 4. � Zaawansowane obiekty GTK+ 139
�� �����"����"��� ������������ ��������P�����!� ��! ����"� ��!�%����� ��$&$���������!���� ��� ��!�%�$BB&$BB�+� �����"���������%��������"��� ��������,���!�������! ������������� ����TB&TB&� ����������%��!������!%���� ����������!����� ���$TB&TB&��� �����"�����"�������"�%��������� &��!�"!�"������!���� ��������������%��� �"����������6 �����"��%����!��"��� ���"����� ���!������&��!���� �!���������������������������������� ��� �"����������� @�N���6 �����"��& ����� ���"������!�� "�������&�����������" �"�!�� ��! �� ���� ������������ ��������� ����� �������=��U�� @�N��%������������"!"�������"����&� �����������������% ���!���%���� 7�!������������ �������"!����:����������� ��:� ��"���!�"��!������! �����������+�� @�N����� 7�!���,���
���$1�� ����������"�"���������+:���!��� $:,��� ���������������+�#2�6;<8=#+���$,&:���� ��:&�#2�>3�4?7�@A4=+���$����� ��,&4A77,��� ���N��� ��+�#2�@3J85+��N�������,&���$&$&$BB,�
��#���������"���!� ��������� �"!����%��� �%������ �"������F�������������"�% ��"����� ��+" � ������,������������������% ��"����� ��+��"�����" � ������,���
�� ��������������+�#2�=64#?348C+������N��,&��N�������,�
�� �"���������"����+������N��,��� �����+,�������B�
D
*���������!�����+,/�� ������E���+,�D
*������$����� ��+,/����N� ��&!� ���
N� ��1����+,�!� ��1����+,�
��#�������%��!�����!����"�"�� �������$��'BB&� ���� ���������%� ���"��� ������%� ��!��� ����
��/N� ��1N� ��O'BB�D"����+N� ���'BB,�
140 Część I � Szybkie wprowadzenie
��/!� ��1!� ��O'BB�D"����+!� ���'BB,�
�� ���N�����*�+�#2�@3J85+��N�������,&�#2��35�8#+���$,&N� ��&!� ��,�D
���������
��������� ma podobne właściwości, co ����� ��, ale umożliwia wykorzystanie więk-
szej powierzchni dla widgetów potomnych od powierzchni wymaganej do ich wyświe-
tlenia. W tym obiekcie, zamiast korzystać z niszczenia i ponownego tworzenia okna,
mamy do dyspozycji funkcje ��������� i �������� (opisane w listingu 4.4). Na rysun-
ku 4.4 przedstawiono wynik działania programu.
��������Prezentacja działania
GtkLayout
Aby uwidocznić podobieństwa i różnice pomiędzy kontrolkami ����� �� i ���������,
listing 4.4 jest bardzo podobny do listingu 4.3. Najlepiej oba programy skompilować
i uruchomić, a następnie wybrać bardziej odpowiedni dla danego zastosowania obiekt.
� �� ����Prezentacja GtkLayout
���������� ��� ��������������������
�� �������������!������ ���������!����������� ����������$�
*���������!�����+,�*������$����� ��+,�
��������+��������&���������*-.,/�� �����+0����&0���*,�
������!���1�� �"����"���"+�#2��3456��#6�78987,�
�� �"����"����������+�#2��3456�+������!���,&:���������%����� ���� 7�!���:,�
�� ���������������+�#2�6;<8=#+������!���,&:������!:&�#2�>3�4?7�@A4=+������!�����,&4A77,�
Rozdział 4. � Zaawansowane obiekty GTK+ 141
��!��������1�� ���!������"+4A77&4A77,�
��P������"!"��!"����� �%��� ���!������"+,& ����%� � ��������"� �������%����� ��"�������!%�!��+ �����!��� ����"!��,&������� ���!����� � �������������������"������ �%����"�����!������ �!������������" �:��N��:��:��!���:+ ������ �"��������������,���#�� ������%��� �����!�� � ���������&��� ������� �� ������ �"!�������� �%�& �������%��!��������"�������� ���� 7�!������
���$1�� ����������"�"���������+:���!��� $:,��� ���������������+�#2�6;<8=#+���$,&:���� ��:&�#2�>3�4?7�@A4=+���$����� ��,&4A77,��� ���!���� ��+�#2�7?V6A#+��!��������,&���$&$&$BB,�
�� ��������������+�#2�=64#?348C+������!���,&��!��������,�
�� �"���������"����+������!���,��� �����+,�������B�
D
*���������!�����+,/�� ������E���+,�D
*������$����� ��+,/����N� ��&!� ���
N� ��1����+,�!� ��1����+,�
��#�������%��!�����!����"�"�� �������$��'BB&� ���� ���������%� ���"��� ������%� ��!��� ����
��/N� ��1N� ��O'BB�D"����+N� ���'BB,�
��/!� ��1!� ��O'BB�D"����+!� ���'BB,�
��6����%"�� ���������� ������!�� @�N����� 7�!�����P�������!��"������"�� ��"����%�������������&�� ��%������ �"��%�&� �� ������� ��������������%������� ��"O������ �"���<�����������W���� ��!����� ��!"�������� ����� �����!�����
142 Część I � Szybkie wprowadzenie
�� ���!����������+�#2�7?V6A#+��!��������,,�
�� ���!������*�+�#2�7?V6A#+��!��������,&�#2��35�8#+���$,&N� ��&!� ��,�
�� ���!�������"+�#2�7?V6A#+��!��������,,�D
����������������
Obiekt ���������������� jest pojemnikiem, w którym można umieścić inne widgety.
Okno to posiada paski przewijania. Można je zaimplementować również w innych wid-
getach, które nie posiadają tych pasków. Dzięki temu na jednym ekranie można umie-
ścić kilka okienek, w których — za pomocą pasków przewijania — można wybierać
wyświetlany obszar z pożądanymi obiektami. Na rysunku 4.5 przedstawiono okno wy-
generowane przez program, którego kod źródłowy znajduje się w listingu 4.5.
���������Obiekt
GtkScrolledWindow
W programie prezentującym okno przewijane umieściliśmy dwa przyciski, dzięki któ-
rym możemy wybrać odpowiednie ustawienia. Jeden z nich służy do wybrania opcji
always, czyli stałego wyświetlania pasków przewijania (niezależnie od tego, czy jest to
potrzebne, czy nie), a drugi — do ustawienia opcji auto, czyli wyświetlania pasków tyl-
ko wtedy, gdy widget w oknie głównym nie mieści się na wyświetlanym obszarze. Na-
leży wiedzieć, że odpowiednich ustawień można dokonać dla każdego paska osobno.
Na przykład dla paska pionowego można wybrać właściwość auto, a dla poziomego —
always. W naszym programie będziemy wybierać takie same właściwości dla obydwu
pasków.
� �� �����Prezentacja GtkScrolledDemo
���������� ��� ���
�� ���������������������� ����������������������� ���������N���������� ��������������� ����!�����&��������� ����!���"�!��
*���������!�����+,�*����������� ����!���������� ��+,�*����������� ����!���"�!������ ��+,�
Rozdział 4. � Zaawansowane obiekty GTK+ 143
��������+��������&���������*-.,/�� �����+0����&0���*,�
������������1�� �"����"���"+�#2��3456��#6�78987,��� �"����"����������+�#2��3456�+������������,&:���������%�� ��� �� ��� ���"�%����:,�
��4����!���"��!�&����� ���%�� ����� �"!����������"�� ���������!�������&��!� ����%�������������� �"����������?�!"!�"��������!�"� ��!��� �&���������������������������!� �����"������� ����!����"������"�� ����!"!�"�������� �� �" ���"�%�������
�� ���������������+�#2�6;<8=#+������������,&:������!:&�#2�>3�4?7�@A4=+������!�����,&4A77,�
�������������1�� ����������"����"���"+4A77&4A77,���N�������1�� ���N�����"+,�
�������� ����!�����1�� ����������"�"���������+:��� �"!�"�������"����� ������!:,��� ���������������+�#2�6;<8=#+�������� ����!�����,&:���� ��:&�#2�>3�4?7�@A4=+�������� ����!���������� ��,&4A77,�
�������� ����!���"�!�1�� ����������"�"���������+:��� ���"���"�������:,��� ���������������+�#2�6;<8=#+�������� ����!���"�!�,&:���� ��:&�#2�>3�4?7�@A4=+�������� ����!���"�!������ ��,&4A77,�
�� ���N��� ��+�#2�@3J85+��N�������,&�������� ����!�����&'BB&'BB,��� ���N��� ��+�#2�@3J85+��N�������,&�������� ����!���"�!�&TB&XT,�
�� ����������"����"�����"����*��" ���+�#2�>=C67785��3456�+�������������,&��N�������,��� ��������������+�#2�=64#?348C+������������,&�������������,�
�� �"���������"����+������������,��� �����+,�������B�
D
*���������!�����+,/�� ������E���+,�D
*����������� ����!���������� ��+,/�� ����������"����"����� ����!+�#2�>=C67785��3456�+�������������,&�#2��673=V�?A#6K?#3=&�#2��673=V�?A#6K?#3=,�
144 Część I � Szybkie wprowadzenie
D
*����������� ����!���"�!������ ��+,/��#�%������!���������"�������"���������
�� ����������"����"����� ����!+�#2�>=C67785��3456�+�������������,&�#2��673=V�?7�?V>&�#2��673=V�?7�?V>,�D
�����������
Obiekt ����������� jest odpowiednikiem kontrolki nazywanej przez programistów VB
„kontrolką zakładek”. Taka kontrolka umożliwia egzystencję wielu obiektów na jednej
„powierzchni użytkowej”. Każda zakładka oznacza osobną stronę, na której można umie-
ścić dowolne obiekty kontrolne. W danej chwili można wyświetlić jedną stronę, a inne
w tym czasie pozostaną ukryte.
Okno z główną zakładką aplikacji pokazano na rysunku 4.6, a odpowiedni kod źródło-
wy w listingu 4.6. Zwróćmy uwagę na możliwość dynamicznego dodawania kolejnych
stron (w zasadzie można napisać program, w którym można dodawać również inne wid-
gety w trakcie jego działania).
���������Uruchomiony programprezentujący
działanie
GtkNotebook
� �� �����Program prezentujący obiekt GtkPaned
���������� ��� ���
�� ������������������ ��� �������������� �������� ���������N��� ���$��� �������*��N� ���'�
*���������!�����+,�*����������������������� ��+,�*�������������������������������� ��+,�*���������������������������������� ��+,�*����������� �������� ��+,�*����������� ��������N����� ��+,�*���������� ��"����� ���+,�
��������+��������&���������*-.,/�� �����������������������
Rozdział 4. � Zaawansowane obiekty GTK+ 145
�� �������������������������������&������������������������������ ��������������� ���&��������� ��������N��� ��������������$&��������'�
�� �����+0����&0���*,�
����������� 1�� �"����"���"+�#2��3456��#6�78987,��� �"����"����������+�#2��3456�+����������� ,&:���������%�� ��4������ :,�
�� ���������������+�#2�6;<8=#+����������� ,&:������!:&�#2�>3�4?7�@A4=+������!�����,&4A77,�
������� �����1�� �������� ���"+,��� ���������������+�#2�6;<8=#+������� �����,&:�"����O ���:&�#2�>3�4?7�@A4=+������� ��"����� ���,&4A77,�
��>����� ���"���"������� ������
��N��� ���$1�� ���N�����"+,��������$1�� ���������"+:����"����� ��� �:,�
���������������1�� ����������"�"���������+:C����%��� ���� :,��� ���������������+�#2�6;<8=#+���������������,&:���� ��:&�#2�>3�4?7�@A4=+�������������������� ��,&4A77,�
������������������������1�� ����������"�"���������+:#� �����"��� ����� ���� :,��� ���������������+�#2�6;<8=#+������������������������,&:���� ��:&�#2�>3�4?7�@A4=+����������������������������� ��,&4A77,�
��������������������������1�� ����������"�"���������+:C����"��� ����� ���� :,��� ���������������+�#2�6;<8=#+��������������������������,&:���� ��:&�#2�>3�4?7�@A4=+������������������������������� ��,&4A77,�
�� ���N��� ��+�#2�@3J85+��N��� ���$,&���������������&'B&'B,��� ���N��� ��+�#2�@3J85+��N��� ���$,&������������������������&'B&TB,��� ���N��� ��+�#2�@3J85+��N��� ���$,&��������������������������&'B&YB,��� �������� �� ���� ���+�#2�46#8;662+������� �����,&��N��� ���$&�������$,�
��>�����'�����*��N� ���'1�� �*��N���"+#CA8&B,��������� ���1�� ����������"�"���������+:5���%������:,��� ���������������+�#2�6;<8=#+�������� ���,&:���� ��:&�#2�>3�4?7�@A4=+�������� �������� ��,&4A77,�
146 Część I � Szybkie wprowadzenie
�������� ��������N1�� ����������"�"���������+:����������� ������!:,��� ���������������+�#2�6;<8=#+�������� ��������N,&:���� ��:&�#2�>3�4?7�@A4=+�������� ��������N����� ��,&4A77,�
�� ���N� �� ���������������+�#2�;6J+*��N� ���',&�������� ���,��� ���N� �� ���������������+�#2�;6J+*��N� ���',&�������� ��������N,�
�������'1�� ���������"+:5������ ��� �:,�
�� �������� �� ���� ���+�#2�46#8;662+������� �����,&*��N� ���'&�������',�
��2�����������%�� ��� �&��������������� �����"�������
�� ��������������+�#2�=64#?348C+����������� ,&������� �����,�
�� �"���������"����+����������� ,��� �����+,�������B�
D
*���������!�����+,/�� ������E���+,�D
*����������������������� ��+,/����������������������1$�
��+������������11(,������������1$�����������������QQ�
�"����+������������,/����$F�� �������� ��������� ��+�#2�46#8;662+������� �����,&�#2��6>�#6�,����� �����'F�� �������� ��������� ��+�#2�46#8;662+������� �����,&�#2��6>�C3�I#,����� �����)F�� �������� ��������� ��+�#2�46#8;662+������� �����,&�#2��6>�;6##6K,����� �����(F�� �������� ��������� ��+�#2�46#8;662+������� �����,&�#2��6>�78@#,����� ��������F�� ����+:#�� ��! ��� ��� �"���������!"!��� ���H�:,�DD
*�������������������������������� ��+,/�� �������� ���������������������+�#2�46#8;662+������� �����,&#CA8,�D
*���������������������������������� ��+,
Rozdział 4. � Zaawansowane obiekty GTK+ 147
/��#���� �%��������� ��&%������ ��� �������������� � ��"�%�����"�%�����������!� ��! �� ���� �%������"������ ����&%� ������������������������������ ��+,����� �������� ���������������������+�#2�46#8;662+������� �����,&@?7>8,�D
*����������� �������� ��+,/�� ���������N����� �����������
��N��1�� ���N�����"+,�
���1�� ���������"+:4�"!:,�
�� �������� �� ���� ���+�#2�46#8;662+������� �����,&��N��&���,�
��6��"�������� �����
�� �"���������"����+������� �����,�D
*����������� ��������N����� ��+,/��P� ��� ���������"�������������� ����+:3��� ������!��Z��H�:&�� �������� ������������� ���+�#2�46#8;662+������� �����,,,�D
*���������� ��"����� ���+,/�� ����+:����������������H�:,�D
��������
Dzięki widgetowi �������� można podzielić okno — pionowo lub poziomo — na dwie
mniejsze powierzchnie, zwane panelami (rysunek 4.7). Jeśli chcemy uzyskać więcej
mniejszych powierzchni, możemy dzielić większe na dwie mniejsze, potem mniejsze na
jeszcze mniejsze, i tak dalej. Po uruchomieniu programu w oknie zobaczymy specjalne
przyciski, dzięki którym będziemy mogli zmienić rozmiary każdej powierzchni (pod wa-
runkiem, że wybierzemy właściwe opcje).
Zwróćmy uwagę na wymiary przycisków służących do zmiany rozmiarów powierzchni.
W naszym przypadku mamy do czynienia z bardzo „cieniutkimi” obiektami, ale nic nie
stoi na przeszkodzie, aby wykorzystać większe przyciski. Wymiary tych przycisków są
związane z przestrzenią pomiędzy granicą powierzchni a obiektami w niej umieszczony-
mi. Wielkość tej przestrzeni określa się w funkcji ���!����� ���������"#.
148 Część I � Szybkie wprowadzenie
���������Okno prezentacji
GtkPaned
� �� �����Prezentacja GtkPaned
���������� ��� ���
�� ����������� �����
*���������!�����+,�
��������+��������&���������*-.,/�� ������������ ����$�������� �����������* ����$��� ��� ������������ ����'�������� �����������* ����'��� ��� �����������* ����'���������� �������� ����$��� �������* ����$��� �������� ����'��� �������* ����'�
�� �����+0����&0���*,�
���� ����1�� �"����"���"+�#2��3456��#6�78987,��� �"����"����������+�#2��3456�+���� ����,&:���������%��� �����:,�
�� ���������������+�#2�6;<8=#+���� ����,&:������!:&�#2�>3�4?7�@A4=+������!�����,&4A77,�
� ����$1�� �� �������"+,��� � ����������������+�#2��?485+� ����$,&'B,��� � ����������������+�#2��?485+� ����$,&'B,������ ����$�����1�� ���������"+:� ����$����"�H�6 �%�C�����#CA8H�6 �%�>���� #CA8:,��� � ����� �� $+�#2��?485+� ����$,&����� ����$�����&#CA8&#CA8,�
���!"��������� �%��� � ����������������+,������"���������������������� ������! �������"��������������%��!����� ���������"��!�&������"��� ������ "!����������!�����"�������%�����!� �"�� ������ � ����������������+, �"���%�������������������& "������"��� ��!��� �&����� � ��������!� �"�� ������������������! ���������� � ����� �� $+, �"���%����������������������� ���"��"�%& ������%������ ��������"�����%&� ����"�%������ �������� � ����� �� '+,����!+ ���� �����%,������������������� ��""�����%��� ��"�%������
Rozdział 4. � Zaawansowane obiekty GTK+ 149
� ������ �������* ���������������!��� �%��� � ����� �� �+,F� ��� ����������"!�������"����� �����!&����������!"��"�%+ ��"�%,���������%+�����%,��������������%������"������#CA8&���� � �����!�������������!�� �"�������������� �� ���%�"� ������"�!�������� %������"������@?7>8& ��������������������� �"�������������%���%��� �"������������� �� �����������
* ����$1�� �* �������"+,��� � ����������������+�#2��?485+* ����$,&'B,�����* ����$��� 1�� ���������"+:* ����$����H�6 �%�C�����#CA8H�6 �%�>���� @?7>8:,��� � ����� �� '+�#2��?485+� ����$,&* ����$&#CA8&@?7>8,��� � ����� �� $+�#2��?485+* ����$,&����* ����$��� &#CA8&@?7>8,�
� ����'1�� �� �������"+,��� � ����������������+�#2��?485+� ����',&'B,������ ����'�����1�� ���������"+:� ����'����"�H�6 �%�C�����@?7>8H�6 �%�>���� #CA8:,��� � ����� �� '+�#2��?485+* ����$,&� ����'&@?7>8&#CA8,��� � ����� �� $+�#2��?485+� ����',&����� ����'�����&@?7>8&#CA8,�
* ����'1�� �* �������"+,��� � ����������������+�#2��?485+* ����',&T,��� � ����������������+�#2��?485+* ����',&T,�����* ����'��� 1�� ���������"+:* ����'����H�C�����@?7>8H�6 �%�>���� @?7>8:,�����* ����'�������1�� ���������"+:* ����'���:,��� � ����� �� '+�#2��?485+� ����',&* ����'&@?7>8&@?7>8,��� � ����� �� $+�#2��?485+* ����',&����* ����'��� &@?7>8&@?7>8,��� � ����� �� '+�#2��?485+* ����',&����* ����'�������&@?7>8&@?7>8,�
�� ��������������+�#2�=64#?348C+���� ����,&� ����$,�
�� �"���������"����+���� ����,��� �����+,�������B�
D
*���������!�����+,/�� ������E���+,�D