Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
J.Matulewski,T.Dziubak,M.Sylwestrzak,R.Płoszajczak,Grafika.Fizyka.Metodynumeryczne.
Symulacjefizycznezwizualizacj
ą
3D,Warszawa2010
ISBN978-83-01-16178-1,©byWNPWN2010
34
CzęśćI.GrafikatrójwymiarowawOpenGL
glLoadIdentity();
//left,right,bottom,top,znear,zfar(clipping)
floatwsp=wysokoscObszaruUzytkownika/(float)szerokoscObszaruUzytkownika;
if(!rzutowanieIzometryczne)
glFrustum(-0.1,0.1,wsp*-0.1,wsp*0.1,0.3,100.0);
else
glOrtho(-3,3,wsp*-3,wsp*3,0.3,100.0);
glMatrixMode(GL_MODELVIEW);//powrótdomacierzywidokumodelu
glEnable(GL_DEPTH_TEST);//z-bufferaktywny=ukrywanieniewidocznychpowierzchni
}
6.Pozostajewywołaćpowyższemetody:metodyInitWGLiUstawienieScenypo
otrzymaniuprzezoknokomunikatuWM_CREATE,UsunWGLpoodebraniu
WM_DESTROY,aRysujSceneWM_PAINT.Wtymprojekciewykorzystamymecha-
nizmwiązaniametodzkomunikatami.ZacznijmyodkomunikatuWM_CREATE:
a.Przejdźmydowidokuprojektowaniaoknadialogowego.
b.Zaznaczmyoknowpodglądzie.
c.WpodokniePropertieswybierzmyzakładkękomunikatów(ikonaMessagesna
paskunarzędzitegookna).
d.OdszukajmykomunikatWM_CREATEirozwińmyznajdującąsięprzynimrozwi-
janąlistę.Wybierzmyzniejpolecenie<Add>OnCreate.
e.Zostaniemyprzeniesienidoedytorakodupliku…Dlg.cpp,wktórymutwo-
rzonazostałanowametodaOnCreate.JejwiązaniezkomunikatemWM_CREATE
znajdujesięwumieszczonymnapoczątkutegosamegoplikublokumakrroz-
poczynającymsięodBEGIN_MESSAGE_MAP,akończącymnaEND_MESSAGE
_MAP.
f.Wnowejmetodzie,wmiejscuzaznaczonymkomentarzem„TODO”umieść-
mywywołaniametodInitWGLiUstawienieSceny.
7.ZupełniepodobniestwórzmymetodęOnDestroy,zktórejwywołajmymetodę
UsunWGL.
8.Pamiętajmyrównieżoreakcjinazmianęrozmiaruokna:stwórzmymetodęzwią-
zanązkomunikatemWM_SIzEiwywołajmyzniejmetodęUstawienieSceny.
9.NiecoinaczejwyglądasprawareakcjinakomunikatWM_PAINT.Związanaznim
metodaOnPaintjestjużzdefiniowanaiwypełnionapoleceniami,którychwięk-
szośćwykonywanajesttylkowtedy,gdyoknojestzminimalizowane,conas
oczywiścienieinteresuje.Wprzeciwnymprzypadkuwywoływanajestmetoda
OnPaintklasybazowejCDialog.Iwłaśniepojejwywołaniuumieśćmywywoła-
niemetodyRysujScene(listing1.20).
Listing1.20.ObsługakomunikatuWM_PAINTwmetodzieOnPaint
voidCOknoGLDlg::OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//konteksturządzeniasłużącegodorysowania