02 Środowisko programistyczne


Rozdział 2
^
Środowisko programistyczne
Poznawanie środowiska Deyeloper Studio
Poruszanie się w oknie roboczym projektu
Zasady zarządzania konfiguracją i ustawieniami projektu Praca z Developer Studio
Środowisko pracy Developer Studio, które wykorzystuje Visual C++ może wydawać się na pierwszy rzut oka nieco złożone. Przeliczywszy szybko, możemy stwierdzić, iż korzysta ono z ponad stu różnorodnych opcji i prawie tylu przycisków kontrolnych. Wiele spośród nich powoduje komplikacje w użytkowaniu okien dialogowych poprzez wielość możliwości wyboru. Taka złożoność jest jednak konieczna, gdyż dzięki temu Developer Studio pozwala pisać bardzo rozbudowane, profesjonalne aplikacje do każdego zastosowania. Nie trzeba się go jednak bać. Wystarczy zrozumieć tylko część całości, aby rozpocząć działanie.
Dopasowywanie środowiska Developer Studio do swoich preferencji
Środowisko pracy w Developer Studio można modyfikować w celu dopasowania do własnych upodobań, na kilka sposobów. Wybierając pozycję Customize umieszczoną w menu Tools, dokonać można zmian dotyczących pasków narzędziowych oraz menu. Za pomocą opcji Options z tego samego menu, zmienić można czcionkę używaną w edytorze plików, kolory oraz inne elementy środowiska.
Otwieranie istniejącego projektu
Jeśli w tym momencie Visual C++ nie jest jeszcze uruchomiony, należy zrobić to teraz, z menu Start na pulpicie. W rozdziale l "Projektowanie i tworzenie programu w Visual C++", utworzony został projekt Minutę.

36
Poznaj Visual C++ 6




Najszybszym sposobem na otwarcie tego projektu jest skorzystanie z listy Recent Workspaces, z menu File. Aby to uczynić, należy kliknąć menu Filc, a następnie wybrać odpowiednią pozycję z listy Recent Workspaces. Objętość tej listy jest jednak ograniczona.
W celu otwarcia projektu nie widniejącego na liście, trzeba kliknąć menu File i wybrać opcję Open Workspaces. Wywołane zostanie okno Open Workspaces, widoczne na rysunku 2.1.

Rysunek 2.1. Otwieranie istniejącego projektu poprzez wybór pliku .dsw
Teraz należy przeszukać katalogi, aby odnaleźć plik projektu Minutę (jeśli lokalizacja domyślna została zaakceptowana, projekt powinien znajdować się w katalogu C:\Program Files\Microsoft Visual StudioNMy ProjectsSMinute). Zaznaczenie pliku Minute.dsw i klik-nięcie Open spowoduje otwarcie projektu.
Automatyczne otwieranie ostatnio opracowywanego projektu
Możliwe jest nakazanie Developer Studio, aby w trakcie uruchamiania automatycznie otwierał ostatnio opracowywany projekt. Aby osiągnąć ten cel, należy wybrać kolejno: menu Tools, pozycję Options, a następnie kartę Workspace. Na karcie tej trzeba odszukać oraz zaznaczyć pole wyboru Reload Last Workspace on Startup.
Którakolwiek z tych metod zostanie użyta, w efekcie projekt zostanie otwarty, a jego nazwa pojawi się na pasku tytułowym okna Developer Studio. Developer Studio automatycznie otworzy ostatni plik źródłowy, nad którym pracowano (patrz rysunek 2.2). Aby ukryć

Środowisko programistyczne 37
okno Output zlokalizowane u dołu ekranu, wystarczy kliknąć mały symbol krzyżyka w lewym górnym rogu tego okna (wskazuje go wskaźnik myszy, rysunek 2.2).
B-ifflxi
^lflJ.xj
: E3 Eite EA Vew [mwt Elojeel gutd Tools Wyidiw UB^
iliaiisH(r) ' -; s' i.-. -
[D @)Ę|' Cjl(|CT,e"Clll
. ...... . ... .. . . .."..'. :-,.s",y,^ssy,"f,;^^,ss;^";.
"nr ~an



5R [_][ Minutę JMOurcBij
CDialog;:OnPaint();


HCURSÓR CMinuteDlg:^OnÓueryDragIcoi^)
: retaiT. (HCORSOR) "_hlcon;
i:}
void CMinuteDlg: :OnPresstIe()
lIessageBoKC-Thanks. I needed that!");

Rysunek 2.2. Developer Studio otwiera projekt w punkcie, w którym przerwano pracę
Można by się zastanawiać, jaka istnieje różnica pomiędzy obszarem roboczym (ang. Workspace) a projektem. Otóż obszar roboczy obejmować może wiele projektów. We wszystkich przykładach podanych w tej książce, każdy obszar roboczy będzie obejmował tylko jeden projekt. Jednakże podczas pracy nad większymi aplikacjami, bardzo często wygodne jest zawarcie większej liczby projektów w jednym obszarze roboczym.
Użycie podprojektów
Możliwe jest utworzenie podprojektów dla projektu głównego i powiązanie ich ze sobą. W takiej sytuacji wprowadzenie zmian w jednym z projektów powoduje odświeżenie zawartości pozostałych.
Okno obszaru roboczego projektu
Okno robocze projektu jest oknem (lokowanym. W programie występuje ich kilka (okno Output jest jednym z takich okien), a niektóre pojawiają się w trybie debug. Aby zmienić charakter okna z dokowanego na pływające, wystarczy podwójnie kliknąć pasek tytułowy tego okna. Jednak praca z oknami dokowanymi będzie prawdopodobnie wygodniejsza. Okno robocze projektu można zamknąć, klikając mały przycisk zamykający w górnym rogu okna.

38 Poznaj Visual C++ 6
Gdy zachodzi potrzeba ponownego otwarcia okna, musimy wybrać pozycję Workspace, znajdującą się w menu View. Każde okno dokowano zachowuje się podobnie.
Gdy okno robocze projektu jest otwarte, pozwala na przemieszczanie się pomiędzy elementami projektu. Kiedy otworzymy projekt, u dołu okna widoczne są zazwyczaj trzy karty: CIassView, ResourceView oraz FileView. W przypadku opracowywania aplikacji służącej do obsługi baz danych może pojawić się jeszcze jedna karta, Data View. Owe karty u dołu okna, reprezentują logiczne części projektu. Wystarczy kliknąć wybraną kartę, by był widoczny odpowiadający jej panel. Każdy spośród tych paneli zawiera graficzną reprezentację drzewa elementów składowych projektu. Kolejne pozycje możemy w miarę potrzeb rozwijać lub zamykać wewnątrz drzewa, klikając symbol (+) lub (-), widniejący po lewej stronie pozycji, do której się odnosi.
Korzystanie z panelu CIassView
Po kliknięciu karty CIassView, zostanie odsłonięty właściwy panel, taki jak na rysunku 2.3. Na tym panelu uwidocznione są wszystkie klasy wchodzące w skład projektu. App Wizard utworzył owe klasy automatycznie w początkowej fazie tworzenia projektu. Każdy element drugiego poziomu (z wyjątkiem pozycji Globals) reprezentuje jedną podklasę i podaje jej nazwę. Rozwinięcie takiej pozycji powoduje wyświetlenie kilku następnych, podrzędnych elementów, z których każdy symbolizuje funkcję składową lub zmienną składową owej klasy. Dla przykładu, podrzędnym elementem podklasy CMinuteDlg, jest funkcja OnPressMeO, która została umieszczona w przykładowym projekcie z rozdziału l. Małe ikony widniejące tuż obok nazwy elementu dostarczają nam o nim dodatkowych informacji (tabela 2.1).
S W Minutę danei
E-"f CAboutDln ' ; " CAbciulDIad
; L S" DoOataEulshansiefCOataElichange "pOX) B "i" CMnuteApp \ t "CMinuliAppl) i '-- ^ ln"lnriancB() B "i; CMinmeDlg
l l " CMinule01g(CWnd "pParenI - MULL) ' . % DoDataE"change(COalaEa:hange pDX| . l ^ OnIntDiabgn l ' '8"OnPainl(l l , 'JOlOnPreBMeflI ; . %> OnC|ueiiiDraglcon()
1 l %" OnSysComniandlUINT nID. LRARAM Parain) l ; %> m_hlcon ffl Cl Globali
" jClałsyeHfsgj Besouci"aij;|ffl^i||i||"j
Rysunek 2.3. Wybór karty CIassView umożliwia manipulację klasami wewnątrz projektu

Środowisko programistyczne________________________________ 39
Tabela 2. l. Ikony wyświetlane z elementami ClassView podają dodatkowe szczegóły
Ikona Znaczenie



Klasa
Funkcja publiczna Funkcja chroniona Funkcja prywatna Zmienna publiczna Zmienna chroniona ^1 Zmienna prywatna
B



Większa część procesu programowania projektu w Visual C++^ polega na wykorzystaniu klas. Z tego powodu panel ClassView jest z reguły najczęściej używany. Dzięki niemu bowiem łatwo jest poruszać się pomiędzy klasami, funkcjami składowymi oraz zmiennymi zawartymi w projekcie. Podwójne kuknięcie którejkolwiek z tych pozycji, powoduje otwarcie właściwego kodu źródłowego w oknie edytora, z kursorem ustawionym w linii, w której rozpoczyna się kod danego elementu.
Dwukrotne kliknięcie pozycji reprezentującej klasę ustawia kursor w miejscu, w którym znajdziemy definicję danej klasy. Podobnie podwójne kliknięcie zmiennej składowej przenosi kursor do miejsca, w którym została ona zdefiniowana. Natomiast gdy dwukrotnie klikniemy nazwę funkcji składowej, to z kolei spowoduje skok do pierwszej linii definicji danej funkcji, w pliku implementacji klasy.
Pasek tytułowy w Developer Studio
Nazwę aktualnie otwartego w edytorze pliku można odczytać z paska tytułowego Developer Studio.
Aby jeszcze bardziej ułatwić poruszanie się pomiędzy klasami projektu, panel ClassView posiada dodatkowe udogodnienia, dostępne z menu skrótów. Menu skrótów otwarte zostaje obok znacznika myszy, gdy odpowiednia pozycja jest kliknięta jej prawym klawiszem. Aby więc otworzyć menu skrótów, należy wybrać właściwy element i kliknąć prawym klawiszem myszy. Wybrana pozycja zostanie podświetlona, a obok otworzy się menu skrótów. Rodzaj tego menu zależy od typu wskazanego elementu listy.
W celu wyświetlenia menu skrótów dla klasy CMinuteDlg, musimy najechać na nią wskaźnikiem myszy, następnie kliknąć jej prawym klawiszem, co w konsekwencji otworzy menu skrótów pokazane na rysunku 2.4.

40 Poznaj Visual C++ 6
!: XŁ.^(tm)"^^.(tm)^Ąti^<.^^.t.ywwwBS^^

i?

ES S^ Minutę cianei



l

B "I" CAboutDlg



a

l l " CAboulDlg()





: 'a" DiiDataE"changB(COalaEiichange pDX)



l

B f CMinuteApp :





: 6 CMinuleAppl) ;



^

, "- ^ Initlmtancell



l

ś-t-Brner 5,1,0^^





: : ^ CMiriL



f

l L ^ nnUa SoToOiabgMtoi



fe

; ^ Oninit ^m^^^^,^gj^3jj^V^|j^BJ^J



l

l ! S$ OnPa AddM"mt"]yaraUs..





^ , -1^ OnPrf AddViilualFunctitin...



l

l ~%Or,Qu AddWindowsMessaga Handler... -pa OnSy; :# l L^m.hicl'^""'6"-



i

SB LI Blobals - D"iv"l Ctatsw... V fiasa Ctes"et...



l

Add to Gafcii!





QJ N esi Folder,.



i

GlOupbyAccess



i

V DockingVtew



i

Htie



i

f^K' " , S'P,spaM,



3ftBaWw|^fiKMBiV"!w ^)FteVew] ii iiii 11'



Rysunek 2.4. Menu skrótów otwarte dla elementu z listy ClassView
Menu skrótów daje nam możliwość przeprowadzania pewnych operacji związanych z wybraną klasą. Wybór pozycji Go to Definition odnosi skutek taki sam, jak podwójne kliknięcie nazwy klasy, czyli ustawienie kursora na początku jej definicji w pliku źródto-wym, otwartym w oknie edytora. Cztery opcje spośród widocznych w menu służą dodawaniu funkcji oraz zmiennych. Użyjemy ich nieco później, gdyż najpierw omówione zostaną w skrócie pozostałe opcje menu.
Gdy klikniemy opcję References, wyświetlony zostanie komunikat widoczny na rysunku 2.5.
Microsoft Vnual C-M
C:\PJog(am FileAMicrosolt Vtsual Studio\M^Proiect!'A1inute\Defaug\MinuFe. Bfowse infotTn-atiofi is ncrf avai)abte for friis pfc^sct
Do you wani you? fc^ild s^lings attefed lit neccssafł'J and yws ptoject refauiR to fleferate bfowse hfofnłation?
Rysunek 2.5. W przypadku niektórych opcji menu skrótów jest wymagany plik dla przeglądarki
Kliknięcie Yes spowoduje wygenerowanie pliku dla przeglądarki i automatyczne przetworzenie projektu. Po wykonaniu tych czynności należy zamknąć okno Output, klikając mały krzyżyk w lewym górnym rogu.
Wygenerowanie informacji dla przeglądarki sprawia, że stają się dostępne dodatkowe ułatwienia w menu skrótów.
Opcja References wyświetla wszystkie miejsca w projekcie, w których następują odwołania do wybranej pozycji z Usty. Dla każdego wskazanego odwołania możemy odczytać

Środowisko programistyczne 41
również nazwę pliku źródłowego i numer linii, w której następuje wywołanie. Możliwy jest także bezpośredni skok do tej konkretnej linii w oknie edytora. Deriyed Ciasses pokazuje szczegóły dotyczące wybranej klasy, a także klas z niej wyprowadzonych. Base CIasses z kolei wyświetla, jak możemy się domyśleć, szczegóły wybranej klasy oraz wyszczególnienie klas bazowych, włączając w to klasy pochodzące z biblioteki MFC (rysunek 2.6).
Gdy z menu skrótów wybierzemy pozycję dotyczącą funkcji i zmiennych składowych, opcja Calls wyświetli wszystkie funkcje wywoływane przez wybrane funkcje składowe, natomiast opcja Called By poda wszystkie miejsca w projekcie, z których dana funkcja jest wywoływana.
Umieszczona w menu skrótów opcja Group By Access używana jest do usystematyzowania elementów składowych funkcji. Gdy opcja Group By Access nie jest zaznaczona, składowe pojawiają się na liście w porządku alfabetycznym. W przeciwnym wypadku porządek odpowiada dostępności konkretnej składowej: prywatne, chronione i na końcu publiczne.



[5"?J Functiora: | :'^| Al
~3i




Public:



;-i -,_J CPalog !;; ;_i CWnd
3 L3 CCmdTaiget ! QCObiecl
CMinuteDlo::CMinul"Dlolcto CWnd -l
Prolecled:
^:CMinu(eDlfl':_6elBaseMessageMap(TOid)
M, CMinuteDlg::DoOalaE"change(claat CDalaEuchange )
^6 CMinuteDlg::GelMesiageMaplvtiidj
CMinuteDlg,:m_hlcon
d S; struci AB<_MSaMAPconsl CMrote01g;:mesaaeMap iW, CMnmeDlg;:Onln"Dialog(void) CMnuleDlg::OnPainl("oid) CMinu>eDlg::Onfi8SsM6(TOid) CMnuteDlg"OnQueiliOraglcofdl,S. iIruclARi.MSGMAP.ENTRYconsrccret CMinuteDlg::_imssageEnlrie



c;\pioafamfiles\mictosoftvtsualstudio^(nv(xoiects\ininute^minuledig.h(1B] c:\piogram filesSmiciosoft visual s>udio\nyipfoiect3\ininute\iTiriute.cpp(57)
Rysunek 2.6. Wybranie opcji Base CIasses ukazuje hierarchię klas
Możemy teraz przystąpić do modyfikowania klasy CMinuteDIg. Pierwszym krokiem będzie wybranie klasy CMinuteDIg i otwarcie dla niej menu skrótów. Dla przypomnienia:
otwiera się je klikając prawym klawiszem myszy nazwę wybranej klasy. Z otwartego menu kontekstowego wybieramy następnie pozycję Add Member Variable. Otworzymy w ten sposób okno dialogowe Add Member Variable pokazane na rysunku 2.7. Jak wskazuje nazwa tego okna, służy ono do dodawania nowych zmiennych do klasy. Musimy ustalić typ nowej zmiennej, nadać jej nazwę oraz zadeklarować tryb dostępu do niej.
Dodawanie do klasy nowych elementów składowych bez edycji kodu źródłowego
Okna dialogowe Add Member Variable oraz Add Member Function, dostępne z menu skrótów panelu ClassView automatycznie umieszczają niezbędne linie kodu w plikach źródłowych klasy, nagłówkowym i implementacyjnym.

42 Poznaj Visual C++ 6
W oknie Variable Type należy wpisać i n t, a w pozycji Variable Declaration wprowadzić m_nClickCount. Tryb dostępu pozostawić należy bieżący, czyli Public. W ten oto sposób dodajemy do klasy CMinuteDlg zmienną typu całkowitego, o nazwie m_ndickCount. Owa zmienna używana będzie jako licznik kliknięć przycisku Press Me. Kiedy już dokonaliśmy niezbędnych wpisów, należy kliknąć OK.
Add Membei Variable
Variable łype: jQy~
Cancel
m_nClickCount rAccess - "-' -'"----.-....-......--.--
l (r Public t~ Protected i" Pr.iv.ate
Rysunek 2.7. Dodawanie nowej zmiennej poprzez ClassView
Konwencja stosowana w nazewnictwie zmiennych składowych
Normalną, aczkolwiek niekonieczną praktyką jest nadawanie zmiennym składowym funkcji nazw z prefiksem m_. Pomaga to podczas czytania kodu rozpoznawać, które zmienne są składowymi danej klasy, a które należą do funkcji. Również zwyczajowo stosuje się oznaczenia typu danej zmiennej w jej nazwie. Przykładowo, litera n w pre-fiksie nazwy oznacza, że zmienna jest zmienną liczbową.
Nowa zmienna powinna pojawić się w panelu ClassView jako element podrzędny klasy CMinuteDlg. Podwójnym kliknięciem wywołujemy okno edytora, z kursorem umieszczonym w miejscu, w którym należy wpisać kod definiujący nową zmienną.
Ponieważ zmienna ta służyć będzie do zliczania kliknięć przycisku Press Me, jej początkowa wartość musi wynosić zero. Właściwym miejscem na zainicjowanie tej zmiennej jest konstruktor klasy CMinuteDlg. Aby dodać kod inicjujący, musimy dwukrotnie kliknąć konstruktor funkcji składowej (jest to pierwsza podrzędna pozycja w klasie CMinuteDlg). Edytor wykona skok do stosownego pliku źródłowego. By zainicjować zmienną zliczającą, wpiszemy kod z listingu 2.1.
Listing 2.1. LST02_1 .CPP - inicjowanie zmiennej składowej w konstruktorze klasy
1 CMinuteDlg::CMinuteDlg(CWnd* pParent /*=NULL*/)
2 : CDialog(CMinuteDlg::IDD, pParent)
3 {
4 //{(AFX_DATA_INIT(CMinuteDlg)

Środowisko programistyczne 43
5 // NOTĘ: the CIassWizard will add member initialization here
6 //}}AFX_DATA_INIT
7 // Notę that Loadlcon does not require a subsequent Destroylcon in Win32
8 m_hlcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
9
10 m_nClickCount =0; O
11 }
O Zmienna m_ndickcount jest inicjowana z wartością O w oknie dialogowym konstruktora klasy.
Początkowa wartość zmiennej wynosi O, teraz musi zwiększać się za każdym razem, kiedy przycisk Press Me zostanie kliknięty. Musimy więc kliknąć dwukrotnie funkcję składową klasy CMinuteDlg, OnPressMe (). W oknie edytora wyświetlona będzie funkcja, która została dodana w przykładzie z rozdziału l. Trzeba pamiętać, że funkcja ta wykonywana jest, gdy komunikat BN_CLICKED zostaje wysyłany do okna dialogowego, po kliknięciu przycisku IDC_PRESS_ME.
By spowodować inkrementację wartości zmiennej, trzeba dodać kod z listingu 2.2.
Listing 2.2. LST02_2.CPP - zliczanie kliknięć przycisku Press Me
1 void CMinuteDlg::OnPressMe()O
2 (
3 MessageBox("Thanks. I needed that.");
4
5 m_nClickCount++; @
6 }
O OnPressMe () jest funkcją obsługi komunikatu, wywoływaną po każdym kliknię-ciu przycisku l DC PRESS ME.
@ W celu wyświetlenia odpowiedniego komunikatu funkcja inkrementuje wartość zmiennej, zliczającej kliknięcia przycisku.
Zmienna zliczająca zostaje powiązana z kuknięciem przycisku. Następnym krokiem, który wykonamy, będzie dodanie nowej funkcji składowej. Należy więc kliknąć prawym klawiszem myszy klasę CMinuteDlg, aby otworzyć menu skrótów, a z niego wybrać pozycję Add Mem-

44 Poznaj Visual C++ 6
ber Function. Pojawi się okno dialogowe z pozycją Add Member Function, jak na rysunku 2.8. Okna tego użyjemy do umieszczenia w klasie CMinuteDlg nowej funkcji składowej.
Add Membet Function

Function Type:
OK




BOOL
Cancel
jClickCountMessage
; Access ---..-, [ '? Public C Protected C- p,jvate
r 5>afc r Virtual
Rysunek 2.8. Dodawanie nowej funkcji składowej poprzez menu skrótów ClassView
W oknie tym musimy określić typ funkcji (jest to typ zmiennej, którą funkcja ma zwracać). W polu Function Type należy umieścić wpis BOOL. Oznacza to, iż zmienna zwracać będzie jedną z dwóch możliwych wartości, TRUE lub FALSE.
Funkcja musi również posiadać odrębną nazwę. W polu Function Declaration należy więc wpisać ClickCountMessage. Jeśli zmienna ta wymaga podania parametrów, możemy to uczynić również w polu Function Declaration.
Jako tryb dostępu do funkcji powinniśmy wskazać Public. Okienka wyboru Static oraz Virtual należy pozostawić nieoznaczone. Po dokonaniu zmian klikamy OK.
Od tego momentu nowa funkcja powinna być widoczna w panelu ClassView, jako podrzędna pozycja w klasie CMinuteDlg, a zapis funkcji w oknie edytora. Teraz należy wpisać kod zgodny z listingiem 2.3.
Ostrzeżenie: dodanie składowej nie powoduje automatycznego zatwierdzenia jej zawartości
Zatwierdzanie zawartości składowej (funkcji lub zmiennej) nie jest przeprowadzane, gdy zostaje ona wpisana do klasy poprzez okno dialogowe Add Member. Możliwe jest popełnienie pomyłki podczas wpisywania. Przykładowo, wpisanie funkcji, której przypisana została wartość zwracana BOO (zamiast BOOL), spowoduje błędy podczas kompilacji. Należy więc dokładnie sprawdzić składnię przed kuknięciem OK.

Środowisko programistyczne_____________________ ___ 45
Listing 2.3. LST02_3.CPP - w zależności od liczby kliknięć, wyświetlony zostanie odpowiedni komunikat
1 BOOL CMinuteDlg::ClickCountMessage()
2 {
3 if (m_nClickCount == 0)
4 (
5 MessageBox("You haven't clicked Press Me", "Don't Leave",
MB_ICONSTOP); O
6 return FALSE; @
7 }
8 if (m_nClickCount > l)
9 (
10 CString str;
11 str.Format("Press Me was clicked %d times", m nClickCount (c)) ;
12 MessageBox(str);
13 }
14 else
15 {
16 MessageBox("Press Me was clicked once");
17 }
18 return TRUE; O
19 }
O Funkcja MessageBox () może używać różnych stylów. W tym przykładzie umieszczony jest znacznik MB_ICONSTOP, który powoduje wyświetlanie znaku stop obok treści komunikatu.
(c) Zwrócona zostaje wartość FALSE, ponieważ wartość zmiennej zliczającej wynosi zero.
(c) Funkcja CString'sFormat () użyta jest do sformułowania tekstu komunikatu, przekazanego następnie do MessageBox ().
O Zwrócona zostaje wartość TRUE, gdy wartość zmiennej zliczającej osiągnie l lub więcej.
Wartość zmiennej m_nClickCount będzie sprawdzana i używana do wyświetlania odpowiedniego komunikatu.
W pierwszym odwołaniu do funkcji MessageBox () w linii 5 umieszczone są dwa dodatkowe argumenty. Pierwszy z nich, "Don' t Leave", jest tytułem okna komunikatu. Znacznik MB_ICONSTOP powoduje wyświetlanie ikony w kształcie znaku stop.

46 Poznaj Visual C++ 6
Pojawiająca się w linii 10 zmienna str należy do klasy cstring, która jest jedną z najbardziej użytecznych klas spośród zawartych w bibliotece MFC. Klasa cstring służy bowiem do obsługi wielu prostych operacji programistycznych, polegających na manipulowaniu tekstem. Funkcja CStringFormat () użyta w linii 11, spełnia to samo zadanie, co funkcja printf () w języku C. Warto zauważyć, że funkcja zwraca FALSE (linia 6), gdy stan licznika równy jest zeru lub TRUE (linia 18) dla każdej innej wartości licznika.
Nowa funkcja jest zatem ukończona, lecz nie używana jeszcze przez program. Powiemy o tym nieco dalej.
Używanie panelu ResoureeYiew
W celu korzystania z panelu ResourceView musimy kliknąć kartę o tej nazwie, widoczną u dołu okna roboczego projektu. Panel otwiera listę zasobów używanych w projekcie, jak widać na rysunku 2.9.

Rysunek 2.9. Wybór karty ResourceView umożliwi operowanie zasobami projektu
Panelu tego użyliśmy już wcześniej, do umieszczenia nowego przycisku. Teraz zostaną omówione inne rodzaje zasobów.
Okno wyświetla wszystkie zasoby użyte w bieżącym projekcie. Termin zasoby (ang. resources odnosi się do wszelkich elementów wizualnych projektu. Przykładowo, zasobami takimi są okna dialogowe, listy menu, a także ikony.

Środowisko programistyczne 47
Rozdzielność plików zasobowych od kodu programu
Przyczyną, dla której zasoby programu nie są jego integralną częścią, jest umożliwienie ich niezależnej obróbki. Pozwala to na tworzenie kilku wersji językowych danej aplikacji, poprzez zmiany zawartości samych plików zasobowych, nie zaś przeróbkę całego kodu źródłowego programu.
Podobnie jak w przypadku ClassView, w panelu ResourceView możemy posługiwać się menu skrótów, klikając prawym klawiszem myszy. Teraz z menu skrótów Minutę Resources wybierzmy pozycję Insert. Okno dialogowe Insert Resources pokazane jest na rysunku 2.10. W oknie tym wyświetlane są różne typy zasobów dostępnych dla projektu w Visual C++.
Tablica akceleratorów jest listą skojarzeń kombinacji klawiszy na klawiaturze z poleceniami programu. Terminem zwykle używanym na określenie akceleratora jest skrót. Skrót stanowi szybszy sposób wywoływania poleceń, niż ich wybieranie z menu. Na przykład, podczas pisania tej książki bardzo często używany był skrót Ctrl+X i było to znacznie wygodniejsze niż wybieranie polecenia Cut z menu Edit.
Inscit Resouice
New

;i^) Bitmap l^i f+! El Cursor IJi Dialog
iH HTML
Q Icon
^) Menu
S SIring Table
S Toolbar
151 Vs["ion
Import,.
Gustom..
Cancel






Rysunek 2.10. Wyświetlone poprzez użycie opcji Insert w menu skrótów ResourceView okno dialogowe wykazuje rodzaje zasobów możliwych do włączenia do projektu
Zasób bitmap jest obrazkiem, o pewnych rozmiarach, złożonym z kropek. Każda taka kropka może posiadać odmienną od innych barwę. Bitmapy używane są między innymi do wyświetlania obrazków na przyciskach, które widzimy w paskach narzędziowych. Ekran powitalny, wyświetlany podczas uruchamiania Visual C++ również jest bitmapą.
Kursor także jest zasobem graficznym. Służy on przede wszystkim jako wskaźnik myszy (standardowy kursor w systemie Windows ma postać strzałki).

48 Poznaj Visual C++ 6
Ikona oczywiście również jest zasobem graficznym. Projekt Minutę posiada ikonę o nazwie IDR_MAINFRAME. Podwójne kliknięcie pozycji IDR_MAINFRAME spowoduje otwarcie ikony w oknie edytora.
Zasób dialogowy jest szablonem okna, które zawierać może zasoby innych typów, jak menu lub przyciski. Edycja tego rodzaju zasobów omówiona zostanie w rozdziale 3, "Tworzenie i projektowanie okien dialogowych".
Zasób menu reprezentuje to, na co wskazuje nazwa, czyli menu. Zwykle aplikacja posiada menu umieszczone u góry okna głównego (na przykład Developer Studio), może ich mieć jednak kilka. Przykładowo nowy zasób menu może zostać dodany do projektu i być używanym przez aplikację jako menu skrótów.
Tablica łańcuchów znakowych powinna zawierać wszystkie zwroty tekstowe używane przez aplikację. Każdy z tych zwrotów posiada odrębną nazwę, która służy do ich powiązania z kodem źródłowym (rysunek 2.11). Powodem umieszczenia wszystkich zwrotów w osobnej tabeli, a nie bezpośrednio w pliku źródłowym, jest ułatwienie tłumaczenia ich na inne języki. Gdy wszystkie zwroty użyte w aplikacji znajdują się w takiej tabeli, inna tabela może zawierać te same zwroty, lecz w innym języku. W momencie startu aplikacji można w takiej sytuacji wybrać odpowiednią tabelę.
SBFind.ic - Stron Table (Strinn Table)
57632 i tsase m teledKimnErase
Rysunek 2.11. Przykładowa tablica łańcuchów
Zasób pasków narzędziowych zawiera zestaw przycisków. Zwykle każdy z nich reprezentuje polecenie, dostępne również z menu. Na przyciskach tych mogą być umieszczane symbole bitmapowe. Do przycisków można również przypisywać podpowiedzi, pojawiające się w "dymkach", gdy wskaźnik myszy znajdzie się ponad przyciskiem.
Zasób wersji zawiera dane o aplikacji, na przykład nazwę firmy autorskiej, numer wersji i tak dalej. Informacje te zapisane są w standardowym formacie, który umożliwia innym aplikacjom dostęp do nich.

Środowisko programistyczne 49
Nowe zasoby możemy dodawać w każdej chwili. Gdy już zostaną dodane, automatycznie otrzymają odrębne nazwy. Dla przykładu, nowe okno dialogowe umieszczone na szablonie mogłoby otrzymać nazwę IDD_DIALOGI. Jednak programiści zwykle zmieniają wygenerowane przez program nazwy, na bardziej wymowne, wyrażające w kontekście programu rodzaj zastosowanego zasobu. Tak było też w momencie, gdy dokonywaliśmy zmiany nazwy IDC_BUTTONI na IDC_PRESS_ME.
Aby obejrzeć nazwy wszystkich zawartych w projekcie zasobów, wybrać należy pozycję Resource Symbols z menu View. Otworzy to okno dialogowe Resource Symbols,
pokazane na rysunku 2.12.
Możliwe jest zlokalizowanie określonego zasobu, gdy na przykład jego nazwa niewiele nam mówi, poprzez kliknięcie nazwy w oknie dialogowym Resource Symbols, dostępnego z menu View, a następnie kliknięcie przycisku View Use.
Relouice Symboli

Name
IDD_ABOUTBOX ' ~ IDD_M1NUTE_DIALOG ffi IDM_ABOUTBOX I IDR.MAINFRAME ff IDS ABOUTBOX
Value In Use
100 rf
102 v
0x0010
128 ^
101 v




(~ Show read-oniy symbols Used by:

Rysunek 2.12. Okno Resource Symbols wyświetla wszystkie zasoby użyte w projekcie
Każdy zasób użyty w projekcie możemy poddać edycji, poprzez podwójne kliknięcie jego nazwy w panelu Resource View. Narzędzia i opcje dostępne w edytorze zmieniają się w zależności od rodzaju edytowanego zasobu. Tworzenie i edytowanie zasobów różnych typów omówione zostanie w następnych rozdziałach.
Tymczasem jednak dokończymy rozwijany przykład. Minutę. Używając panelu Resource View należy postąpić według niżej przedstawionych instrukcji.
Określanie zachowań przycisków w oknie dialogowym
1. Kuknij dwukrotnie pozycję IDD_MINUTE_DIALOG, co otworzy szablon okna dialogowego.
2. Dwukrotnie kliknij przycisk OK.

50______________________________________Poznaj Visual C++ 6
3. Zostanie otwarte okno dialogowe Add Member Function. Kliknij OK, aby zaakceptować bieżącą nazwę funkcji: OnOK. Szkielet nowej funkcji zostanie utworzony i wyświetlony w oknie edytora, w gotowości na wprowadzenie kodu.
4. Wpisz zawartość funkcji OnOK, według listingu 2.4.
5. Dwukrotnie kliknij IDD_MINUTE_DIALOG, by ponownie otworzyć szablon.
6. Kliknij dwa razy przycisk Cancel.
7. Kliknij OK w celu zaakceptowania bieżącej nazwy funkcji: OnCancel.
8. Wprowadź do tej funkcji kod zgodny z listingiem 2.5.
Listing 2.4. LST02_4.CPP - zastąpienie bieżącej funkcji OnOK
1 void CMinuteDlg::OnOK() O
2 {
3 if ( ClickCountMessageO == TRUE )
4 (
5 CDialog::OnOK() ; @
6 ' }
7 }
O Ta funkcja jest nadrzędną wobec aktualnie zaimplementowanej funkcji CDialog:: OnOK () i stanowi procedurę obsługi komunikatu dla przycisku OK.
@ Wywoływana zostaje klasa bazowa dla funkcji OnOK, co powoduje zamknięcie okna dialogowego.
Listing 2.5. LST02_5.CPP - zastąpienie bieżącej funkcji OnCancel
1 void CMinuteDlg: .OnCancel () O
2 {
3 if ( ClickCountMessageO == TRUE )
4 {
5 CDialog::OnCancel();@
6 }
7 )
O Umieszczenie funkcji nadrzędnej nad obecnie zaimplementowaną, CDialog:
: OnCancel (). Funkcja nadrzędna służy do obsługi komunikatu skojarzonego z przyciskiem Cancel. , , : :-

Środowisko programistyczne 51
@ Wywołanie klasy bazowej funkcji OnCancel (), które zamyka okno dialogowe.
Dodaliśmy zatem dwie nowe funkcje. Pierwsza z nich jest nadrzędną dla funkcji CDialog: :OnOK(), druga natomiast dla funkcji CDialog: : OnCancel (). Obie wywołują ten sam efekt, czyli zamknięcie okna dialogowego aplikacji. Teraz jednak będą wywoływane tylko wtedy, gdy funkcja ClickCountMessage () zwróci argument TRUE. Jeśli nie jesteśmy do końca świadomi tego, co przed chwilą uczyniliśmy, powinniśmy wygenerować nowy plik wykonywalny i uruchomić go.
Spróbujmy kliknąć OK lub Cancel, nie dotykając przycisku Press Me. W takiej sytuacji ujrzymy komunikat widoczny na rysunku 2.13, a aplikacja nie zostanie zamknięta, lecz będzie kontynuowała działanie.
Don'" Leave
You haven't ctcked Press Me
Rysunek 2.13. Komunikat wyświetlany, gdy zostanie kliknięty przycisk OK lub Cancel
Teraz kliknijmy kilkukrotnie przycisk Press Me, a następnie OK albo Cancel. Powinno zostać otwarte okno komunikatu, mówiącego nam, ile razy klikęliśmy Press Me (rysunek 2.14). Po naciśnięciu OK lub Cancel aplikacja powinna zostać zamknięta.
Press Me was clicked 4 limes
LOK:
Rysunek 2.14. Komunikat o liczbie kliknięć Press Me
Używanie panelu FileView
Kliknijmy kartę FileView u dołu okna roboczego projektu. Wywoła to okno zawierające listę plików, które składają się na całość projektu (rysunek 2.15).

52 Poznaj Visual C++ 6
-~^--""-^ "(tm)<-"'"o"^'? -!!iiJ!-l:
^. Wotkspace 'Minutę': l projeclff] a -(r) Minutę liln
f-; 3 Source Pies
: .UJ] Minule.cpp
| ; i^j Minróe.fc
: ! iii MinuleDIg.cpp
: |i)SldAf".cpp B O Hsadei Ftos
' i B] Minule.h
B' i MinuteDIg.h ; l- Resource-h i ' IS SlAfn.h
E.-^ Resomce Piłeś : l 30 Minule.ico
;- iB Minute.ic2 _ [1 RcadMe M
ffi 1_1 Eulemal Dependencies
Rysunek 2.15. Użycie panelu FileView umożliwia dostęp do plików składowych projektu
Odtwarzanie informacji z pliku CIassWizard
Jeśli plik .clw usunięty zostanie z katalogu mieszczącego projekt, przy kolejnym uruchomieniu tego kreatora program zapyta, czy odtworzyć plik informacyjny, Jest to czasami konieczne, jeśli nie wszystkie klasy lub identyfikatory widoczne są w oknie dialogowym programu.
Pliki na tej liście są usystematyzowane według typów i przyporządkowane do odpowiednich katalogów. Nie są to jednak katalogi, w których pliki te zostały zapisane na dysku twardym. Celem otwarcia wybranego pliku w oknie edytora należy dwukrotnie kliknąć jego nazwę widniejącą na liście. Jeśli klikniemy plik Minute.rc, otworzy się panel ResourceView, ponieważ plik ten zawiera informacje o użytych w danym projekcie zasobach. Aby .zapoznać się ze standardowymi typami plików powstających w ramach projektu Visual C++, spójrzmy na tabelę 2.2.
Tabela 2.2. Typy plików tworzonych w Developer Studio
Rozszerzenie Typ pliku Opis



.dsw
.dsp
Plik obszaru roboczego
Plik projektu
Umieszcza w obszarze roboczym wszelkie informacje dotyczące projektu
Przechowuje informacje dotyczące samego projektu. Typ ten zastępuje typ .mak


Środowisko programistyczne 53
.clw Plik narzędzia CIassWizard Zawiera informacje o klasach używanych przez narzędzie CIassWizard
.ncb Plik dla przeglądarki Przetrzymuje informacje używane przez paski narzędziowe ClassView oraz CIassWizard
.opt Plik opcji Przechowuje informacje o ustawieniach sposobu wyświetlania obszaru roboczego
.cpp Plik źródłowy C++ Zawiera kod implementacyjny .h Plik nagłówkowy C++ Zawiera kody definiujące i deklarujące klasy
.rc Skrypt pliku zasobów Przechowuje informacje o zasobach, np. menu lub oknach dialogowych
.rc2 Skrypt pliku zasobów Używany jest do włączania tych samych zasobów do różnych projektów
.bmp Plik bitmapowy Zawiera obrazek w formacie bitmapy .ico Plik ikony Zawiera wizerunek ikony
Powyższa tabela nie obejmuje wszystkich rodzajów plików używanych w Visual C++. Gdy za pomocą Eksploratora Windows otworzymy katalog, w którym projekt został zapisany, ujrzymy pliki kilku innych typów. Niektóre spośród nich są plikami tymczasowymi, wykorzystywanymi przez Developer Studio. Inne natomiast zależne są od rodzaju projektu oraz jego zawartości.
Menu skrótów pojawiające się w panelu FileView umożliwia wykonanie kilku użytecznych operacji. Możemy dzięki niemu, na przykład kompilować pojedyncze lub występujące w grupie programy, wchodzące w skład całego projektu. Jest to funkcja użyteczna w sytuacji, gdy pracujemy nad pewnym segmentem projektu i nie występuje w danym momencie potrzeba generowania pliku wykonywalnego. Przy użyciu tego menu, możemy również kopiować do bieżącego projektu pliki z innych projektów.
Zarządzanie projektami
Niegdyś jednym z najistotniejszych procesów wykonywanych przez programistę podczas pisania aplikacji w języku C lub C++ było stałe aktualizowanie specjalnego pliku, tzw. makefile, którego zadaniem było dostarczanie informacji kompilatorowi o tym, w jaki sposób poszczególne programy mają zostać skompilowane, które to programy mają być i w jakim porządku. Developer Studio wyręcza nas w tym złożonym zadaniu, a działając w tle powoduje, że możemy tego nawet nie zauważać. W rzeczywistości projekty w Visual C++ nie korzystają z takiego pliku. Można jednak, gdy zachodzi potrzeba, wygenerować taki plik, wybierając pozycję Export Makefile z menu Project.

54 Poznaj Visual C++ 6
Konfigurowanie projektu
Przy użyciu okna dialogowego Project Settings możemy dokonywać zmian dotyczących działania kompilatora, a także konfiguracji projektu. Aby otworzyć okno Project Settings, musimy wybrać pozycję Settings, którą znajdziemy w menu Project. Okno to widzimy na rysunku 2.16.

Rysunek 2.16. W oknie Project Settings dokonujemy ustawień działania kompilatora, konso-lidatora i innych procesów
Oto kilka bardzo użytecznych opcji, dostępnych w tym oknie:
na karcie Debug możemy określić argumenty linii poleceń dla programu, gdy program ten zostanie uruchomiony
wskazówki dla preprocesora i optymalizacji kompilatora umieszczamy na karcie C++
korzystając z karty Link natomiast możemy określić katalog docelowy dla wygenerowanego pliku wykonywalnego.
Dodatkowe możliwości konfiguracyjne
Nasz projekt Minutę posiada dwie konfiguracje: Debug oraz Release. Możemy jednak tworzyć własne konfiguracje wykorzystujące różne ustawienia optymalizacji, na przykład w celu przeprowadzenia testów wydajności. Aby utworzyć nową lub usunąć istniejącą konfigurację, należy użyć opcji Configurations z menu Build. W większości przypadków jednak konfiguracje Debug i Release będą wystarczające.


Wyszukiwarka

Podobne podstrony:
2008 02 Extreme Programming i CMMI – kreatywność czy dyscyplina (Cz 3) [Inzynieria Oprogramowania]
02 Machine Programming
Środowisko programowe do wyznaczania macierzy odwrotnej do symetrycznej macierzy trójdiagonlanej
02 Machine Programming
5 Wprowadzenie do języka C# i środowiska programistycznego (prezentacja)
02 Struktura programu
1 02 Korzystanie z zalet zintegrowanego ¶rodowiska programi
2006 02 Qt ISO Maker–moja pierwsza aplikacja w Qt [Programowanie]
Programowanie i jezyk C Wyklad 02 Instrukcje
96 02 W Wayt Gibbs (Programowanie w oceanie pierwotnym
02 programowane tryby pracy

więcej podobnych podstron