/******************************************************************************* Moduli: kuva.cpp Tarkoitus: Sekä Kuva- että Alkukuva-ikkunalla on yhteinen viestinkäsitte- lytaulukko. Muiden kuin cMuunnettuIkkuna-ikkunoiden kahvat ovat taulukossa tGHwndt W, tietuessa Projekti: Winlin Tekijät: Virpi Kivinen ja Tiina Mäkinen Tehty: 1.1.96 Muutettu: 21.4.96 Mitä muutettu: static LONG MyDraw(tMSGParam *msg):ssa msg->hWnd:n mukaan et- sitään se cMuunnettuIkkuna,joka piirretään. Piirtäminen tapah- tuu cMuunnettuIkkuna-luokan metodeilla. Koordinaatisto piirre- tään aina siten että Muunnos-matriisi on yksikkömatriisi. Kolmas koodinaattiakseli piirretään vain, jos valittu dimensio on vähintään kolme. Alkukuvan Muunnos-matriisi on aina yksikkömatriisi. Kuvan Muunnos-matriisia kerrotaan vielä ennen otusten kuvien piirtoa MATRIISI-dialogista kerätyllä matriisilla. Tarkistetaan ennen Otuksen piirtoa, Otus->piirretaanko, voidaanko Otus piirtää kysessä olevaan ikkunaan. Muutettu: 8.6.96 Mitä muutettu: + static LONG WM_command_piirra_viimeinen(tMSGParam *msg) -piirretään viimeisin tietorakenteeseen lisätty otus vain. Muutettu: 13.6.96 Mitä muutettu: Jos menussa on valittuna Verkko -Näkyy,koordinaatistoon piir- retään myös ruudukko. Muutettu: 12.7.96 Mitä muutettu: Pistepiirtojen yksinkertaistaminen Oma piirto eli viivan piirto muutettu yhdenmukaisemmaksi muiden piirtojen kanssa. Yksinkertaistettu yhden pisteen piirtoa ja lbuttondown-viestin käsittelyä. tee_yhdella_- , tee_kahdella_- ja tee_kolmella_pis- teella aliohjelmat muodostavat vain halutun matriisin ja itse piirrettävä otus luodaan ja lisätään tietorakenteeseen vasta WM_lbuttondown-alihjelman lopussa. Muutettu: 14.7.96 Mitä muutettu: 14.7.96 pistepiirtojen yksinkertaistaminen. Piirtolaatikkoa ei lisätä enää tietorakenteeseen (2 ja 3 pisteen piirrossa). tee_kahdella-pisteella yksinkertaisemmiksi. Piirrettävää objektia (W.kuka) ei nollata. Mousemovessa kahden pisteen piirto kunnossa. Muutettu: 15.7.96 Mitä muutettu: + int muuta_matriisia(cVec &loppup,tGHwndt) Muutettu: 18.7.96 Mitä muutettu: Viivan piirto -viesti samaan käsittelyyn muiden piirtojen kans- sa. WM_lisaa -viestin käsittely siirretty työkaluikkunaan, kos- ka jo siellä pystytään muuttamaan tietuetta W (ei ylimääräisten viestien lähettämistä). Muutettu: 20.7.96 Mitä muutettu: Tee kolmella pisteell„ laittomasti viel„ cViivalla ja cKuutiol- la. int muuta_matriisia() muutettu. Muutettu: 1.8.96 Mitä muutettu: static int hiiri_alhaalla pois; viivan piirto kuten muutkin WM_lbuttonup -viestin käsittely pois. aliohjelmaan tee_otus lisätty case -lauseeseen tapaus OMA, joka lisää kuvaan uuden viivan. Muutettu: 3.8.96 Mitä muutettu: Siistitty muuta_matriisia sekä mousemovea. Muutettu: 7.8.96 Mitä muutettu: Muuteltu matriisi_3p Muutettu: 21.08.96 Mitä muutettu: +Kullekin piirrolle oma kursori. Muutettu: 22.08.96 Mitä muutettu: +kursorit taulukkoon (W.hcur[]), niiden tuhoaminen, ikkunan aktiivisuus Puutteet: KOLMEN PISTEEN LITTOINEN MATRIISI!!!! tällä olisi saanut piirrettyä viivan samoin kuin muutkin -matriisi_3p on RAAKA!(kuva.cpp) aliohjelma tekee kolmen pisteen piirron lopullisen matriisin ehk„ liian monimutkaisesti -matriisiin voi kirjoittaa! (niin voi vaihtajaankin!!!!) matriisin edit-ikkunoihin pystyy kirjoittamaan, mutta kuvattaessa siihen kirjoitetaan se matriisi, joka siit„ pystyttiin lukemaan -PERSPEKTIIVI! säilyttää pituuden, eli ei ole syvyysperspektiiviä, jossa takana oleva näyttää pienemmältä (tässä on kavaljeeri perspektiivi) -poistot ei saa poistettua yksitellen vaan poistaa kaikki kerralla Aliohjelmat: ============ static LONG WM_lbuttondown(tMSGParam *msg) -Tämän viestin saavat vain kuva - ja alkukuvaikkuna. Viestin saaneen ikkunan kahva tarkistetaan. Jos viesti tulee kuvaikkunalle, return 0;, joten ei ole mahdollista yrittää piirtää alkukuvia muuas kuin alkukuvaikkunaan. -Kutsuu aliohjelmia - mika_vari_valittuna(hMenu), otukselle vari - onistuiko(virhe,msg->hWnd), ilmoittaa, jos tietorakenne on täynnä, lähettää viestin ,jolla alkukuvaan piirreään viimeksi tehty otus. - tee_oma - tee_yhdella_pisteella - tee_kahdella_pisteella - tee_kolmella_pisteella static LONG WM_command_kuvaa(tMSGParam *msg) -Kutsuu cSateellinen luokan metodia aseta_kuvattu, joka muuttaa cSateellisessa tiedon siita, onko sitä kuvattu vai ei. Viesti lähetetään kuntyökalupalkissa on valittu Kuvaa. static LONG WM_command_kierto(tMSGParam *msg) -Kutsuu aliohjelmaa aseta_kulma(int ax,HWND ikkuna), joka asettaa matriisiin R halutun akselin suuntaista kiertoa vastaavan matriisiin ja kertoo sillä ikkunan koordinaatiston kiertomatriisia (Apu). cSateelliset piirretään ker- rottuna Muunnos- ja koordinaatistonkiertomatriiseilla. static LONG WM_command_paluu(tMSGParam *msg) -Muuttaa aktiivisen ikkunan koordinaatistonkiertomatriisin yksikkömatriisiksi, jolloin koordinaatisto oikenee. static LONG WM_command_poista(tMSGParam *msg) -Kutsuu tietorakenteen metodia tuhoa,joka poistaa tietorakenteesta kaikki piirrettävät. static LONG WM_command_zoomaa(tMSGParam *msg) -Muuttaa ikkunan yhden yksikön mittaa (pikseleissä,I->muuta_step(MUUTOS)) isommaksi tai pinemmäksi viestissä tulleen suunnan mukaan static LONG WM_nclbuttondown(tMSGParam *msg) -Laittaa sen ikkunan aktiiviseksi, jonka otsikkopalkkia (tai reunaa) on näpäytetty hiirellä. *******************************************************************************/ #include #include #include #include"mjonot.h" #include"kahvat.h" #include"mdialog.h" #include"tabhand.h" #include"winlin.h" #define VALMIS 700 #define EKA 701 //14.07 #define VIKA 702 #define EKA_KOLME 703 //20.07 static int stop = 0; static int Checking = 0; int MyCheckMessage(void) { if ( stop ) { stop = 0; return 1; } MSG msg; Checking = 1; while ( !stop && PeekMessage(&msg,0,0,0,PM_REMOVE ) ) { TranslateMessage(&msg); /* Tulkitaan virtuaaliset näp. koodit */ DispatchMessage(&msg); /* Lähetetään viesti ikkunalle */ } Checking = 0; #if 1 if ( stop ) { stop = 0; return 1; } return 0; #else return stop; #endif } cVarit color; cOtukset Otukset; int aseta_kulma(int ax,HWND ikkuna)//kierrot! { cMuunnettuIkkuna *I; cMatrix R; switch (ax) { case X_KIERTO: R.kierto(KULMA,1); break; case Y_KIERTO: R.kierto(KULMA,2); break; case Z_KIERTO: R.kierto(KULMA,3); break; case X_NEG: R.kierto(-KULMA,1);break; case Y_NEG: R.kierto(-KULMA,2);break; case Z_NEG: R.kierto(-KULMA,3);break; } if ( (I=ikkunat.etsi(ikkuna)) == NULL ) return 0; I->sijoita(R); //kertoo ikkunan koordinaatistonkiertomatriisin return 0; } double lue_zkoord(void) { char s[40]; double a=0.0; GetDlgItemText(W.Hwndt[2],IDC_ZKOORD,s,sizeof(s)); poista_merkit(s," "); //mjonot.c vaihda(s,sizeof(s),",","."); if (sscanf(s,"%lg",&a)!=1) { SetDlgItemInt(W.Hwndt[2],IDC_ZKOORD,0,TRUE); a=0.0; } return a; } int matriisi_2p(const cVec &paikka,const cVec &skaalaus,cMatrix &R,int siirretaan=1) // int matriisi_2p(cMatrix &R,int siirretaan=1) /*Aliohjelmassa tehdään skaalaus- + siirtomatriisi ,jolla uutta objektia kerrotaan sitä luotaessa. Matriisiluokassa oleva skaalaus-metodi skaalaa joka suuntaan yhtä paljon (ei voi nyt käyttää)!!ON MUUTETTU!26.06*/ { R.diagonaali(); cMatrix apu; double x=skaalaus[0]-paikka[0]; double y=skaalaus[1]-paikka[1]; // double x=W.leveys[0]-W.sijoitus[0]; // double y=W.leveys[1]-W.sijoitus[1]; R[0][0] = x; R[1][1] = y; if (siirretaan) apu.siirto(W.sijoitus[0],W.sijoitus[1],lue_zkoord()); R = apu * R; return 0; } int tarkistus(double a2,double b2,double c2,double &jakaja,double &osoittaja) { jakaja=2*b2*c2; if (-EPSILON<=jakaja&&jakaja<=0.0) jakaja=-EPSILON; if (0.0<=jakaja&&jakaja<=EPSILON) jakaja=EPSILON; osoittaja=b2*b2+c2*c2-a2*a2; if (osoittaja/jakaja>=1.0-EPSILON) osoittaja=jakaja; if (osoittaja/jakaja<=-1.0+EPSILON) osoittaja=-1.0*jakaja; return 0; } double kierto_kulma(double k,double l,cVec a1,cVec b1) //laskee kiertokulman { if (-EPSILONa1[1]) return 90; if (-EPSILONa1[1]|| 0.0<=k&&k0||c1[1]>suoralla&&b1[0]<0) apu[1][1] = -c2*sin(M_PI/2-h);// y-skaalaus else apu[1][1] = c2*sin(M_PI/2-h);// y-skaalaus R = apu * R; //VÄÄNTÖ: if (!(90.0-EPSILON< angle && angle< 90.0+EPSILON) ) { //ei tan(M_PI/2)!! if ((c1[1]<=suoralla&&b1[0]>0)||(c1[1]>suoralla&&b1[0]<0)) apu.vaanto(-tan(h),1); // nega- else // tai apu.vaanto(tan(h),1); // positiivinen vääntö x-akselin suuntaan R = apu * R; } } //KIERTO: angle=kierto_kulma(k,l,a1,b1); if (b1[0]<0) apu.kierto((180+angle),3); //negatiivinen kulma, kun b1:n x-koord. < 0. else apu.kierto(angle,3); R = apu * R; //SIIRTO: apu.siirto(eka[0],eka[1],lue_zkoord()); R = apu * R; return 0; } int tee_oma(tMSGParam *msg,cMuunnettuIkkuna *I,cMatrix &R,int lkm)//1.8. { POINT ap; cVec alkup; if (lkm==0) { ap=MAKEPOINTS(msg->lParam); cVec apu(ap.x,ap.y); W.sijoitus=I->vektori_reaaliksi(apu); R.siirto(W.sijoitus[0],W.sijoitus[1],lue_zkoord()); return EKA_KOLME; // return EKA; } if (lkm==1) { ap=MAKEPOINTS(msg->lParam); cVec apu(ap.x,ap.y); W.leveys=I->vektori_reaaliksi(apu); return VIKA; } return 0; } int tee_yhdella_pisteella(tMSGParam *msg,cMuunnettuIkkuna *I,cMatrix &R) /*Yhden pisteen piirto: matriisiin R lasketaan piirrettävän objektin syttymispaikka (12.07)*/ { POINT ap; cVec alkup; ap=MAKEPOINTS(msg->lParam); cVec apu(ap.x,ap.y); alkup=I->vektori_reaaliksi(apu); R.siirto(alkup[0],alkup[1],lue_zkoord()); return VALMIS; } int tee_kahdella_pisteella(tMSGParam *msg,cMuunnettuIkkuna *I,cMatrix &R,int lkm)//14.7 /*Kahden pisteen piirto: Objekti syttyy kun hiirellä on klikattu kahta pistettä (muutetaan reaalisiksi). Kutsuu aliohjelmaa matriisi_2p, joka tekee klikatuis- ta pisteistä objektin piirtoa varten matriisin.*/ { POINT ap; if (lkm==0) { ap=MAKEPOINTS(msg->lParam); cVec apu(ap.x,ap.y); W.sijoitus=I->vektori_reaaliksi(apu); R.siirto(W.sijoitus[0],W.sijoitus[1],lue_zkoord()); return EKA; } if (lkm==1) { ap=MAKEPOINTS(msg->lParam); cVec apu(ap.x,ap.y); W.leveys=I->vektori_reaaliksi(apu); matriisi_2p(W.sijoitus,W.leveys,R); // matriisi_2p(R); return VIKA; } return 0; } int tee_kolmella_pisteella(tMSGParam *msg,cMuunnettuIkkuna *I,cMatrix &R,int lkm)//14.07 /*Kolmen pisteen piirto: Objekti syttyy kun hiirellä on klikattu kolmea pistettä (muutetaan reaalisiksi). Kutsuu aliohjelmaa matriisi_3p, joka tekee klikatuista pisteistä objektin piirtoa varten matriisin. Parametrina viedään matriisi jossa on objektin syttymispaikka. */ { POINT ap; cVec alkup; if (lkm==0) { ap=MAKEPOINTS(msg->lParam); cVec apu(ap.x,ap.y); W.sijoitus=I->vektori_reaaliksi(apu); R.siirto(W.sijoitus[0],W.sijoitus[1],lue_zkoord()); return EKA_KOLME; // return EKA; } if (lkm==1) { ap=MAKEPOINTS(msg->lParam); cVec apu(ap.x,ap.y); W.leveys=I->vektori_reaaliksi(apu); return EKA; // return 0; } if (lkm==2) { ap=MAKEPOINTS(msg->lParam); cVec apu(ap.x,ap.y); alkup=I->vektori_reaaliksi(apu); matriisi_3p(W.sijoitus,W.leveys,alkup,R); return VIKA; } return 0; } cVec uusi_loppupiste(POINT &ulp,LPARAM lParam,cMuunnettuIkkuna *I) { ulp=MAKEPOINTS(lParam); cVec apu(ulp.x,ulp.y); return (I->vektori_reaaliksi(apu)); } int muuta_matriisia(cVec &loppup,tGHwndt W) { if ( W.piirto == 2){ W.otus->aseta_loppupiste(loppup); return 0; } if ( W.piirto == 3 || W.kuka == OMA ){ //jos litteän kuution teko onnistuu!! if ( !(W.leveys == ISO_LUKU) ){ cMatrix R; matriisi_3p(W.sijoitus,W.leveys,loppup,R); W.otus->matsij(R); } else W.otus->aseta_loppupiste(loppup); // W.otus->tee_littea_kuutio(loppup);//20.7 TEHTY MUTTEI KOKEILTU!!!!! } return 0; } int onnistuiko(int virhe) { if (virhe){ MessageBeep(MB_OK); MESSAGE("Ei mahdu enää kuvia!!!") return 1; } return 0; } int tee_otus(int kuka,const cMatrix paikka) { HMENU hMenu = GetMenu(W.Hwndt[0]); int virhe=0; switch (kuka) { case KUUTIO: virhe=Otukset.lisaa (new cKuutio(paikka,color[mika_vari_valittuna(hMenu)])); break; case PARAAB: virhe=Otukset.lisaa (new cParaabeli(paikka,color[mika_vari_valittuna(hMenu)])); break; case YSPIR: virhe=Otukset.lisaa (new cYspiraali(paikka,color[mika_vari_valittuna(hMenu)])); break; case ZSPIR: if (W.piirto==2||W.piirto==3) virhe=Otukset.lisaa (new cZspiraali(paikka,color[mika_vari_valittuna(hMenu)],.5,cVec(.5,.5))); else virhe=Otukset.lisaa (new cZspiraali(paikka,color[mika_vari_valittuna(hMenu)])); break; case ELLIPSI: if (W.piirto==2||W.piirto==3) virhe=Otukset.lisaa (new cEllipsi(paikka,color[mika_vari_valittuna(hMenu)],.5,cVec(.5,.5))); else virhe=Otukset.lisaa (new cEllipsi(paikka,color[mika_vari_valittuna(hMenu)])); break; case KOLMIO: virhe=Otukset.lisaa (new cKolmio(paikka,color[mika_vari_valittuna(hMenu)])); break; case MOKKI: virhe=Otukset.lisaa (new cMokki(paikka,color[mika_vari_valittuna(hMenu)])); break; //1.8. case OMA: virhe=Otukset.lisaa (new cViiva(paikka,color[mika_vari_valittuna(hMenu)])); cSateellinen *vika=Otukset.viimeinen(); vika->aseta_alkupiste(W.sijoitus); vika->aseta_loppupiste(W.leveys); break; } return onnistuiko(virhe); //jos tietorakenne on täynnä } static LONG WM_command_kuvaa(tMSGParam *msg) { cSateellinen *Otus; Otus=Otukset.eka_otus(); while (Otus){ Otus->aseta_kuvattu(1); //->otukset piirretaan myös kuvaikkunaan Otus = Otukset.seuraava_otus(); } InvalidateRect(msg->hWnd,NULL,TRUE); return 0; } static LONG WM_command_poista(tMSGParam *msg) //otukset pois tietorakenteesta { Otukset.tuhoa(); InvalidateRect(msg->hWnd,NULL,TRUE); return 0; } static LONG WM_command_kierto(tMSGParam *msg) { if (W.dimensio==2){ MESSAGE("Kierrot voi tehdä vasta korkeammissa \n ulottuvuuksissa!!!") return 0; } stop = 1; aseta_kulma(msg->id,msg->hWnd); InvalidateRect(msg->hWnd,NULL,TRUE); return 0; } static LONG WM_command_paluu(tMSGParam *msg) //koordinaatisto alkuasentoon { cMuunnettuIkkuna *I; if ( (I=ikkunat.etsi(msg->hWnd)) == NULL ) return 0; I->yksikkokoord(); InvalidateRect(msg->hWnd,NULL,TRUE); return 0; } static LONG WM_command_zoomaa(tMSGParam *msg)// muuttaa koordinaatistojen jakoväliä { cMuunnettuIkkuna *I; if ( (I=ikkunat.etsi(msg->hWnd)) == NULL ) return 0; switch (msg->id) { case ISONNA: I->muuta_step(MUUTOS); break; case PIENENNA: I->muuta_step(-MUUTOS); break; case ZOOM_BACK: I->muuta_step(0); break; } InvalidateRect(msg->hWnd,NULL,TRUE); return 0; } static LONG WM_command_piirra_viimeinen(tMSGParam *msg) { cSateellinen *Otus; cMuunnettuIkkuna *Ikkuna; if ( (Ikkuna=ikkunat.etsi(msg->hWnd)) == NULL ) return 0; Otus=Otukset.viimeinen(); Ikkuna->aseta_hdc(msg->hDC); Ikkuna->luo_kyna(Otus->vari); Otus->piirra(*Ikkuna); Ikkuna->poista_kyna(); return 0; } static LONG MyDraw(tMSGParam *msg) { cSateellinen *Otus; cMuunnettuIkkuna *Ikkuna; stop = 0; HMENU hMenu=GetMenu(W.Hwndt[0]); int verkko=0; if ( (Ikkuna=ikkunat.etsi(msg->hWnd)) == NULL ) return 0; Ikkuna->aseta_hdc(msg->hDC); Ikkuna->aseta_jako(); if (GetMenuState(hMenu,CM_NAKYY,MF_BYCOMMAND)==MF_CHECKED) verkko=1; Ikkuna->koordinaatisto(cVec(0,0,0),0,color[6],verkko); Ikkuna->koordinaatisto(cVec(0,0,0),1,color[6],verkko); if (W.dimensio>2) Ikkuna->koordinaatisto(cVec(0,0,0),2,color[6],verkko); Otus=Otukset.eka_otus(); while(Otus){ #if 1 if ( MyCheckMessage() ) { // InvalidateRect(msg->hWnd,NULL,TRUE); return 0; } #endif // ei piirretä loppuun jos tulee uusia wm_paint-viestejä (akselikierrot) Ikkuna->luo_kyna(Otus->vari); if (Otus->piirretaanko(*Ikkuna))//onko otus jo kuvattu tai onko kuvaikkuna Otus->piirra(*Ikkuna); Ikkuna->poista_kyna(); Otus = Otukset.seuraava_otus(); } return 0; } static LONG WM_nclbuttondown(tMSGParam *msg) { ikkunat.Aseta_aktiivinen(msg->hWnd); return DEFRETURN; } static LONG WM_lbuttondown(tMSGParam *msg) /*Tämän viestin saavat vain kuva - ja alkukuvaikkuna. Viestin saaneen ikkunan kahva tarkistetaan. Jos viesti tulee kuvaikkunalle, return 0;,joten ei ole mahdollista yrittää piirtää alkukuvia muuas kuin alkukuvaikkunaan. */ { cMuunnettuIkkuna *I; cVec alkup; I=ikkunat.etsi(msg->hWnd); if ( W.kuka==0 || I == NULL || I->Kahva() == ikkunat.etsi_kahva(1)) return 0; I->aseta_hdc(msg->hDC); int komento; cMatrix R; if ( W.kuka == OMA ) komento = tee_oma(msg,I,R,W.lkm); else { switch ( W.piirto ) { case 1: komento = tee_yhdella_pisteella(msg,I,R); break; case 2: komento = tee_kahdella_pisteella(msg,I,R,W.lkm); break; case 3: komento = tee_kolmella_pisteella(msg,I,R,W.lkm); break; default: return 0; } } if ( komento == VALMIS ) { W.lkm=0; W.drag_draw = 0; tee_otus(W.kuka,R); LAHETA_VIESTI(msg->hWnd,PIIRRA_VIIMEINEN) return 0; } if ( komento == EKA ) { if ( !(W.otus == NULL) ) { //3 pisteen piirrossa cViiva cKuutioksi (vielä?) W.otus->PiirraPois(*I); delete W.otus; W.otus = NULL; } W.otus = new cKuutio(R); int dim = W.dimensio; W.dimensio = 2; W.otus->PiirraPois(*I); W.dimensio = dim; W.drag_draw = 1; } if ( komento == EKA_KOLME ) { W.otus = new cViiva(); W.otus->aseta_alkupiste(R.ref(3)); W.otus->PiirraPois(*I); W.drag_draw = 1; } W.lkm++; if ( komento == VIKA ) { W.lkm=0; W.drag_draw = 0; int dim = W.dimensio; W.dimensio = 2; W.otus->PiirraPois(*I); W.dimensio = dim; delete W.otus; W.otus=NULL; tee_otus(W.kuka,R); LAHETA_VIESTI(msg->hWnd,PIIRRA_VIIMEINEN) W.sijoitus=ISO_LUKU; W.leveys=ISO_LUKU; } return 0; } int aseta_kursori(void) { switch (W.kuka){ case OMA: SetCursor(LoadCursor(NULL,IDC_UPARROW)); break; case KUUTIO: SetCursor(W.hcur[0]);break; case ELLIPSI: SetCursor(W.hcur[1]);break; case PARAAB: SetCursor(W.hcur[2]);break; case ZSPIR: SetCursor(W.hcur[3]);break; case YSPIR: SetCursor(W.hcur[3]);break; case KOLMIO: SetCursor(W.hcur[4]);break; case MOKKI: SetCursor(W.hcur[5]);break; default : SetCursor(LoadCursor(NULL,IDC_ARROW)); } return 0; } static LONG WM_mousemove(tMSGParam *msg) { cMuunnettuIkkuna *I; I=ikkunat.etsi(msg->hWnd); if ( I==NULL||I->Kahva()==ikkunat.etsi_kahva(1) ){ SetCursor(LoadCursor(NULL,IDC_ARROW)); return 0; } I->aseta_hdc(msg->hDC); aseta_kursori(); POINT ulp; cVec loppup; if ( W.drag_draw ) { int dim = W.dimensio; W.dimensio = 2; W.otus->PiirraPois(*I); loppup=uusi_loppupiste(ulp,msg->lParam,I); muuta_matriisia(loppup,W); W.otus->PiirraPois(*I); W.dimensio = dim; } return 0; } static LONG MySize(tMSGParam *msg) { InvalidateRect(msg->hWnd,NULL,TRUE); return 0; } tMSGEntry KuvaTbl[] = { { WM_COMMAND , KUVAA , DoC, WM_command_kuvaa }, { WM_COMMAND , POISTA , DoC, WM_command_poista }, { WM_COMMAND , TRANGE , DoC, WM_command_kierto ,0,0,X_KIERTO,Z_NEG }, { WM_COMMAND , PALUU , DoC, WM_command_paluu }, { WM_COMMAND , TRANGE , DoC, WM_command_zoomaa ,0,0,ISONNA,ZOOM_BACK}, { WM_COMMAND , PIIRRA_VIIMEINEN , DoC, WM_command_piirra_viimeinen,1 }, { WM_PAINT , DoC , DoC, MyDraw ,1 }, { WM_LBUTTONDOWN, DoC , DoC, WM_lbuttondown ,1 }, { WM_MOUSEMOVE , DoC , DoC, WM_mousemove ,1 }, { WM_SIZE , DoC , DoC, MySize }, { WM_COMMAND , PIIRRA , DoC, MySize }, { WM_COMMAND , CM_NAKYY , DoC, MySize }, { WM_NCLBUTTONDOWN, DoC , DoC, WM_nclbuttondown ,1 }, { 0 } };