11 Praca z rysunkami bitmapami


Część III
Elementy aplikacji


Rozdział 11
Praca z rysunkami, bitmapami i ikonami
Tworzenie, importowanie i edytowanie ikon oraz rysunków bitma-powych
Wyświetlanie ilustracji w oknach dialogowych
Implementacja przycisków graficznych
Umieszczanie rysunków na listach, w drzewach i listach rozwijanych
Obiekty graficzne są bardzo ważne dla systemu Windows. Istnieje po temu kilka powodów: są to
znaki międzynarodowe, zajmują mniej miejsca niż opisy słowne i po prostu ładnie wyglądają. Głównym
powodem ich stosowania jest umożliwienie użytkownikowi szybkiego odnajdywania interesujących go
programów i funkcji, bez konieczności czytania tekstu.
Aplikacje Windows korzystają z kilku typów rysunków.
Ikona jest rysunkiem przypisanym do aplikacji i wyświetlana w Eksploratorze Windows.
Wykorzystywana jest również do tworzenia skrótów do aplikacji z Pulpitu.
Rysunki bitmapowe wykorzystywane są do tworzenia ekranów powitalnych, przycisków na paskach
narzędziowych i również mogą być umieszczane w oknach dialogowych i systemowych.
Kursor jest rysunkiem stosowanym do reprezentowania wskaźnika myszy. Różne odmiany kursora
pojawiają się w aplikacjach graficznych i informują o możliwym sposobie edycji danego obiektu.
Edytor zasobów znajdujący się w Developer Studio pozwala tworzyć i edytować każdy z wyżej
opisanych obiektów graficznych. W projekcie możemy umieścić tyle ikon, bitmap i kursorów, ile tylko
chcemy. Później jednak musimy zaimplementować odpowiednie kody pozwalające na korzystanie z tych
zasobów.


248_____________________________________Poznaj Visual C++ 6
Stosowanie edytora graficznego
Edytor zasobów graficznych pozwala na projektowanie różnego rodzaju tych zasobów
(bitmapy, kursory, ikony i paski narzędziowe). Rysować możemy "wolną ręką" lub korzystając
z dostępnych opcji i narzędzi do rysowania kształtów i wypełnień. Okno edytora podzielone
jest zwykle na dwa panele. Panel po lewej stronie przedstawia edytowany obiekt w naturalnej
skali, prawy panel natomiast w powiększeniu. W panelu zawierającym powiększony obraz
możemy przeprowadzać operacje na pojedynczych pikselach. Widok w obu panelach jest
automatycznie odświeżany podczas edycji. Bez względu na to, jaki rodzaj zasobów edytujemy,
wiele spośród funkcji graficznych jest identycznych.
Gdy otwarty jest edytor graficzny, dostępne staje się menu Image. Dostarcza ono kilku opcji.
Opcja Invert Colors umożliwia odwrócenie kolorów w oznaczonym obszarze rysunku. Zaznaczony
obszar może być obracany zarówno w poziomie, jak i w pionie, l Używając menu Image możemy
także definiować i zpisywać własne palety kolorów.
Narzędzia rysujące dostępne są z paska narzędziowego Graphics, kolory wybieramy
natomiast z paska Colors, widocznego na rysunku 11.1. Jeśli paski narzędziowe nie są
widoczne, musimy wykonać poniższe czynności.
Otwieranie pasków narzędziowych Graphics i Colors
1. Wybierz pozycję Customize z menu Tools. Otwarte zostanie okno Customize.
2. Wybierz kartę Toolbars.
3. Na liście Toolbars kliknij pozycje Graphics i Colors.
4. Kliknij Close.
5. Alternatywnie ustaw wskaźnik myszy w pasku menu u góry okna i kliknij prawym klawiszem
myszy.
6. Z menu skrótów wybierz Graphics lub Colors.
Pasek narzędziowy Graphics zawiera narzędzia, które spotkać można w programach do
obróbki grafiki rastrowej. Przykładowo, jest natrysk farby, próbnik koloru, szablony kształtów
regularnych i nieregularnych, wypełnionych i obrysowych itd. U dołu paska Graphics znajduje
się sekcja, w której dokonać możemy wyboru stylu pędzla, grubości linii oraz innych
parametrów, zależnych od rodzaju wybranego narzędzia. Podczas projektowania rysunku,
korzystać możemy z opcji Undo (Cofnij) i Redo (Ponów) z menu Edit, a stosując skróty
klawiaturowe, odpowiednio Ctri+Z oraz Ctri+Y.
Paleta Colors umożliwia wybór koloru rysowania pierwszego planu i tła, poprzez
kliknięcie odpowiednio lewego lub prawego klawisza myszy. Wybrane narzędzie rysuje
kolorem pierwszego planu, gdy naciśnięty jest lewy klawisz myszy, a kolorem tła, gdy
naciśniemy klawisz prawy.


Praca z rysunkami, ikonami i bitmapami 249

Rysunek 11.1. Edycja ikony
O Narzędzia rysowania i edycji
Rysunek nieprzezroczysty
Rysunek przezroczysty
O Kolor ekranu
Odwrócenie kolorów
@ Kolor pierwszego planu
Kolor tła
Podczas edycji ikon i kursorów paleta Colors umożliwia korzystanie z dwóch dodatkowych opcji,
koloru ekranu i koloru odwrotnego (rysunek 11.1). Piksele narysowane kolorem ekranu stają się
przezroczyste podczas wyświetlania kursora lub ikony, tworząc rysunek o nieregularnym kształcie.
Piksele narysowane kolorem odwrotnym, przybierają kolor odwrotny podczas przeciągania ikony.
W edytorze graficznym możemy korzystać również ze schowka, przenosząc doń i wklejając z niego
fragmenty obrazu. Jeśli przykładowo chcemy mieć kilka podobnych ikon, możemy skopiować pewną
część obrazu jednej z nich, a następnie wkleić go do innych. Wklejanie fragmentu możemy
przeprowadzić w trybie przezroczystym lub nieprzezroczystymi, wybierając właściwą opcję z paska
Graphics albo zaznaczając lub usuwając zaznaczenie opcji Draw Opaque z menu Image.


Szczegóły dotyczące projektowania i edycji zasobów pasków narzędziowych znajdziesz w
rozdziale 14.
Tworzenie i edycja ikon
Wizualnie odróżnienie ikony od bitmapy jest trudne, istnieją jednakże pewne istotne
cechy różnicujące. Bitmapa jest tablicą danych, które reprezentują kolor każdego piksela.
Ikona tworzona jest z dwóch bitmap, przy czym pierwsza jest kolorową bitmapą, druga
natomiast maską bitmapową. Poprzez połączenie informacji zawartych w obu bitmapach,
możliwe jest określanie kolorów przezroczystych i odwrotnych ikony. Bardzo często spo-
tykamy ikony, które mają najróżniejsze kształty, są na przykład okrągłe. W rzeczywistości,
wszystkie ikony są kwadratowe; przezroczysta maska umożliwia im przybieranie
nieregularnych kształtów. Każda ikona może zawierać kilka rysunków, których wymiary i
liczba użytych kolorów zależą od aktualnego urządzenia wyświetlającego.
Modyfikacja domyślnej ikony MFC
Aplikacje utworzone przez kreator AppWizard opatrzone są domyślną ikoną. Jest to
trójwymiarowy rysunek piramidki MFC. Identyfikatorem tej ikony jest IDR_MAINFRAME i jest
to ikona przypisana aplikacji. Widać ją także w oknie dialogowym About. Dla przetworzenia
tej ikony według własnych potrzeb należy wykonać procedurę z podrozdziału "Modyfikacja
ikony MFC".
Typowe ikony przypisane aplikacjom lub dokumentom posiadają dwa 16-kolorowe
rysunki: standardowy (32x32 piksele) i małe (16x16 pikseli). Rysunki te są zarejestrowane w
systemie Windows, mogą zatem być wyświetlane w Eksploratorze Windows, menu Start, a
także na pasku zadań.
Modyfikacja ikony MFC
1. Rozwiń katalog Icon w panelu ResourceView i kliknij dwukrotnie pozycję IDR_
MAINFRAME. Domyślna ikona MFC wyświetlona zostanie w otwartym edytorze
(rysunek 11.1).
2. Edytuj obrazek Standard (32x32) używając pasków narzędziowych Graphics i Colors.
Edycja graficzna opisana została w punkcie "Stosowanie edytora graficznego", w tym
samym rozdziale.
3. Z listy rozwijanej Device wybierz pozycję Smali (16x16) i edytuj otwarty obrazek ikony.
Jeśli ta mniejsza wersja ikony nie została dotąd utworzona, system Windows utworzy ją
automatycznie, poprzez pomniejszenie ikony standardowej, w celu wyświetlania w
Eksploratorze Windows i na pasku zadań.


fi\im. iAr\^c
Więcej o rejestrowaniu ikon aplikacji dowiesz się w rozdziale 15.
Umieszczanie nowego zasobu ikony
Każdy projekt może posiadać wiele ikon. Mogą to być ikony narysowane przez nas lub
pobrane z istniejących projektów lub plików typu .ico. Nowo tworzone ikony przyjmują tryb
przezroczystości i domyślne urządzenie wyświetlające VGA, co determinuje ich wymiary
(32x32). Aby utworzyć nową ikonę, należy uczynić co następuje:
Tworzenie nowego zasobu ikony
l. Naciśnij Ctri+R lub wybierz pozycję Resource z menu Insert. Otwarte zostanie okno
dialogowe Insert Resource, widoczne na rysunku 11.2.

Rysunek 11.2. Okno dialogowe Insert Resource
2. Z listy Resource Type wybierz pozycję Icon i kliknij przycisk New. W edytorze
graficznym otwarta zostanie pusta ikona. W celu utworzenia nowej ikony można także
skorzystać ze skrótu klawiaturowego Ctrl+4.
3. Ustal wymiary rysunku za pomocą listy rozwijanej Deyices.
4. Aby nadać rysunkowi nowe wymiary, kliknij przycisk New Device Image po prawej stronie
listy Devices lub naciśnij klawisz Ins. Otwarte zostanie okno dialogowe New Icon Image
widoczne na rysunku 11.3.


252 Poznaj Visual C++ 6


^^^^^^^^^^^^^^HNew Icon Image BOI



^








^arget device: p^




48n43. 256 colors Cancel




Monochrome (32x32] Smalili
6x1 E) Custom,..








Rysunek 11.3. Okno dialogowe New Icon Image
5. Wybierz żądane wymiar z listy Target Device lub kliknij przycisk Custom w celu określenia własnych
wymiarów i liczby kolorów.
6. Z menu View wybierz pozycję Properties. Wyświetlone zostanie okno dialogowe Icon Properties,
które przedstawione jest na rysunku 11.4. Okno to można wywołać także klikając dwukrotnie w
oknie edytora, poza obszarem rysowania ikony.


7.
8.
Wprowadź identyfikator nowej ikony. Tradycyjnie identyfikatory te poprzedzane są prefiksem
IDI_.
Wprowadź nazwę pliku w polu edycji File Name. Jest to czynność opcjonalna, gdyż Developer
Studio generuje własne nazwy dla plików ikon, które przechowuje w podkatalogu /res, głównego
katalogu projektu.


Icon Piopeities
-la T Genaal [ Palette |
ID: |lDI_MYICON~-\
Width: 32 Height: 32 Colots: 16
File narne: res'irnyicon.jco
Rysunek 11.4. Okno dialogowe właściwości ikony
By usunąć ikonę z projektu, należy zaznaczyć jej identyfikator w panelu Resour-ceView, a następnie
nacisnąć klawisz Delete. Czynność ta nie usuwa jednakże pliku .bmp z dysku, co musimy wykonać
własnoręcznie. Aby usunąć ikonę specyficzną dla danego urządzenia, powinniśmy z listy Devices wybrać
właściwy jej rozmiar i z menu Image wybrać pozycję Delete Device Image.
Umieszczanie nowego zasobu bitmapy
Zasoby tego rodzaju wykorzystywane są na wiele sposobów. Można ich użyć do tworzenia na
przykład wizerunku kraciastej flagi, który widoczny jest w ostatnim kroku podczas pracy z kreatorem
AppWizard. Możemy użyć bitmap również do umieszczenia symboli zamiast napisów na przyciskach, ale
o tym powiemy później.


Praca z rysunkami, ikonami i bitmapami 253
Odmiennie niż ikony, bitmapy mogą posiadać wymiary aż do 2048x2048 pikseli. W
odróżnieniu od ikon nie posiadają atrybutów przezroczystości i odwrotnych kolorów. W
projekcie można umieścić dowolną liczbę bitmap. Można narysować je samodzielnie w
edytorze graficznym lub też zaimportować z innych aplikacji pliki z rozszerzeniem .bmp. W
celu utworzenia nowej bitmapy wykonajmy procedurę z podrozdziału "Tworzenie nowego
zasobu bitmapy".
Bitmapę możemy usunąć z projektu w taki sam sposób, co ikonę, czyli naciskając klawisz
Delete po zaznaczeniu jej identyfikatora w panelu ResourceView.
Tworzenie nowego zasobu bitmapy
1. Naciśnij CtrI+R lub wybierz pozycję Resource z menu Insert. Otwarte zostanie okno
dialogowe Insert Resource (rysunek 11.2).
2. Z listy Resource Type wybierz typ Bitmap, a następnie kliknij przycisk New. Utworzona
zostanie pusta bitmapa i otwarta w edytorze zasobów graficznych. Możesz skorzystać
również ze skrótu klawiaturowego Ctrl+5.
3. Z menu View wybierz pozycję Properties, po czym wyświetlone zostanie okno dialogowe
Bitmap Properties, widoczne na rysunku 11.5. Okno właściwości możemy wywołać
także klikając dwukrotnie w obszarze edytora graficznego i wyłączając obszar samej
bitmapy.
Bitmap Piopeitiet
Rysunek 11.5. Okno właściwości bitmapy
4. Wprowadź identyfikator bitmapy. Identyfikatory zasobów tego rodzaju poprzedzane są
zwyczajowo prefiksem IDB_.
5. Ustal żądane wymiary i liczbę kolorów dla bitmapy. Szczegóły dotyczące tej czynności
opisane są w podrozdziale "Ustalanie rozmiarów i liczby kolorów dla bitmapy".
6. W polu edycji Filename wpisz nazwę pliku. Czynność ta nie jest konieczna, gdyż
Developer Studio generuje własne nazwy dla tych plików. Pliki przechowywane są w
podkatalogu /res.
Ustalanie rozmiarów i liczby kolorów dla bitmapy
Domyślnie dla nowego zasobu bitmapy przyjmowane są wymiary 48x48 pikseli, liczba
kolorów natomiast to 16. Dla ustalenia własnych wartości należy wykonać czynności opisa-


254 Poznaj Visual C++ 6
ne w podpunkcie "Modyfikacja atrybutów bitmapy". Gdy bitmapa zostaje zmniejszona, odrzucone są
piksele leżące po prawej dolnej stronie rysunku. Podczas powiększania bitmapy nowe piksele dodawane
są w tych samych obszarach i wypełniane kolorem tła.
Modyfikacja atrybutów bitmapy
1. Rozwiń folder Bitmap w panelu ResourceView i dwukrotnie kliknij identyfikator bitmapy, którą
chcesz edytować.
2. Z menu View wybierz pozycję Properties. Otwarte zostanie okno właściwości bitmapy, czyli Bitmap
Properties. Okno to możesz wywołać również poprzez dwukrotne kliknięcie w obszarze edytora,
lecz poza obszarem samej bitmapy.
3. Kliknij kartę Generał. Wprowadź żądaną szerokość bitmapy (Width) oraz jej wysokość (Height).
Zmiany wymiarów możesz dokonać także poprzez kliknięcie i przeciągnięcie jednego z uchwytów
wymiarujących, widocznych na krawędzi bitmapy.


4.
5.
Z listy rozwijanej Colors wybierz żądaną liczbę kolorów.
Aby dopasować do własnych oczekiwań paletę kolorów, kliknij kartę Palette, a następnie
dwukrotnie kolor, który chcesz zmienić. Otwarte zostanie okno Custom Color Selector, widoczne
na rysunku 11.6. Wybierz odpowiedni kolor i kliknij OK.

SBR HiJe:|il" fled:[?55"
^K::::@i;Sw , . __^ ,________
! ^i!!,",. c-i. hsil r...
,.,...""",".", Sacfzio" 6(een:j Color l,utn:[Tio"
^:filiie:J255'|i^
| OK | ^g^ll}111"^'


Rysunek 11.6. Okno dialogowe Custom Color Selector
Importowanie rysunków
Jeśli ktoś posiada zacięcie do rysowania, prawdopodobnie będzie chciał tworzyć własne obrazki.
Można jednakże importować tego rodzaju zasoby z istniejących plików i projektów, czy też nawet z
plików wykonywalnych, obecnych na dysku komputera. Aby zaimportować ikonę lub bitmapę z plików
.ico i .bmp, wykonać należy czynności opisane w podpunkcie "Importowanie zasobów z pliku". Kiedy
wygenerujemy własny plik wyko-


Praca z rysunkami, ikonami i bitmapami_________________________ 255
nywalny, w jego wnętrzu zapisany zostanie również włączony do projektu zasób graficzny. Odwracając
zatem sytuację, możemy pobierać takie zasoby z plików wykonywalnych innych autorów.
Importowanie zasobów z pliku
1. Wybierz pozycję Import z menu skrótów panelu ResourceView lub wybierz Resour-ce z menu
Insert i kliknij przycisk Import w oknie dialogowym Insert Resouree. Program wyświetli okno
dialogowe Import Resouree. Okno to jest podobne do systemowego okna File Open.
2. Przejrzyj katalogi dyskowe i wybierz plik zawierający interesujący cię zasób. Kliknij następnie
przycisk Import. Aby określić konkretny typ poszukiwanego pliku, posłuż się listą rozwijaną File of
Type.
3. Jeśli wybrany plik jest plikiem zgodnym z oczekiwaniami programu, zasób zostanie dodany do
projektu. Nadany mu zostanie odrębny identyfikator, a jego kopia umieszczona będzie w
podkatalogu /res katalogu aktualnego projektu.
Importowanie zasobów z plików wykonywalnych
1. Z menu File wybierz pozycję Open. Wyświetlone zostanie standardowe systemowe okno otwierania
plików.
2. Z listy rozwijanej Open As wybierz Resources.
3. Odnajdź właściwy katalog i wybierz z niego plik wykonywalny (.exe, .dli lub .ocx), a następnie kliknij
przycisk Open. Zasoby graficzne osadzone w pliku zostaną wyli-stowane w oknie edytora (rysunek
11.7). Dla przykładu wybierz plik Cards.dll, znajdujący się zwykle w katalogu
C:\Windows\System. Wskazane jest zaznaczenie opcji Open as Read-OnIy (Otwórz tylko do
odczytu).
4. W celu przejrzenia zasobów graficznych danego pliku otwórz okno właściwości i przypnij je pinezką,
aby utrzymać w stanie otwartym. Po zaznaczeniu kolejnej pozycji w ramce Preview widoczny
będzie wizerunek danego zasobu.
5. Aby pobrać określony zasób, zaznacz go myszą i przytrzymując wciśnięty klawisz Ctrl przeciągnij do
panelu ResourceView. Zwolnij klawisz myszy, gdy obok przeciąganego obiektu pojawi się znak
plusa. Zasób zostaje włączony do projektu.
6. Z menu File wybierz Close.
Stosowanie rysunków w oknach dialogowych
Istnieją różne sposoby wyświetlania rysunków w oknach dialogowych. Ikony oraz bitmapy są łatwe
do wyświetlenia w oknach za pomocą obiektów rysunkowych i ustalenia właściwości wskazujących
właściwy zasób graficzny. Rysunkowe obiekty użyte mogą być do tworzenia wypełnionych bądź
obrysowych ramek, grupujących kontrolki okna dialogowego.


256 Poznaj Visual C++ 6

Rysunek 11.7. Importowanie zasobów rysunkowych z pliku wykonywalnego
Niniejszy rozdział zajmuje się wykorzystaniem zasobów graficznych. Aby umożliwić tworzenie
rysunków nie będących zasobami w obszarze użytkownika, musimy nadpisać funkcję OnPaint. Jest to
opisane szczegółowo w rozdziale 15.
PATRZ TAKŻE
Szczegóły dotyczące wykorzystania funkcji OnPaintO znajdziesz w rozdziale 15.
Ustalanie właściwości graficznego kontrolki
AppWizard automatycznie dodaje do projektu zasób ikony IDR_MAINFRAME, który przedstawia
piramidkę MFC. W celu pokazania tej ikony AppWizard umieszcza graficzny obiekt w oknie
dialogowym About. Rysunek 11.8 ukazuje okno właściwości tego obiektu. Lista rozwijana Type
określa, z jakim rodzajem rysunku mamy do czynienia i gdy ustalonym typem jest Icon lub Bitmap, w
oknie listy rozwijanej Image pojawia się identyfikator zasobu. Tabela 11.1 opisuje dostępne typy
rysunków, które mogą zostać wyświetlone przez kontrolki graficzne.
|Picuie Ptopeities



-ta ? j Generał ' j

S tyłeś | EntendedStyles j

ID: IDCSTATIC
W Yisible r ,, r
Disabled F
||r uelp ID

J Taić
Eroup Ifflage: T
abstop

Icon ^j



IDRMAIHFRAME ^J



11 J

Rysunek 11.8. Okno dialogowe właściwości Picture Properties


Praca z rysunkami, ikonami i bitmapami 257
Tabela 11.1. Typy rysunków używanych przez kontrolki
Typ rysunku Opis





Frame
Rectangle Icon
Bitmap Enhanced
Metafile
Wyświetla czarną, białą, szarą lub zagłębioną ramkę. Używany do
wizualnego grupowania obiektów w oknie
Wyświetla czarny, biały, szary lub zagłębiony kwadrat
Wyświetla rysunek ikony
Wyświetla rysunek bitmapowy
Wyświetla rysunek zawarty w rozszerzonym metapliku





Co to jest rozszerzony metaplik?
Metaplik przechowuje obraz w formacie niezależnym od urządzenia. Poza przechowywaniem samego
obrazu, metaplik zawiera strukturę opisującą obraz pod względem wymiarów, używanych obiektów
graficznych i zastosowanej palety kolorów. Rozszerzony metaplik stosowany jest tylko w aplikacjach
Win32.
Ładowanie zasobów graficznych podczas pracy programu
Aby załadować ikonę lub bitmapę podczas pracy programu, należy przydzielić zmienną
klasy CStatic do kontrolki graficznej. Musimy w tym celu zmienić identyfikator obiektu z
domyślnie nadanego IDC_STATIC. Tabela 11.2 wykazuje funkcje składowe klasy CStatic
używane do wyznaczania rysunków, które mają zostać wyświetlone przez kontrolkę. Każda z
tych funkcji posiada odpowiednik Get służący do pobierania rysunku.
Tabela 11.2. Funkcje składowe klasy CStatic
Nazwa funkcji Opis działania





Setlcon
SetBitmap
SetCursor
SetEnhMetaFile
Definiuje ikonę do wyświetlenia
Definiuje bitmapę do wyświetlenia
Definiuje kursor do wyświetlenia
Definiuje metaplik do wyświetlenia





Przed wywołaniem którejkolwiek z funkcji wymienionych powyżej, musi zostać zała-
dowany właściwy zasób. Procedura ładowania zależy od typu zasobu. Rysunek 11.9 ukazuje
przykład programu Images ładującego podczas działania bitmapę oraz kilka ikon. Aby
prześledzić działanie tego programu, utworzymy za pomocą kreatora AppWizard nową
aplikację na bazie okna dialogowego, którą nazwiemy Images. Kiedy projekt zosta-


258
Poznaj Visual C++ 6






nie utworzony, wykonajmy procedurę z podrozdziału "Umieszczanie obiektów graficznych w oknie
dialogowym". Po jej wykonaniu, za pomocą CIassWizard przydzielimy każdej z kontrolek zmienną
składową klasy CStatic, wykonując kolejny algorytm z podrozdziału "Przydzielenie zmiennej do
kontrolki graficznej".

Rysunek 11.9. Przykładowy program Images
Umieszczanie obiektów graficznych w oknie dialogowym
1. Rozwiń katalog Dialog w panelu ResourceYiew i kliknij dwukrotnie okno dialogowe, które
zamierzasz edytować. W obecnym przykładzie będzie to IDD_IMAGES _DIALOG. Usuń
widniejący pośrodku szablonu napis TODO: Place Dialog Box Controls Herę, zaznaczając go
kuknięciem, a następnie naciskając klawisz Delete.
2. Wybierz z paska narzędziowego Controls pozycję rysunku i umieść pole rysunku w lewym górnym
rogu szablonu okna.
3. Z menu View wybierz pozycję Properties. Wyświetlone zostanie okno dialogowe Picture Properties.
Używając pinezki widocznej w lewym górnym rogu tego okna, możesz utrzymać je w polu
widzenia.
4. Wprowadź identyfikator ID dla nowego obiektu. W tym przypadku niech będzie to IDC Bl.
5. Dla umieszczonego właśnie obiektu ustal na liście rozwijanej Type jego typ, Bitmap.


Praca z rysunkami, ikonami i bitmapami 259






IW^^oSMABESJIAiS^EllBlitllB^rroBlw)^^^^^^^^""^^^^^^^



"SBk EdU y<-w Iniul
Pl
ifl i^Ha '

pet Buitó La^ouł
Ws
s . .. 0,



-^IfijA






p] E,' |Cjlt|<,pcn ^ H:




DnagesDfc] ^j!

Al
cliii

--
Jji)

.^""
^



^J| S CI.ige>Dlg ^j 3. * :!:--1 1:3 ;';: ! M-:




-: '."i lmag lelouicu
*, U Bfrnap






T
~



1




a 'a Diatoa
' S IDO
ABDIJTB

DX[
En
Bi

-
tiiu
.s
Łr
ot
e



-



^ J.JJJ.J^R^
-^-J 1 ^ -^-J - Cancd j'






ai-Tilcn











^

Y Q Slling TaUe











nnaTi







j

ai-JVafyon











,i( B







j









;



..te bl







j













0







j









\

J

SX a
B'. FT3







l













e3 EB g





















^ in^







l









-.



^ E;?







l













Bfr







l









~



: Q H









1



l

:' i '
"'



'... . ".. . .... ......... . " . . . . ,., .... . .... . : " . . ........ s6 ^Q

:

T








I
~

1

V H





Bt:! CIassYBW j
S^Relource.

JpFiteYi
eW







roi
Rysunek 11.10. Układ okna dialogowego programu Images
6. Wybierz kolejno pięć razy tę samą pozycję z paska Controls i umieść nowe obiekty po prawej strome
pierwszego, jak na rysunku 11.10.
7. Zaznacz pięć nowych obiektów, klikając je kolejno z przytrzymanym klawiszem Ctri. Gdy zaznaczysz
wszystkie, w oknie Properties z listy Type wybierz pozycję Icon.
8. Zaznaczaj po kolei każdy z pięciu obiektów Icon i nadaj im kolejne identyfikatory:
IDCJ1, IDC 12 i tak dalej.
Przydzielenie zmiennej do kontrolki graficznej
1. Naciśnij CtrI+W lub z menu View wybierz pozycję CIassWizard, aby uruchomić ten kreator.
2. Otwórz kartę Member Variables.
3. Z listy rozwijanej Ciass Name wybierz CImagesDIg.
4. Z listy Control IDs wybierz IDC_B1, a następnie kliknij przycisk Add Yariable. Kreator wyświetli
okno dialogowe Add Member Variable. Możesz otworzyć to samo okno klikając dwukrotnie
identyfikator obiektu.
5. Wprowadź nazwę nowej zmiennej, w tym przykładzie m_bl.
6. Z listy Category wybierz pozycję Control. Kliknij przycisk OK.
7. Powtórz czynności 4-6 dla każdego z pozostałych obiektów, nadając przydzielanym zmiennym kolejne
nazwy: m_il, m_i2 itd.


260 Poznaj Visual C++ 6
8. Okno CIassWizard powinno wyglądać jak na rysunku 11.11.


Meaage
Maps 'miect:

MembetYariables | Au

omation Active^ Eyents
CIass name:

Clas Info

AddClass...

^:S..,ymages
\lrfł Control l
D s:

iL'J
iageDlg.h.
C:\"Almage3\!rria Typ

Clmag
esC
gesDIg
.cp
e

3lg p MBtnber

d

AddVariable.,.






fielelaYariable

IDC 11 IDC
12 IDC 13
IDC 14 IDC
15
IDCAMCEL
IDOK
^Bscr^ion"

CS
te
CS
t
cs
>
CS
tc
CS
t
map lo CS tafie
member

atic
Btl
C
alic
3>I
C
atic

m.i1 mi2 mi3
mJ4 mi5



















| OK "j Cancal |

Rysunek 11.11. Okno dialogowe MFC CIassWizard
Ponieważ pierwszy z graficznych obiektów wyświetlał będzie bitmapę, musimy umieścić w projekcie
zasób właśnie tego rodzaju. Rysunek 11.9 pokazuje bitmapę zaimportowaną z pliku Cards.dll. Procedura
importowania opisana została w podpunkcie "Importowanie zasobów z plików wykonywalnych" w
niniejszym rozdziale. Bitmapa użyta w tym przykładzie figuruje pod numerem 64. Gdy zaimportujemy tę
bitmapę, nadajmy jej identyfikator IDB_BEACH.
Bitmapa zostaje załadowana poprzez użycie obiektu CBitmap oraz wywołanie funkcji LoadBitmap z
przekazanym jej identyfikatorem właściwego zasobu. Teraz dodamy do klasy cirnagesDlg zmienną
składową typu CBitmap i nadajmy jej nazwę m_bmp. Dodamy również do treści funkcji OninitialUpdate
kod zapisany na listingu 11.1. Umieśćmy go za komentarzem TODO.
Listing 11.1. LST11_1 .CPP - ładowanie zasobów rysunkowych i ustalanie kontrolek graficznych
l

//

* *

Załadowanie zasobu bitmapy

2

11

**

i ustalenie wyświetlającej ją kontrolki

3

VERIF

Y(mbmp.LoadBitmap(IDBBEACH)) ;

4

m

bl.

SetBitmap(m bmp);

5







6

CWinA

pp* pApp = AfxGetApp();

7

HICON

hicon;

8










Praca z rysunkami, ikonami i bitmapami 261
9 // ** Załadowanie zasobu ikony aplikacji
10 // ** -i ustalenie wyświetlającej ją. kontrolki
11 hicon = pApp->LoadIcon(IDR_MAINFRAME);
12 m_il.Setlcon(hicon);
13
14 // ** Załadowanie kilku standardowych ikon
15 // ** i ustalenie wyświetlających je kontrolek
16 hicon = pApp->LoadStandardIcon(IDI_HAND);
17 m_i2.Setlcon(hicon);
18
19 hicon = pApp->LoadStandardIcon(IDI_QUESTION);
20 m_i3.Setlcon(hicon);
21
22 hicon = pApp->LoadStandardIcon(IDI_EXCLAMATION);
23 m i4.Setlcon(hicon);
24
25 hicon = pApp->LoadStandard!con(IDI_ASTERISK);
26 m_i5.Setlcon(hicon);
Wywołana w linii 3 funkcja LoadBitmap pobiera bitmapę IDB_BEACH i łączy ją ze zmienną
CBitmap, m_bmp. Obiekt CBitmap zostaje przekazany w linii 4 przekazany funkcji CStatic:
:SetBitmap, która informuje kontrolkę powiązaną ze zmienną m_bl, która bitmapa ma zostać
wyświetlona.
Uruchomiona w linii 11 funkcja cwinApp: :Loadlcon pobiera zasób ikony IDR_MAINFRAME i zwraca
HICON (uchwyt graficznego obiektu ikony). Uchwyt ten przekazany zostaje następnie funkcji CStatic:
:Setlcon, informując kontrolkę, którą ikonę ma wyświetlić.
Przy użyciu funkcji cwinApp: :LoadStandardlcon w liniach 16, 19, 22 i 25, załadowane zostają
cztery standardowe ikony systemu Windows. Po przekazaniu identyfikatora wybranej funkcja zwraca
HICON.
Po skompilowaniu i uruchomieniu aplikacji, jej okno powinno wyglądać jak na rysunku 11.9.
Tworzenie graficznych przycisków
Ponieważ obrazki są najczęściej rozpoznawalne szybciej niż tekst, czasem wskazane jest
zastosowanie graficznego oznaczenia przycisku zamiast umieszczania na nim napisu. Biblioteka MFC
dostarcza nam specjalnej klasy CBitmapButton, służącej do realizacji takich zadań. Tworzenie bitmapy
oraz umieszczanie w oknie dialogowym przycisku sterującego przebiega w sposób stosowany dotychczas.
Istnieją jednak dwie rzeczy, o których musimy pamiętać tworząc zasoby graficzne dla przycisków.
Pierwsza, to nadanie bitmapie w polu ID okna właściwości nazwy w postaci łańcucha znakowego,
zamiast


262_____________________________________Poznaj Visual C++ 6
numeru łdefine. Druga to uaktywnienie opcji Owner Draw w oknie właściwości przycisku. Zasób
bitmapy zostaje skojarzony z przyciskiem poprzez funkcję CBitmapBut-ton::AutoLoad.
Używając AppWizard utworzymy nowy projekt na bazie okna dialogowego, nadając mu tytuł Smile.
W przykładzie tym utworzymy własne bitmapy do umieszczenia na przycisku. Widniejący na nim
obrazek będzie się zmieniał, gdy zmieni się stan przycisku, czyli gdy zostanie kliknięty.
Zaczniemy od usunięcia z szablonu okna IDD_SMILE_DIALOG obecnego na jego środku napisu TODO.
Dodamy następnie do szablonu przycisk, który umieścimy w miejscu, w którym widniał usunięty napis.
Nowemu obiektowi sterującemu nadamy identyfikator IDC_SMILE i nagłówek SMILE. Zauważmy, iż
aktualne wymiary przycisku nie grają żadnej roli, gdyż będzie on zwymiarowany tak, by pasował
wielkością do przydzielonej do niego bitmapy.
Tworzenie bitmap dla stanów przycisku
Przycisk znajdować się może w jednym z czterech stanów: wciśnięty, zwolniony,
niedostępny lub aktywny (użycie Enter powoduje wciśnięcie przycisku). Stan przycisku
zmienia się, gdy użytkownik go kliknie lub użyje sekwencji tabulatora, ale może też zostać
zmieniony na drodze programowej. Zwykle przyciski zawierają tekst nagłówka, którego
postać identyfikuje stan przycisku. Przykładowo, napis na przycisku jest przyciemniony, gdy
przycisk jest niedostępny dla użytkownika.
Wygląd przycisków graficznych zależy od autora. Trzeba dostarczyć osobnych rysunków
dla każdego ze stanów przycisku. Gdy ograniczymy się tylko do jednego rysunku, nie
będziemy odbierać informacji zwrotnej po kuknięciu przycisku. Powinniśmy zatem utworzyć
co najmniej dwa rysunki, dla przycisku wciśniętego i zwolnionego. Identyfikatory tych bitmap
muszą być łańcuchami znakowymi (włączając cudzysłowy) opartymi o nagłówek (Caption)
przycisku. Dla przykładu, jeśli nagłówek przycisku brzmi SMILE, identyfikatory bitmap
mogłyby wyglądać: SMILEU - przycisk zwolniony, SMILE D - przycisk wciśnięty, SMILEX -
przycisk niedostępny oraz SMILEF - przycisk aktywny. Potrzebne są więc cztery odrębne
bitmapy dla każdego ze stanów przycisku. W celu ich wykonania, przeprowadźmy poniższy
algorytm "Tworzenie bitmapowych rysunków dla przycisku".
Tworzenie bitmapowych rysunków dla przycisku
1. Naciśnij Ctrl+5, by otworzyć edytor graficzny z otwartą w nim pustą bitmapą.
2. Z menu View wybierz pozycję Properties. Wyświetlone zostanie okno dialogowe Bitmap
Properties.
3. W polu listy ID wpisz "SMILEU" (wraz ze znakami cudzysłowu).
4. Przeprowadź edycję bitmapy, aby wyglądała jak jedna z widocznych na rysunku 11.12.


Praca z rysunkami, ikonami i bitmapami 263

^MiISB^Ł^^SIliItSHfe.-^SsaBals^SM^^^^ Rysunek 11.12. Bitmapy dla przycisku
zwolnionego i wciśniętego
5. Powtórz kroki 1-4 w celu utworzenia trzech pozostałych bitmap.
6. Wprowadź identyfikatory dla bitmap: "SMILED", "SMILEF" oraz "SMILEX". Dokonaj edycji
bitmap, aby otrzymać zestaw widoczny na rysunkach 11.12 oraz 11.13.

Rysunek 11.13. Bitmapy dla przycisku aktywnego i niedostępnego


264 Poznaj Visual C++ 6
Użycie klasy przycisku graficznego
Jak wspomniano wcześniej, biblioteka MFC dostarcza klasę CBitmapButton umożliwiającą
nakładanie bitmap na przyciski. Klasa ta jest pochodną klasy CButton i obejmuje jedynie kilka funkcji
składowych. Implementuje ona wirtualną funkcję Drawitem, która wywoływana jest dla obiektów
narysowanych przez programistę. Jedyną funkcją, którą sami musimy wywołać, jest AutoLoad.
Dodamy zmienną składową typu CBitmapButton do klasy CSmileDIg. Nadajmy jej nazwę
m_bbsmile. Następnie w funkcji Oninitialupdate, tuż za komentarzem // TODO, umieśćmy
następujący wpis:
VERIFY(m_bbSmile.AutoLoad(IDC_SMILE, this) ;
Makro VERIFY użyte zostaje do sprawdzenia kodu zwróconego przez funkcję AutoLoad. Jeśli
wartością tą jest FALSE, twierdzenie jest ustawione w tryb Debug. Jak widzimy, funkcji AutoLoad
przekazany zostaje identyfikator zasobu przycisku, IDC SMILE. Stąd pobiera ona nagłówek i ładuje
bitmapy o nazwach bazujących na nagłówku.
Ostatnią rzeczą, którą musimy zrobić przed wygenerowaniem ostatecznego kodu wykonywalnego,
jest ustalenie sposobu na postawienie przycisku w stan niedostępności. Uczynić to możemy przez
modyfikację przycisku Cancel. Pierwszą modyfikacją będzie zmiana nagłówka na Dis/Enable i
identyfikatora na ID_DISENABLE. Następnie powinniśmy utworzyć funkcję obsługi komunikatu
BN_CLICKED dla tego przycisku. W funkcji tej należy wpisać poniższy kod, umieściwszy go za
komentarzem // TODO:
m_bb3mile.EnableWindow( !m_bbSmile.IsWindowEnabled() ) ;
Teraz możemy już skompilować i uruchomić program Smile. Spróbujmy wykorzystać sekwencję
tabulatora. Zobaczymy, że rysunek na przycisku zmienia się, gdy przycisk staje się i przestaje być
aktywny. Spróbujmy również przełączać go w stan niedostępności. Jeśli klik-niemy przycisk i
przytrzymamy klawisz myszy, powinien on wyglądać jak na rysunku 11.14.

Rysunek 11,14. Program Smile


fiMKŁ IAIU.E
Więcej informacji na temat makra VERIFY uzyskasz w rozdziale 27.
Pomocy odnośnie dodawania funkcji obsługi szukaj w rozdziale 4.
Używanie rysunków w obiektach sterujących
Omówiliśmy już użycie bitmap na przyciskach, lecz wykorzystanie rysunków wspiera także kilka
innych obiektów sterujących, takich jak listy, drzewa oraz nowy typ obiektu rozszerzone listy
rozwijane. Obiekty te służą do przechowywania spisu określonych elementów. Każdy element posiada
zwykle opis tekstowy, ale może być również skojarzony z dwoma rysunkami: jednym, gdy element jest
zaznaczony, drugim dla sytuacji przeciwnej. Rysunki owe mogą być bitmapami oraz ikonami.
Modyfikowanie listy obrazów
Możliwe jest dodawanie, usuwanie i zastępowanie obrazów wewnątrz listy, a także umożliwienie
rysowania przezroczystego poprzez określenie maski.
Istota list obrazów
Rysunki wymieniane na listach, drzewach lub listach rozwijanych muszą znajdować się na liście
obrazów. Lista ta jest obiektem klasy cirnageList. Po utworzeniu takiego obiektu umieszczane w nim są
bitmapy i ikony. Wszystkie elementy listy muszą mieć te same rozmiary. Wskaźnik do obiektu
cirnageList jest przekazywany do kontrolki poprzez wywołanie funkcji składowej SetlmageList. Gdy do
listy zostaje dodany nowy element, kojarzony jest z rysunkiem na liście rysunków i określany jego
indeks, począwszy od zera. Ponieważ lista obrazów jest obiektem odseparowanym od kontrolki, umożli-
wia to innym kontrolkom korzystanie z niej.
Aby przestudiować konstruowanie listy obrazów oraz jej użycie przez kontrolkę, utworzymy za
pomocą kreatora AppWizard nowy projekt na bazie okna dialogowego, który nazwiemy Shapes. Po
utworzeniu projektu przyszła pora na rysunki. Gdy chcemy dodać do listy kilka rysunków, najprostszą
metodą jest skonstruowanie jednej bitmapy zawierającej je wszystkie. Przykład obecny wymaga ośmiu
rysunków zawartych w jednej bitmapie, która widoczna jest na rysunku 11.15.



Rysunek 11.15. Bitmapa z elementami listy rysunkowej
Utworzymy zatem nowy zasób bitmapy, nadając mu identyfikator IDB_SHAPES i wymiary: Width
(szerokość) 118 i Height (wysokość) 16 pikseli. Następnie przeprowadzić musimy edycję bitmapy, aby
wyglądała jak na rysunku 11.15. Jeśli mamy wątpliwości, jak utworzyć nową bitmapę, musimy cofnąć się
do podpunktów "Tworzenie nowego zasobu bitmapy" oraz "Używanie edytora graficznego", obecne
wcześniej, w niniejszym rozdziale.
Następnie na szablonie okna dialogowego IDD_SHAPES_DIALOG umieśćmy pole listy, listę drzewiastą
oraz listę kombinowaną, jak na rysunku 11.16. Identyfikatorem pola listy będzie IDC_LISTI. Z listy
kombinowanej View na karcie Styles wybrać musimy List. Lista drzewiasta otrzyma identyfikator
IDC_TREEI. Na karcie Styles dodatkowo zaznaczyć musimy opcje Has Buttons, Has Lines oraz Lines as
Root. W oknie właściwości listy kombinowanej wprowadzamy identyfikator IDC_COMBOBOXEXI i z karty
Styles wybieramy pozycję Drop List, którą znajdziemy na liście Type.


Praca z rysunkami, ikonami i bitmapami 267

Rysunek 11.16. Układ okna dialogowego programu Shapes
Teraz musimy użyć CIassWizard w celu dodania do klasy cshapesDlg zmiennej składowej dla
każdej kontrolki. Zmiennym nadajmy nazwy: m_list, m_tree oraz m_combo. Dla wszystkich wybieramy
również typ Control z listy Category. Po dodaniu zmiennych, karta Member Variables w kreatorze
CIassWizard powinna wyglądać jak na rysunku 11.17.
FC CIauWizald BE31

MessageMaps Membef Variables Automation | ActiveX Events | CIassInfo l Ploject; a,wst)me: Add CIas-
s...

auBUa^^^^^^^^^l l-- - AddYaiable...

CortiollOs; Type Membel 2elcleVaiiable

IDP r:nMROBnXEX1 CComboBoxE m combo ^HMMMfl

IDFII^TI CLiitCtlI m ll;t ."":..:":.;.."<..

IDC TREE1 CTreeCtiI m tlee IDCANCEL '":::-

1DOK

: : : | OK 1 Cancel |

Rysunek 11.17. OknoMFC CIassWizard
PATRZ TAKŻE
Informacji na temat umieszczania pól listy w oknach dialogowych szukaj w rozdziale 6.
Więcej informacji o używaniu list drzewiastych znajdziesz w rozdziale 19. Więcej informacji o
używaniu pól listy znajdziesz w rozdziale 19.


268_____________________________________Poznaj Visual C++ 6
Tworzenie i stosowanie list obrazów
Lista obrazów przechowuje kolekcję bitmap używanych przez kontrolki. Lista ta zawarta jest w
obiekcie klasy cirnageList. Dodajmy więc do klasy cshapesDlg zmienną składową m_imageList klasy
cirnageList. Cały kod konieczny do utworzenia listy obrazów i umieszczenia elementów na liście
drzewiastej można umieścić w funkcji Oninitia-lUpdate. Wprowadźmy zatem kod z listingu 11.2,
umieszczając go w tejże funkcji, za komentarzem // TODO.
Listing 11.2. LST11_2.CPP - tworzenie i użycie listy rysunków





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// ** Utworzenie nazw dla rysunków
static char* shape[] = {
"Square", "Rectangle", "Parallelogram",
"Trapezoid", "Triangle", "Octagon"};
int nShapes = 6;
// ** Załadowanie zasobu bitmapy CBitmap
bitmap;
VERIFY(bitmap.LoadBitmap(IDB_SHAPES)) ;
// ** Utworzenie listy obrazów i dodanie bitmapy
m_imagelist.Create(IDB_SHAPES, 16, l, 0) ;
m_imagelist.Add(&bitmap, (COLORREF)OxFFFFFF) ;
// ** Utworzenie pola listy, korzystającego z listy obrazów
m_list.Set!mageList(&m_imagelist, LVSIL_SMALL) ;
// ** Umieszczenie w polu listy 6 pozycji
l / ** i nadanie im indeksów
for(int i = 0; i < nShapes; i++)
m list.Insertltem(i, shape[i], i);
// ** Utworzenie listy drzewiastej, korzystającej z listy obrazów
m_tree.Set!mageList(&m_imagelist, TVSIL_NORMAL) ;
// ** Umieszczenie dwóch pozycji najwyższego poziomu listy II **
Ustalenie rysunków normalny/wybrany dla katalogu // **
zamkniętego/otwartego HTREEITEM hTetragons, hOther;
hTetragons = m tree.InsertItem("Tetragons", 6, 7) ;
hOther = m tree.Insertitem("Other", 6, 7);


Praca z rysunkami, ikonami i bitmapami 269
32 // ** Umieszczenie pierwszych trzech kształtów jako podelementów
33 // ** "Tetragons" oraz trzech ostatnich jako podelementów "Other"
34 for (i =0; i < nShapes; i++)
35 m tree.Insertltem(shape[i], i, i,
36 i < 3 ? hTetragons : hOther) ;
37
38 // ** Utworzenie listy kombinowanej, korzystającej z listy obrazów
39 m combo.SetImageList(&m imagelist);
40
41 // ** Alokacja struktury elementów listy i ustawienie maski
42 COMBOBOXEXITEM cbitem;
43 cbitem.mask = CBEIF_TEXT|CBEIF_IMAGE|CBEIF_SELECTEDIMAGE;
44
45 // ** Umieszczenie 6 elementów na liście kombinowanej
46 // ** Ustawienie tego samego rysunku dla trybu normalny/wybrany
47 ford = 0; i < nShapes; i++)
48 (
49 cbitem.pszText = shape[i];
50 ,cbitem.iltem = i;
51 cbitem.ilmage = cbitem.iSelectedImage = i;
52 m_combo.Insertitem(Sebitem);
53 }______________________________________________________
Na pierwszy rzut oka, powyższy listing wydaje się bardzo złożony, ale w rzeczywistości
zawiera jedynie 28 linii kodu; reszta to komentarze.
W linii 2 utworzona zostaje tablica łańcuchów znakowych, nazwana shape. Nazwy w niej
zawarte dotyczą pierwszych sześciu rysunków z bitmapy IDB_SHAPES. W linii 9 lokalna
zmienna CBitmap użyta zostaje do załadowania zasobu IDB_SHAPES.
Tworzenie listy obrazów
Dostępnych jest kilka przeciążonych wersji cirnageList: :Create. Umożliwiają one
przekazywanie łańcucha znakowego identyfikatora zasobu lub wiązanie dwóch list w
jedną.
Obiekt klasy cimageList zainicjalizowany zostaje w linii 12 z wywołaniem funkcji Create.
Pierwszym parametrem jest identyfikator zasobu, a drugim szerokość każdego rysunku, podana
w pikselach. Trzeci parametr może być maską koloru, umożliwiającą zastosowanie
przezroczystości. Kiedy lista obrazów jest zainicjalizowana, rysunki dodawane są poprzez
wywołanie funkcji Ado. (linia 13). Przekazany zostaje adres bitmapy, w związku z czym
następuje załadowanie wszystkich ośmiu rysunków.


270_____________________________________Poznaj Visual C++ 6
Po zainicjalizowaniu listy obrazów mogą z niej korzystać kontrolki. W tym celu dla każdego
obiektu kolejno wywołuje się funkcję SetlmageList, jak widać w liniach 16, 24 i 39. Niezależnie od
adresu rysunku, polu listy oraz liście drzewiastej przekazywane są dodatkowe parametry określające typ
listy obrazów. Tabele 11.3 i 11.4 wymieniają możliwe typy.
Inicjalizacja listy obrazów
W celu dodania ikony do listy obrazów można posłużyć się przeciążoną wersją Add, która pobiera
HICON jako parametr. Aby dodać do listy rysunki bezpośrednio z dysku, należy wywołać funkcję Read.
Tabela 11.3. Typy listy obrazów dla pola listy Typ
listy rysunków Opis typu
LVS I L_NORMAL Lista z dużymi ikonami LVS l L_SMALL Lista z
małymi ikonami LVSIL_STATE Lista z rysunkami dla różnych
stanów
Tabela 11.4. Typy listy obrazów dla listy drzewiastej Typ listy
rysunków Opis typu
TVS IL_NORMAL Lista rysunków dla pozycji zaznaczonej i niezaznaczonej TVSIL_STATE Lista
rysunków dla stanów określonych przez użytkownika
Elementy listy są na niej umieszczane poprzez pętlę for w linii 20. Funkcji Inser-tltem przekazane są
trzy parametry: pierwszym jest pozycja elementu na liście, drugim tekst opisujący element, trzeci
natomiast określa pozycję rysunku na liście. W obecnym przykładzie parametr i podlega inkrementacji, a
więc pozycje listy obrazów umieszczane są na liście kolejno.
Lista drzewiasta posiada dwa elementy najwyższego poziomu, czyli roots, "korzenie";
oba posiadają po trzy podelementy. Elementy najwyższego poziomu umieszczane są na liście w liniach
29 i 30. Wywoływana tam funkcja insertitem pobiera tekst opisu jako pierwszy parametr. Drugi określa
pozycję rysunku dla elementu nie wybranego (teczka zamknięta) - w tym przypadku jest to numer 6 na
liście obrazów. Trzeci z parametrów z kolei określa pozycję rysunku dla wybranego elementu (opisany
numerem 7).
Podelementy listy drzewiastej umieszczane są w niej poprzez pętlę for w linii 34. Występuje tu
przeciążenie funkcji Insertitem posługującej się czterema parametrami. Pierwszym jest opis
podelementu. Drugi i trzeci określają pozycje rysunków dla podele-


Praca z rysunkami, ikonami i bitmapami 271
mentów, odpowiednio niewybranego oraz wybranego (w przykładzie Shapes oba stany reprezentowane
są przez ten sam rysunek). W czwartym parametrze określa się docelowy katalog: hTetragons lub
hOther.
Umieszczenie elementów na liście kombinowanej odbywa się inną metodą. Należy w tym
przypadku zapisać w zmiennej cbitem struktury COMBOBOXEXITEM dane elementu, a następnie przekazać
adres zmiennej funkcji Insertitem. Umieszczony w linii 43 znacznik ma s k określa, które elementy
struktury są ważne lub inaczej, które zmienne struktury zostaną użyte. Jak widać w linii 51, obu
zmiennym, ilmage oraz iSelectedl-mage przydzielona zostaje ta pozycja tego samego rysunku.
Po skompilowaniu i uruchomieniu program powinien wyglądać jak na rysunku 11.18.

Rysunek 11.18. Program Shapes w pełnej krasie


Wyszukiwarka

Podobne podstrony:
11 Wykonywanie rysunku odzieżowego
11 Praca w grupie
11 Rejestr Windows Praca z rejestremid602
Rysunki do wykladu nr 3  marca 11
11 ul praca agencyjna
praca dyplomowa?ycja wbn1 11

więcej podobnych podstron