Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
IDZ DO
IDZ DO
KATALOG KSI¥¯EK
KATALOG KSI¥¯EK
TWÓJ KOSZYK
TWÓJ KOSZYK
CENNIK I INFORMACJE
CENNIK I INFORMACJE
CZYTELNIA
CZYTELNIA
MySQL. Budowanie
interfejsów u¿ytkownika.
Vademecum profesjonalisty
Autor: Matthew Stucky
T³umaczenie: Tomasz Miszkiel
ISBN: 83-7197-885-5
Tytu³ orygina³u:
MySQL Building User Interfaces
Format: B5, stron: 582
MySQL jest szybkim, przenony 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
dowiadczenie 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 wywietlania 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
koniecznoci rekompilacji kodu ród³owego
• Przeledzisz krok po kroku proces powstawania kompletnej aplikacji korzystaj¹cej
z MySQL.
5RKUVTGħEK
Dla kogo przeznaczona jest ta książka? ........................................................................ 12
Układ książki ............................................................................................................. 12
Konwencje przyjęte w książce..................................................................................... 13
!"##! $ %
Dlaczego właśnie MySQL? ......................................................................................... 17
Licencje .................................................................................................................... 18
Porównanie typów danych MySQL
z typami dostępnymi w Access 2000 i SQL Server 7 .................................................. 19
Czego brakuje w MySQL?.......................................................................................... 21
MySQL, MYSQL i mysql — trzy podobne słowa, trzy różne znaczenia.......................... 27
Tylko dla użytkowników programu Access: demony i usługi.......................................... 29
Skąd pobrać pakiet instalacyjny MySQL?..................................................................... 30
Decyzja dotycząca metody instalacji — wszystkie za i przeciw ...................................... 31
Pliki potrzebne do instalacji RPM................................................................................ 33
Instalacja ................................................................................................................... 34
Pierwsze spotkanie z MySQL: tworzenie, wykorzystywanie i usuwanie bazy danych ....... 38
Niestandardowe, unikatowe konstrukcje SQL wykorzystywane w MySQL
(rozszerzenie standardu ANSI SQL92) ...................................................................... 40
Programy użytkowe w MySQL ................................................................................... 45
Interfejs API języka C dla MySQL .............................................................................. 53
& '()*+ !# ,-. / 0
Dlaczego powinniśmy korzystać z GTK+? ................................................................... 60
Gdzie zdobyć GTK+ i jak dokonać jego instalacji?........................................................ 61
Licencje .................................................................................................................... 61
Ogólny opis biblioteki GTK+...................................................................................... 63
Pojemniki GTK+ jako odpowiedniki kontrolek zmieniających rozmiary.......................... 71
Podstawowe widgety w programie ............................................................................... 73
1 2,+!'()* 0
Widget GtkCombo ..................................................................................................... 95
GtkProgressBar i GtkStatusBar ................................................................................... 99
GtkFrame i GtkAspectFrame..................................................................................... 106
Okna 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 ................................................................................................................. 127
GtkTree i GtkCTree ................................................................................................. 132
GtkFixed ................................................................................................................. 137
GtkLayout ............................................................................................................... 140
GtkScrolledWindow ................................................................................................. 142
GtkNotebook ........................................................................................................... 144
GtkPaned ................................................................................................................ 147
0 '+ !# ,-. / 0
Środowisko Glade .................................................................................................... 151
Pierwsze spotkanie z Glade: aplikacja WitajSwiecie .................................................... 153
Szczegółowa analiza wybranych plików projektu WitajSwiecie.................................... 162
Glade i widgety........................................................................................................ 170
Tworzenie projektu: trzeba poznać hierarchię obiektów ............................................... 173
Komunikacja pomiędzy oknami w projekcie utworzonym w Glade............................... 174
Zmienne o zasięgu globalnym a poprawne pisanie programów ..................................... 180
6 7,#
#,,2! 80
Projekt aplikacji ....................................................................................................... 186
Interfejs użytkownika ............................................................................................... 189
Tworzenie bazy danych ............................................................................................ 193
Wdrożenie aplikacji.................................................................................................. 195
Modernizacja aplikacji.............................................................................................. 199
% 9#,5 +!:;< &
Tworzenie interfejsu użytkownika za pomocą Glade ................................................... 202
Funkcje aplikacji ...................................................................................................... 214
Połączenie interfejsu i funkcji wykonujących poszczególne zadania programu............... 248
Kompilacja programu ............................................................................................... 259
Uwagi dotyczące utworzonego programu ................................................................... 259
8 #,,=,# &61
Przedstawienie problemu .......................................................................................... 264
Interfejs użytkownika ............................................................................................... 267
Baza danych, przygotowanie autoryzacji .................................................................... 271
Tworzenie bazy danych ............................................................................................ 273
) #,#,7, &8
Budowanie interfejsu użytkownika za pomocą Glade .................................................. 281
Kontrola wyświetlanych danych ................................................................................ 286
Funkcje tworzonej aplikacji....................................................................................... 289
Powią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ń.................................................................................... 327
Korzyści płynące z zastosowania Make ...................................................................... 328
Instalowanie aplikacji ............................................................................................... 330
Kompilacja programu dla Win32 za pomocą MS Visual C++ ....................................... 341
Spis treści
7
7,##, 10
Definicja problemu................................................................................................... 351
Interfejs użytkownika ............................................................................................... 352
Baza danych, uprawnienia użytkowników .................................................................. 356
Tworzenie bazy danych ............................................................................................ 357
& ) #,#, 16
Opis problemu ......................................................................................................... 361
Aplikacja sterująca: Raporty...................................................................................... 361
Raport 1. Tabela....................................................................................................... 371
Raport 2. Wykres kołowy ......................................................................................... 377
Raport 3. Wykres liniowo-kolumnowy ....................................................................... 387
Raport 4. Wykres punktowy...................................................................................... 393
1 ), ,#, 31
Kompilacja i dystrybucja w formie pliku RPM ........................................................... 403
Kompilacja programów za pomocą MinGW dla Win32 ............................................... 408
3 >?, "##-@ 3%
Jeszcze raz program „Witaj Swiecie” ......................................................................... 417
Komunikacja pomiędzy oknami................................................................................. 422
Dokonywanie zmian w aplikacji bez konieczności ponownej kompilacji ....................... 430
!
># 7#+'=#,;< 310
interface.c................................................................................................................ 435
sesi.glade................................................................................................................. 460
>#/ 7#+'=#,7, 3
interface.c................................................................................................................ 499
prowizje.glade.......................................................................................................... 516
>#A 7#+'=#, 03%
Pliki dla programu głównego..................................................................................... 547
Pliki dla programu tworzącego raport w formie tabeli .................................................. 551
Pliki dla programu tworzącego wykres kołowy ........................................................... 556
Pliki dla programu tworzącego raport w postaci wykresu liniowo-kolumnowego ........... 559
Pliki 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"""+#23456#678987,
Rozdział 4.
Zaawansowane obiekty GTK+
129
""+#23456+,&:%!":,
+#26;<8=#+,&
:!:&
#2>34?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:,
+#26;<8=#+$$,&
::&
#2>34?7@A4=+$$,&
4A77,
'$1""+:A"H %H@377:,
+#26;<8=#+'$,&
::&
#2>34?7@A4=+'$,&
4A77,
($1""+:! %>IC342:,
+#26;<8=#+($,&
::&
#2>34?7@A4=+($,&
4A77,
$'1""+:!H6 %H8J?45:,
+#26;<8=#+$',&
::&
#2>34?7@A4=+$',&
4A77,
$)1""+:!H6 %H@377HH>IC342:,
+#26;<8=#+$),&
::&
#2>34?7@A4=+$),&
4A77,
)'1""+:!H6 %H>IC342HH8J?45:,
+#26;<8=#+)',&
::&
#2>34?7@A4=+)',&
4A77,
))1""+:!H %H@377HH8J?45:,
+#26;<8=#+)),&
::&
#2>34?7@A4=+)),&
4A77,
')1""+:! %H@377&8J?45>IC342:,
+#26;<8=#+'),&
::&
#2>34?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
*$'+,
/
"!+,
+,
"+#28J?45&B,
+#2=64#?348C+,&,
""+,
D
*$)+,
/
"!+,
+,
"+#2@377M#2>IC342&B,
+#2=64#?348C+,&,
132
Część I
Szybkie wprowadzenie
""+,
D
*)'+,
/
"!+,
+,
"+#2>IC342M#28J?45&B,
+#2=64#?348C+,&,
""+,
D
*))+,
/
"!+,
+,
"+#2@377M#28J?45&B,
+#2=64#?348C+,&,
""+,
D
*')+,
/
"!+,
+,
"+#2>IC342M#2@377M#28J?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"""+#23456#678987,
""+#23456+,&:%""":,
+#26;<8=#+,&
:!:&
#2>34?7@A4=+!,&
4A77,
N1N"+#CA8&B,
*N1*N"+#CA8&B,
*N1*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#C883#8K+*$',&',
#%" ! "
<!"!! "& "
%&!
""+'$,
)1"+,
'$$1""+:)&8$:,
+#2#C88+),&'$$,
+#2#C883#8K+'$,&),
""+'$$,
"1""+:!:,
+#2#C88+,&",
"1"+,
+#2#C883#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+",&,
""+",
""+,
? "!
N1"+,
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""+:>!:,
+#26;<8=#+!!,&
::&
#2>34?7@A4=+!!,&
4A77,
!N 1""+:>!"%!:,
+#26;<8=#+!N ,&
::&
#2>34?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$
"+!,
/
$F!+#2=#C88+,&
#2=#C887348>4648,
'F!+#2=#C88+,&
#2=#C887348>>6735,
)F!+#2=#C88+,&
#2=#C887348>56##85,
Rozdział 4.
Zaawansowane obiekty GTK+
137
(F!+#2=#C88+,&
#2=#C887348>#?;;85,
F +:# "!"RR:,
D
D
*!N +,
/
N !1$
+N !11(,
N !1$
N !QQ
"+N !,
/
$FN !+#2=#C88+,&
#2=#C888J?458C4648,
'FN !+#2=#C88+,&
#2=#C888J?458C>SA?C8,
)FN !+#2=#C88+,&
#2=#C888J?458C#C3?478,
(FN !+#2=#C88+,&
#2=#C888J?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*,
N1"""+#23456#678987,
""+#23456+N,&:%@N:,
+#26;<8=#+N,&
:!:&
#2>34?7@A4=+!,&
4A77,
N1N"+,
@N% !"!4!
" " &
"@N?!!&
N & !!
& "@N&!
%"%%!& "%!"!"
#"@N&!!
%" "& "!"
"!%"<" ! !
!@N&" "
"%"!!&! !!"!
< ! %!"
"&@N%!!
"% "
K ""!"!"
Rozdział 4.
Zaawansowane obiekty GTK+
139
"" P!
!" !%$&$! !%$BB&$BB
+"%" ,!!
TB&TB&%!!% !
$TB&TB&"""%&!
"!"!% "
6"%!" "!&!!
"@N6"&
"!"&" "! !
=U@N%"!""&
%!%7!
"!:: "!
"!!+@N7!,
$1""+:!$:,
+#26;<8=#+$,&
::&
#2>34?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,श#+$,&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"""+#23456#678987,
""+#23456+!,&:%7!:,
+#26;<8=#+!,&
:!:&
#2>34?7@A4=+!,&
4A77,
Rozdział 4.
Zaawansowane obiekty GTK+
141
!1!"+4A77&4A77,
P"!"!"%!"+,&% "
%"!%!+ ! "!,&
!
"%"!!
":N::!:+ ",
# % ! &
"!%& %!
"7!
$1""+:!$:,
+#26;<8=#+$,&
::&
#2>34?7@A4=+$,&
4A77,
! +#27?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%" !@N7!
P!"""%& %
"%& %"O
"<W ! !"
!
142
Część I
Szybkie wprowadzenie
!+#27?V6A#+!,,
!*+#27?V6A#+!,श#+$,&N &! ,
!"+#27?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"""+#23456#678987,
""+#23456+,&:%
"%:,
4!"!& % "!"
!&!%
"?!"!"!" !&
!"!"
" !"!" " "%
+#26;<8=#+,&
:!:&
#2>34?7@A4=+!,&
4A77,
1"""+4A77&4A77,
N1N"+,
!1""+:"!""
!:,
+#26;<8=#+ !,&
::&
#2>34?7@A4=+ !,&
4A77,
!"!1""+:"":,
+#26;<8=#+ !"!,&
::&
#2>34?7@A4=+ !"!,&
4A77,
N +#2@3J85+N,& !&'BB&'BB,
N +#2@3J85+N,& !"!&TB&XT,
"""*" +#2>=C677853456+,&
N,
+#2=64#?348C+,&,
""+,
+,
B
D
*!+,
/E+,
D
* !+,
/
"" !+#2>=C677853456+,&
#2673=V?A#6K?#3=&
#2673=V?A#6K?#3=,
144
Część I
Szybkie wprowadzenie
D
* !"!+,
/
#%!""
"" !+#2>=C677853456+,&
#2673=V?7?V>&
#2673=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 program
prezentujący
działanie
GtkNotebook
Program prezentujący obiekt GtkPaned
N $
*N '
*!+,
*+,
*+,
*+,
* +,
* N+,
*" +,
+&*-.,
/
Rozdział 4.
Zaawansowane obiekty GTK+
145
&
& N
$&'
+0&0*,
1"""+#23456#678987,
""+#23456+,&:%4:,
+#26;<8=#+,&
:!:&
#2>34?7@A4=+!,&
4A77,
1"+,
+#26;<8=#+,&
:"O :&
#2>34?7@A4=+" ,&
4A77,
> ""
N $1N"+,
$1"+:":,
1""+:C%:,
+#26;<8=#+,&
::&
#2>34?7@A4=+,&
4A77,
1""+:#":,
+#26;<8=#+,&
::&
#2>34?7@A4=+,&
4A77,
1""+:C":,
+#26;<8=#+,&
::&
#2>34?7@A4=+,&
4A77,
N +#2@3J85+N $,&&'B&'B,
N +#2@3J85+N $,&&'B&TB,
N +#2@3J85+N $,&&'B&YB,
+#246#8;662+,&N $&$,
>'
*N '1*N"+#CA8&B,
1""+:5%:,
+#26;<8=#+ ,&
::&
#2>34?7@A4=+ ,&
4A77,
146
Część I
Szybkie wprowadzenie
N1""+:!:,
+#26;<8=#+ N,&
::&
#2>34?7@A4=+ N,&
4A77,
N +#2;6J+*N ',& ,
N +#2;6J+*N ',& N,
'1"+:5:,
+#246#8;662+,&*N '&',
2%&"
+#2=64#?348C+,&,
""+,
+,
B
D
*!+,
/E+,
D
*+,
/
1$
+11(,
1$
"+,
/
$F +#246#8;662+,>#6,
'F +#246#8;662+,>C3I#,
)F +#246#8;662+,>;6##6K,
(F +#246#8;662+,>78@#,
F +:# ! "!"! H:,
D
D
*+,
/
+#246#8;662+,&#CA8,
D
*+,
Rozdział 4.
Zaawansowane obiekty GTK+
147
/
#%&% "%"%
! ! %"&%
+,
+#246#8;662+,&@?7>8,
D
* +,
/
N
N1N"+,
1"+:4"!:,
+#246#8;662+,&N&,
6"
""+,
D
* N+,
/
P"
+:3!ZH:&
+#246#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"""+#23456#678987,
""+#23456+ ,&:%:,
+#26;<8=#+ ,&
:!:&
#2>34?7@A4=+!,&
4A77,
$1 "+,
+#2?485+ $,&'B,
+#2?485+ $,&'B,
$1"+: $"H6 %C#CA8H6 %>
#CA8:,
$+#2?485+ $,& $&#CA8&#CA8,
!"% +,"
! "%!"!&
" "!!"%!"
+, "%&"" !&
!"!
$+, "%
""%& % "%&
"% '+,!+ %,
""% "%
Rozdział 4.
Zaawansowane obiekty GTK+
149
*
!% +,F
"!
" !&!""%+ "%,
%+%,
%"#CA8& !! "
%""!
%"@?7>8& "
%% "
* $1* "+,
+#2?485+* $,&'B,
* $ 1"+:* $H6 %C#CA8H6 %>
@?7>8:,
'+#2?485+ $,&* $&#CA8&@?7>8,
$+#2?485+* $,&* $ &#CA8&@?7>8,
'1 "+,
+#2?485+ ',&'B,
'1"+: '"H6 %C@?7>8H6 %>
#CA8:,
'+#2?485+* $,& '&@?7>8&#CA8,
$+#2?485+ ',& '&@?7>8&#CA8,
* '1* "+,
+#2?485+* ',&T,
+#2?485+* ',&T,
* ' 1"+:* 'HC@?7>8H6 %>@?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