/******************************************************************************* Moduli: matrix.cpp Tarkoitus: ...... Projekti: Winlin, Cum laude approbatur -harjoitustyö Tekijät: Virpi Kivinen & Tiina Mäkinen Tehty: 1.1.96 Muutettu 1.7.96 Mitä muutettu: + lisättyyt Muutettu 23.10.96 / vl Mitä muutettu: + matriisi ei mene ruudun ulkopuolelle Puutteet: mökki ************************************************************************* static LONG WM_initdialog(tMSGParam *msg) -Matriisi alustetaan 2*2-matriisiksi. static LONG WM_command_NAPSI_LUVUT(tMSGParam *msg) -Kerää matriisi-ikkunasta kertoimet matriisiin a. Kutsuu aliohjelmaa napsi_luvut(cMatrix &a,HWND hwnd), joka käy matriisin läpi kaksinkertaisessa silmukassa ja lukee kertoimet kustakin matriisin paikasta vastaavaan a:n paikkaan aliohjelmalla lue_kerroin(...). Kertoo saadulla matriisilla (I->muunna(a)) cMuunnettuIkkunan (Kuva) Muunnos-matriisia. Ennen kertomista palauttaa ikkunan Muunnos- matriisin aina yksikkömatriisiksi. Lähettää Kuvalle (h) viestin KUVAA. static LONG WM_command_i_matr(tMSGParam *msg) -Kutsuu aliohjelmaa aseta_matriisi(...) yksikkömatriisilla. static LONG WM_command_liiku(tMSGParam *msg) -Muuttaa kursorin paikkaa matriisin alkiosta toiseen, kun on painettu jotain nuolinäppäintä. static LONG WM_command_dim(tMSGParam *msg) -Muuttaa matriisin kokoa (2*2, 3*3 tai 4*4). Se vaihtaa piirtodimensiota. int aseta_matriisi(cMatrix &A,HWND hwnd) -Sijoittaa kuvausmatriisiin parametrina tuodun matriisin A. Lähettää KUVAA-viestin. char *vaihda(char *s,int n,char *mika, char *miksi) -Vaihtaa s:stä kaikki mikat miksiksi. (Käytetään vaihtamaan matriisin alkioissa pilkut pisteiksi.) int lue_kerroin(int id,int rivi,int sarake,HWND hWnd,cMatrix &a) -Lukee kuvausmatriisin alkion paikasta [rivi][sarake] ja sijoittaa sen parametrina tuodun matriisin a samaan paikkaan. int napsi_luvut(cMatrix &a,HWND hwnd) -Lukee koko kuvausmatriisin kutsuen aliohjelmaa lue_kerroin(...). Matriisi luetaan parametrina tuotuun matriisiin a. int kerro_matriisi(cMatrix &R) -R=R*kuvausmatriisi. Kuvausmatriisi luetaan aliohjelmalla napsi_luvut(...). Käytetään valmiiden kuvauksien yhdistetyissä kuvauksissa. int tee_kaksi_ulotteinen(HWND hwnd,int nakyyko,BOOL saako) -Tekee kuvausmatriisista 2-ulotteisen. Tekee siitä neliulotteisen, jos nakyyko=SW_SHOW (matriisin alkio on näkyvissä) ja saako=TRUE (saako alkioon kirjoittaa). int tee_kolmi_ulotteinen(HWND hwnd,int nakyyko,BOOL saako) -Tekee matriisista kolmiulotteisen. ***************************************************************************/ #include #include #include #include"tabhand.h" #include"mdialog.h" #include"mjonot.h" #include"kahvat.h" #include"winlin.h" int aseta_matriisi(cMatrix &A,HWND hwnd) { int i,j,k=0; HWND h; char s[10]; cMuunnettuIkkuna *I; h=ikkunat.etsi_kahva(1); I=ikkunat.etsi(h); for(i=0;ipalauta(A); LAHETA_VIESTI(h,KUVAA) //muunnosmatriisissa on nyt dialogiin kirjoitettu matriisi return 0; } char *vaihda(char *s,int n,char *mika, char *miksi) { int i; for (i=0; ihWnd); I->palauta(a); LAHETA_VIESTI(h,KUVAA) //muunnosmatriisissa on nyt dialogiin kirjoitettu matriisi return 0; } static LONG WM_command_i_matr(tMSGParam *msg) { aseta_matriisi(cMatrix(1),msg->hWnd); SetFocus(msg->hWnd); return 0; } static LONG WM_command_liiku(tMSGParam *msg) { HWND hwnd=GetFocus(); int id=GetDlgCtrlID(hwnd); switch (msg->id){ case OIKEALLE: if (id==IDC_EDIT44) id -=16; hwnd=GetDlgItem(msg->hWnd,id+1); break; case VASEMMALLE: if (id==IDC_EDIT11) id +=16; hwnd=GetDlgItem(msg->hWnd,id-1); break; case YLOS: if (IDC_EDIT11<=id&&id<=IDC_EDIT14) id +=16; hwnd=GetDlgItem(msg->hWnd,id-4); break; case ALAS: if (IDC_EDIT41<=id&&id<=IDC_EDIT44) id -=16; hwnd=GetDlgItem(msg->hWnd,id+4); break; } SetFocus(hwnd); Edit_SetSel(hwnd,0,-1); return 0; } static LONG WM_command_dim(tMSGParam *msg) { RECT MRct; GetWindowRect(msg->hWnd,&MRct); switch (msg->id){ case CM_2D: W.dimensio=2; tee_kaksi_ulotteinen(msg->hWnd,SW_HIDE,FALSE); break; case CM_3D: W.dimensio=3; tee_kolmi_ulotteinen(msg->hWnd,SW_HIDE,FALSE); break; case CM_4D: W.dimensio=4; tee_kaksi_ulotteinen(msg->hWnd,SW_SHOW,TRUE); break; } //matriisi oikean kokoiseksi ,oikeaan paikkaan suhteessa pääikkunaan MoveWindow(msg->hWnd,MRct.left,MRct.top,W.dimensio*(W.Rct.right+10), W.dimensio*(W.Rct.bottom+5)+30,TRUE); LAHETA_VIESTI(ikkunat.etsi_kahva(0),PIIRRA); LAHETA_VIESTI(ikkunat.etsi_kahva(1),PIIRRA); return 0; } static LONG WM_initdialog(tMSGParam *msg) { RECT Rct; int x,y,sx; sx = GetSystemMetrics(SM_CXSCREEN); GetWindowRect(W.Hwndt[0],&Rct); x = Rct.right; if ( x > sx ) x = sx - 100; y = Rct.top; MoveWindow(msg->hWnd,x,y,30,30,TRUE); tee_kaksi_ulotteinen(msg->hWnd,SW_HIDE,FALSE); return 0; } tMSGEntry MatTbl[] = { { WM_INITDIALOG , DoC , DoC , WM_initdialog }, { WM_COMMAND , IDOK , DoC , WM_command_NAPSI_LUVUT }, { WM_COMMAND , I_MATR, DoC , WM_command_i_matr }, { WM_COMMAND , TRANGE, DoC , WM_command_liiku ,0,0,ALAS,OIKEALLE}, { WM_COMMAND , TRANGE, DoC , WM_command_dim,0,0,CM_2D,CM_4D }, { 0 } };