Kurz IDE Visual C++ (3.)
V tΘto lekci najdete nßvod, jak vytvo°it aplikaci pro kurz DirectDraw a
najdete zde popis okna obsahujφcφ ClassView, ResourceView a FileView.
3.1. Projekt pro DirectDraw
Nejd°φve si vytvo°φme standardnφ aplikaci podle MFC AppWizardu.
Z menu File vyberte New. V dialogu zvolte nßsledujφcφ polo₧ky:
Na dalÜφm dialogu zvolte volbu Single Document a odÜkrtn∞te
polφΦko Document/View architecture support takto:
Na dialogu Φ. 2 a 3 nechte vÜe tak jak je.
Na dalÜφm, ΦtvrtΘm, dialogu odÜkrtn∞te vÜechny polφΦka takto:
Zbytek Wizardu odklikejte a dokonΦete projekt.
Rozbalte ClassView a uvidφte vÜechny vytvo°enΘ t°φdy:
Nynφ ka₧dou t°φdu n∞jak²m zp∙sobem upravφme tak, aby vyhovovala naÜim
po₧adavk∙m.
CAboutDlg
Poklepejte v ClassView na tuto t°φdu. V pravΘm okn∞ se otev°e soubor, kde
je umφst∞na jak deklarace tak i implementace. Sma₧te obojφ: deklaraci i implementaci.
T°φda by vßm m∞la ·pln∞ zmizet z ClassView.
CChildView
P°epn∞te na kartu FileView:
OznaΦte soubory ChildView.cpp a ChildView.h a
sma₧te je. T°φda CChildView vßm zmizφ z ClassView.
CDirectDrawApp
Nejprve poklepejte na jmΘno t°φdy a vyma₧te z deklarace
t°φdy CDirectDrawApp tento °ßdek:
afx_msg void OnAppAbout();
Pak poklepejte na funkci InitInstance() . Tφm se dostanete
do souboru DirectDraw.cpp . Najd∞te Message map na zaΦßtku souboru a vyma₧te
nßsledujφcφ °ßdek:
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
Dßle p°idejte Φlenskou funkci WinInit() a virtußlnφ funkci
Run() .
Klin∞te prav²m tlaΦφtkem na jmΘno t°φdy CDirectDrawApp .
Rozbalφ se vßm nßsledujφcφ menu:
Za prvΘ vyberte polo₧ku Add member function.... Nßsledujφcφ dialog vypl≥te zhruba takto:
za druhΘ vyberte polo₧ku Add virtual function.... Na dialogu oznaΦte
funkci Run() a stiskn∞te tlaΦφtko Add and edit.
Tφm jste p°idali dv∞ ΦlenskΘ funkce Run() a WinInit() .
Nynφ napiÜte t∞lo funkce WinInit() :
HRESULT CDirectDrawApp::WinInit()
{
WNDCLASSEX wc;
CBrush brBack;
HWND hWnd = NULL;
brBack.CreateSolidBrush(RGB(0, 0, 0));
// Register the Window Class
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpszClassName = "DD Class";
wc.lpfnWndProc = MainWndProc;
wc.style = CS_VREDRAW | CS_HREDRAW;
wc.hInstance = m_hInstance;
wc.hIcon = LoadIcon(IDI_DD);
wc.hCursor = NULL;
wc.hbrBackground = brBack;
wc.lpszMenuName = NULL;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hIconSm = LoadIcon(IDI_DD);
//register window class
if( RegisterClassEx( &wc ) != 0 ) {
m_pMainWnd = new CFrameWnd;
if(m_pMainWnd->CreateEx(0, "DD Class", "DirectDraw", WS_POPUP,
CRect(0, 0, 800, 600), NULL, NULL)) {
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
}
else {
return 1;
}
}
else {
return 1;
}
return 0;
}
Funkce vracφ hodnotu 0, pokud je ·sp∞Ünß, v opaΦnΘm p°φpad∞ vrßtφ 1.
Musφte p°idat ikonu do zdroj∙ vaÜeho projektu. Identifikßtor ikony bude IDI_DD a je celkem
jedno, jak bude ikona vypadat, proto₧e nebude vid∞t. StaΦφ, kdy₧ p°ejmenujete stßvajφcφ ikonu
IDR_MAINFRAME .
DalÜφ velice d∙le₧itou v∞cφ je deklarace procedury okna. Tato procedura musφ b²t deklarovßna
v hlaviΦkovΘm souboru DirectDraw.h takto:
LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
PotΘ p°idejete t∞lo funkce do implementaΦnφho souboru DirectDraw.cpp . T∞lo prozatφm bude
vypadat nßsledovn∞:
LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
return DefWindowProc(hWnd, msg, wParam, lParam);
}
Dßle upravφme funkci InitInstance() . U₧ nechceme ₧ßdnΘ okno t°φdy
CMainFrame , ale vlastnφ, kterΘ
jsme vytvo°ili ve funkci WinInit() , tak₧e upravte funkci takto:
BOOL CDirectDrawApp::InitInstance()
{
if(0 == WinInit()) {
return TRUE;
}
return FALSE;
}
Nakonec sma₧te °ßdek:
#include "MainFrm.h"
ze souboru DirectDraw.cpp .
CMainFrame
Odstra≥te hlaviΦkov² i implemntaΦnφ soubor tΘto t°φdy z FileView.
Op∞t tato t°φda zmizφ z ClassView.
Otev°ete si Pr∙zkumnφka, najd∞te adresß° vaÜeho projektu a sma₧te nßsledujφcφ
soubory: MainFrm.h, MainFrm.cpp, ChildView.h a ChildView.cpp .
Nynφ spus¥t∞ ClassWizard z menu View. Okno ClassWizardu vypadß takto:
Vyberte t°φdu CAboutDlg z menu Class name. CW vßs upozornφ, ₧e t°φda neexistuje.
Stiskn∞te OK a v nßsledujφcφm dialogu stiskn∞te tlaΦφtko Remove. Tak donutφme
CW, aby si t°φdu vymazal ze svΘ databßze.
Tento postup prove∩te pro zb²vajφcφ odstran∞nΘ t°φdy CMainFrame a CChildView .
A₧ vßm v menu zbyde pouze t°φda CDirectDrawApp stiskn∞te OK.
ClassView by m∞lo vypadat n∞jak takto:
A₧ do te∩ jsme pouze mazali, od te∩ u₧ budeme jen p°idßvat.
Vlo₧te t°φdu CControl .
Z menu Insert zvolte New class.... Objevφ se vßm nßsledujφcφ
dialog.
V ClassView se objevφ novß t°φda CControl . Do tΘto t°φdy p°idejte
Φlenskou funkci DDInit() . Funkce mß nßsledujφcφ
prototyp:
HRESULT DDInit(HWND hWnd);
Modifikujte tuto funkci dle nßvodu z druhΘho kurzu.
Vra¥me se ke t°φd∞ CDirectDrawApp . Do hlaviΦkovΘho souboru tΘto t°φdy vlo₧te
hlaviΦkov² soubor control.h a vlo₧te Φlenskou prom∞nnou
m_theControl typu CControl .
Funkci InitInstance() pak upravte tak, aby volala funkci
DDInit() t°φdy CControl
a inicializovala systΘm DirectDraw.
Tak a to je vÜe. Pokud vÜechny ·pravy provedete sprßvn∞ a p°idßte
k≤d z druhΘho kurzu, aplikace p∙jde spustit. Po spuÜt∞nφ se p°epne rozliÜenφ,
ale bude vid∞t pouze bφlß plocha okna. Vytvo°en² projekt si m∙₧ete stßhnout
v sekci Downloads.
3.2. ClassView, ResourceView a FileView
Jak u₧ nßzev napovφdß, jednß se o jakΘsi pohledy na vßÜ projekt.
Ka₧d² pohled se programßtorovi hodφ na n∞co jinΘho.
- ClassView pohlφ₧φ na vßÜ projekt ze strany objektovΘho programovßnφ,
proto₧e vidφte t°φdy, ΦlenskΘ funkce a atributy jednotliv²ch t°φd.
Tento pohled se hodφ pro p°φstup k jednotliv²m funkcφm.
- ResourceView pohlφ₧φ na projekt z pohledu zdroj∙ tzn. ikon, kurzor∙ nebo bitmap.
D∙le₧itΘ je, ₧e tento pohled je mo₧n² jen v projektech MFC. Zde m∙₧ete p°idßvat
r∙znΘ zdroje pro vßÜ projekt. Tyto zdroje budou ulo₧eny v budoucφm .exe souboru, tak₧e
pokud to p°e₧enete, bude i vßÜ program p°ehnan∞ velk². Nap°φklad bitmapy je lepÜφ
naΦφtat z externφch soubor∙, proto₧e b²vajφ v∞tÜφ.
- FileView je Φasto pou₧φvan²m pohledem, proto₧e vßm umo₧nφ p°φstup
k jednotliv²m soubor∙m projektu. FileView je prakticky rozd∞len na n∞kolik
adresß°∙ podle typu souboru. Pokud chcete p°idat nebo vyjmout soubor z projektu,
m∙₧ete to ud∞lat prßv∞ pomocφ FileView. Ostatnφ pohledy na zm∞ny ve FileView
okam₧it∞ reagujφ.
Nynφ si jednotlivΘ pohledy rozebereme trochu podrobn∞ji.
3.2.1. ClassView
ClassView vypadß n∞jak takto:
Vidφte t°φdy CControl a CDirectDrawApp a jejich ΦlenskΘ
funkce a prom∞nnΘ. V adresß°i Globals jsou globßlnφ
prvky projektu (funkce i prom∞nnΘ).
U pohled∙ Φasto pou₧φvßme kontextovΘ menu. I ClassView
mß svΘ kontextovΘ menu, kterΘ pou₧φvßme
pro upravu t°φd. V₧dy upravujete tu t°φdu, na kterou
jste klepli prav²m tlaΦφtkem.
KontextovΘ menu vypadß takto:
- Go to definition - p°ejde na deklaraci t°φdy tzn. ke klφΦovΘmu
slovu
class v hlaviΦkovΘm souboru t°φdy. Stejnou funkci provedete poklepanφm
na jmΘno t°φdy.
- Add member Function... - p°idß Φlenskou funkci do t°φdy. Zobrazφ se tento
dialog:
Vyplnφte nßvratovou hodnotu (Function type), jmΘno (Function declaration) a p°φstupovΘ prßva funkce (Access).
Dßle m∙₧ete zvolit, zda-li je danß funkce virtualnφ (virtual) Φi statickß (static).
Po stisknutφ tlaΦφtka OK se do deklarace t°φdy p°idß deklarace funkce a v implementaΦnφm souboru
se vytvo°φ prßzdnΘ t∞lo funkce.
- Add member Variable... - p°idß Φlenskou prom∞nnou. Princip je stejn² jako u funkce.
- Add virtual Function... - p°idß virtußlnφ funkci t°φdy MFC. Pokud
je t°φda odvozenß od n∞jakΘ MFC t°φdy m∞la by mφt tato t°φda k dispozici
tuto volbu pro p°idßnφ virtußlnφch funkcφ, kterΘ lze takto p°etφ₧it.
- Add Window Message Handler... - p°idß obslu₧nou funkci pro smyΦku
zprßv. Op∞t je tato polo₧ka p°φstupnß jek pokud pracujete s MFC t°φdou.
Funkce je p°idßna do t°φdy (do specißlnφho bloku v deklaraci t°φdy), dßle
je p°idßn odkaz v Map∞ zprßv (Message map) a samoz°ejm∞ vytvo°φ t∞lo funkce, kterΘ
v∞tÜinou obsahuje jeden Φi dva °ßdky.
Ostatnφ polo₧ky jsou pro nßs celkem nepodstatnΘ.
Pokud vyvolßte kontextovΘ menu u funkce Φi prom∞nnΘ, zjistφte, ₧e nenφ
·pln∞ stejnΘ jako u t°φdy. Nap°φklad funkci takto m∙₧ete smazat, pak
je deklarace funkce smazßna a t∞lo funkce je zakomentovßno.
3.2.2. ResourceView
ResourceView vypadß n∞jak takto:
Vidφte vÜechny zdroje, kterΘ pou₧φvß vßÜ projekt prakticky rozt°φd∞nΘ
podle typu (nap°. ikony, bitmapy nebo kurzory). ResourceView
umo₧≥uje importovat existujicφ soubory nebo vytvß°et vlastnφ. Pokud p°idßvßte
n∞jaky standardnφ typ jako t°eba soubor .bmp , ResourceView ho automaticky
vlo₧φ to adresß°e Bitmap. Pokud se pokusφte importovat nestandarnφ
zdroj jak²m je i zvukov² soubor .wav , budete po₧ßdßni o vytvo°enφ
zcela novΘho adresß°e. V ResourceView mu₧ete zdroje upravovat, ale
jen omezen∞, proto₧e nap°φklad internφ bitmapov² editor nedokß₧e zobrazit bitmapu,
kterΘ mß vφce jak 256 barev.
Ka₧dΘmu zdroji p°i°azujete unikßtnφ (pouze ve vaÜem projektu) ID Φili identifikßtor,
kter² je pak pou₧φvßn v programu. VÜechny id jsou definovßny v souboru resource.h
a informace o samotn²ch zdrojφch je ulo₧ena v souboru s p°φponou .rc .
Jak u₧ bylo zmφn∞no v²Üe, ResourceView je dostupn² pouze z projekt∙ MFC, jinak
se zdroje musφ vklßdat zvenΦφ a ruΦn∞. Toto je dalÜφ v²hoda MFC. Na druhou stranu
vßm tento systΘm m∙₧e p°inΘst °adu nep°φjemnostφ, proto₧e tak m∙₧ete snadno a rychle
vytvo°it v²sledn² program velik² a tφm i pomal². DoporuΦuji vklßdat do zdroj∙ pouze
soubory malΘ jako jsou ikony nebo kurzory a zdroje, kterΘ jinak vlo₧it nejdou anebo jdou, ale
s mnohem v∞tÜφm usilφm. Rozhodn∞ bitmapy naΦφtejte z externφch soubor∙.
3.2.3. FileView
FileView vypadß n∞jak takto:
Vidφte adresß° Header Files, kter² obsahuje hlaviΦkovΘ soubory vaÜeho
projektu. Dßle vidφte adresß° Source Files, kter² obsahuje
implementaΦnφ soubory s p°φponou .cpp . Adresß° Resource Files
obsahuje
soubory, kterΘ souvisφ se zdroji (nap°φklad obsahuje soubor *.rc , kter²
byl popsßn v²Üe).
P°es FileView m∙₧ete vklßdat konkrΘtnφ soubory do vaÜeho projektu.
M∙₧ete je samoz°ejm∞ mazat Φi editovat.
T°φdy, zdroje a soubory m∙₧ete vklßdat i p°es menu.
T°φdu vlo₧φte p°φkazem New Class... z menu Insert. Stejn∞ tak
vlo₧φte i zdroj p°φkazem Resource... z menu Insert.
Soubory do projektu vklßdßte p°es menu Project a Add to project.
Zde m∙₧ete vlo₧it bu∩to ΦistΘ soubory (New...) anebo soubory vytvo°enΘ p°edem(Files...).
|