/******************************************************************************* Moduli: winlin.cpp Tarkoitus: Winlin-ohjelman p„„ohjelma. Viestink„sittelytaulukossa on pikan„pp„imilt„ ja menusta tulevat viestit. WM_initdialog()-aliohjelmaa kutsutaan ennen varsinaisen ohjelman alkamista, ja siin„ tehd„„n kaikki tarvittavat alustukset sek„ muut ikkunat. Projekti: Winlin, Cum laude approbatur -harjoitustyö Tekijät: Virpi Kivinen & Tiina Mäkinen Tehty: 1.1.96 Projektiin: ALI\tausta.c,ALI\tabhand.c,ALI\mdialog.c,ALI\mjonot.c, winlin.rc, winlin.def, winlin.cpp, vektorit.cpp, matriisi.cpp, piirrot.cpp, muunnik.cpp, tietorak.cpp, kahvat.cpp, tyokal.cpp, kuva.cpp, matrix.cpp, kierrot.cpp, vaanto.cpp, siirto.cpp Muutettu 20.7.96 Mitä muutettu: poistettu turhien viestien lähettelyä (oma piirto samaan mui- den kanssa). alustukset: W.kuka=KUUTIO; W.sijoitus=ISO_LUKU; W.leveys=ISO_LUKU; Muutettu 7.8.96 Mitä muutettu: + pikanäppäimet dialogeihin Muutettu 1.7.96 Mitä muutettu: + lisättyyt Puutteet: initiedostosta lukeminen Aliohjelmat: -static LONG WM_initdialog(tMSGParam *msg) -static LONG WM_command_idok(tMSGParam *msg) Kun on painetu returnia, niin työkaluikkunalle lähetetään KUVAA-viesti. -static LONG WM_command_cm_nakyy(tMSGParam *msg) Verkko laitetaan päälle tai pois päältä. Lähetetään alkukuva- ja kuva- ikkunalle viesti uudelleen piirtämisestä. -static LONG WM_command_muuta_vari(tMSGParam *msg) Menusta valittu väri otetaan käyttöön. -static LONG WM_command_dim(tMSGParam *msg) Vaihdetaan dimensiota lähettämällä matriisille viesti eteenpäin. -static LONG WM_command_cm_vaanto(tMSGParam *msg) Menusta valittu valmis kuvaus vääntö. -static LONG WM_command_cm_siirto(tMSGParam *msg) Menusta valittu valmis kuvaus siirto. -static LONG WM_command_cm_kierto(tMSGParam *msg) Menusta valittu valmis kuvaus kierto. -static LONG WM_command_matriisiin(tMSGParam *msg) Siirrytään joko matriisiin tai pääikkunaan Tab-näppäintä painamalla riippuen kummassa ikkunassa oltiin. -static LONG WM_command_lopeta(tMSGParam *msg) -static LONG WM_command_ohjelma(tMSGParam *msg) -static LONG WM_command_apuva(tMSGParam *msg) -static LONG WM_erasebkgnd(tMSGParam *msg) Taustalla oleva bittikartta piirretään uudelleen. -static LONG WM_command_siirto(tMSGParam *msg) Kun matriisissa painetaan nuolinäppäimiä, niin tämä lähettää siitä viestin matriisille. -static LONG WM_command_tee_tyot(tMSGParam *msg) -static LONG WM_Size(tMSGParam *msg) -void SetAlkuwc(tCreWndSt *c) Alustaa ikkunoiden taustaväriksi mustan ja kursoriksi NULL:n. -static int tuhoa_bittikartat(void) Tuhoaa työkaluikkunassa nappien päällä olevat bittikartat. Täytyy tehdä täällä, koska työkaluikkuna ei saa lopeta-viestiä. -int mika_vari_valittuna(HMENU hMenu) Katsoo menusta, mikä väri on valittu, ja palauttaa sen indeksin. Uuden valmiin piirtokuvan lisääminen: -resurssieditorilla tehtävä nappula ja sen päälle bittikartat (toinen ylhäällä ja toinen pohjassa), pikanäppäin ja id-tunnus OMA+1 -viestin lähettämistä varten laitettava tässä tiedostossa taulukkoon sen id-tunnus OMAn tilalle, samoin tyokal.cpp:ssä -bittikarttoja varten pitää kasvattaa MAX_NAPPEJA yhdellä ja tNappi NAPIT[] tietueen alustukseen (tyokal.cpp) lisätä ne -lisätä WM_drawitem()-aliohjelmaan (tyokal.cpp) samankaltainen if kuin muilla piirtokuvilla on -tehd„ piirtokuvalle oma kursori resurssieditorilla (tai valita joku valmis kursori) ja lis„t„ KURSOREITA m„„rityst„ yhdell„ -ladata kursori W.hcur[]-taulukkoon aliohjelmassa alusta_kursorit()(winlin.cpp) -aseta_kursori()-aliohjelmassa (kuva.cpp) tehd„ oma case-kohta -aliohjelmassa tee_otus()(kuva.cpp) uusi kuva lis„t„„n piirrett„vien kuvien tietorakenteeseen, eli kuvalle oma case-kohta samankaltaisena kuin muille on tehty -teht„v„ piirrett„v„lle kuvalle oma luokka (malleja cKuutio, cEllipsi (piirrot.h ja piirrot.cpp)) -sill„ on oltava ainakin konstruktori ja oma piirra()-metodi -konstruktori kutsuu my”s cSateellisen konstruktoria -piirra()-metodin pit„isi piirt„„ kuva koordinaatistossa siihen paikkaan sen kokoisena, jollaisena sen haluaisi identtisell„ kuvauksella syttyv„n *******************************************************************************/ #include #include #include #include #include #include"tabhand.h" #include"mdialog.h" #include"tausta.h" #include"winlin.h" #include"kahvat.h" tGHwndt W; cKahvat ikkunat; TDIALOGPROC(MatTbl,OurDlgProc) TDIALOGPROC(TkTbl,TkDlgProc) //työkaluille TDIALOGPROC(KTbl,KDlgProc) //menu, -kierto TDIALOGPROC(STbl,SDlgProc) //menu, -siirto TDIALOGPROC(VTbl,VDlgProc) //menu, -vaanto TWINDOWPROC(KuvaTbl,KuvaWndProc) void SetAlkuwc(tCreWndSt *c) { c->wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); c->wc.hCursor = NULL; } TblClassDlgMAIN("cVecClass","IKONI","PIKA","LINDLG",MsgTbl) int alusta_kursorit(HINSTANCE hinst) { W.hcur[0]=LoadCursor(hinst,"CUR_KUUTIO"); W.hcur[1]=LoadCursor(hinst,"CUR_ELLIPSI"); W.hcur[2]=LoadCursor(hinst,"CUR_PARAABELI"); W.hcur[3]=LoadCursor(hinst,"CUR_SPIRAALI"); W.hcur[4]=LoadCursor(hinst,"CUR_KOLMIO"); W.hcur[5]=LoadCursor(hinst,"CUR_MOKKI"); return 0; } static LONG WM_initdialog(tMSGParam *msg) { HWND h; W.dimensio=2; W.piirto=1; W.kuka=KUUTIO; W.lkm=0; W.drag_draw=0; W.otus=NULL; W.sijoitus=ISO_LUKU; W.leveys=ISO_LUKU; W.Hwndt[0]=msg->hWnd; HINSTANCE AkhInstance = GetWindowInstance(W.Hwndt[0]); AlustaTaustaHWND(AkhInstance,W.Hwndt[0],"TAUSTA",2); alusta_kursorit(AkhInstance); W.Hwndt[1]=DoModelessDialog(W.Hwndt[0],"MATDLG",OurDlgProc);//harmaa tausta!!! W.Hwndt[2] =DoModelessDialog(W.Hwndt[0],"TYOKALUT",TkDlgProc); h=GetDlgItem(W.Hwndt[1],IDC_EDIT11); GetClientRect(h,&W.Rct); ikkunat.lisaa(0,W.Hwndt[0],AkhInstance,0," Alkukuva","LinAlkuClass",KuvaWndProc); ikkunat.lisaa(1,W.Hwndt[0],AkhInstance,1,"xKuva","LinKuvaClass",KuvaWndProc); aseta_matriisi(cMatrix(1),W.Hwndt[1]); return 0; } static LONG WM_Size(tMSGParam *msg) { ikkunat.muuta_koko(msg->hWnd); return 0; } // Seuraavassa viestit lähetetään takaisin tyokaluille; tässä painettu pikanäppäimiä, jotka on // pääikkunan resurssitiedostossa. static LONG WM_command_tee_tyot(tMSGParam *msg) { LAHETA_VIESTI(W.Hwndt[2],msg->id); return 0; } static LONG WM_command_siirto(tMSGParam *msg) { LAHETA_VIESTI(W.Hwndt[1],msg->id); return 0; } static LONG WM_erasebkgnd(tMSGParam *msg) { PiirraTaustaHWND(msg->hWnd,(HDC)msg->wParam); return 0; } static LONG WM_command_apuva(tMSGParam *msg) { return WinHelp(msg->hWnd,"winlin.hlp",HELP_INDEX,0); } static LONG WM_command_ohjelma(tMSGParam *msg) { (void)msg; MESSAGE("Ohjelma lineaarikuvausten havainnollistamiseen.\n\nVirpi Kivinen & Tiina Mäkinen\n\n1996") return 0; } static int tuhoa_bittikartat(void) { //TARVIIKO NOI NULLIT ,TUHOAAKO NYT int i; for (i=0; ihWnd,0); WinHelp(msg->hWnd,"winlin.hlp",HELP_QUIT,0); PostQuitMessage(0); return 0; } static LONG WM_command_matriisiin(tMSGParam *msg) { (void)msg; HWND h=GetActiveWindow(); if (h==W.Hwndt[0]) SetFocus(W.Hwndt[1]); else SetFocus(W.Hwndt[0]); return 0; } static LONG WM_command_cm_kierto(tMSGParam *msg) { DoModalDialog(msg->hWnd,"KIERROT",KDlgProc); return 0; } static LONG WM_command_cm_siirto(tMSGParam *msg) { if (W.dimensio==2) { MESSAGE("Tasossa ei voi siirtää!"); return 0; } DoModalDialog(msg->hWnd,"SIIRTO",SDlgProc); return 0; } static LONG WM_command_cm_vaanto(tMSGParam *msg) { DoModalDialog(msg->hWnd,"VAANTO",VDlgProc); return 0; } static LONG WM_command_dim(tMSGParam *msg) { LAHETA_VIESTI(W.Hwndt[1],msg->id); LAHETA_VIESTI(W.Hwndt[2],msg->id); return 0; } int mika_vari_valittuna(HMENU hMenu) { int i; for(i=0;ihWnd); int i = mika_vari_valittuna(hMenu); CheckMenuItem(hMenu,msg->id,MF_BYCOMMAND|MF_CHECKED); CheckMenuItem(hMenu,CM_VIHREA+i,MF_BYCOMMAND|MF_UNCHECKED); LAHETA_VIESTI(W.Hwndt[2],MUUTA_VARI) return 0; } static LONG WM_command_cm_nakyy(tMSGParam *msg) { HMENU hMenu=GetMenu(msg->hWnd); if (GetMenuState(hMenu,CM_NAKYY,MF_BYCOMMAND)==MF_CHECKED) CheckMenuItem(hMenu,CM_NAKYY,MF_BYCOMMAND|MF_UNCHECKED); else CheckMenuItem(hMenu,CM_NAKYY,MF_BYCOMMAND|MF_CHECKED); LAHETA_VIESTI(ikkunat.etsi_kahva(0),msg->id); LAHETA_VIESTI(ikkunat.etsi_kahva(1),msg->id); return 0; } static LONG WM_command_idok(tMSGParam *msg) { (void)msg; LAHETA_VIESTI(W.Hwndt[2],KUVAA); return 0; } tMSGEntry MsgTbl[] = { { WM_INITDIALOG, DoC , DoC, WM_initdialog }, { WM_SIZE , DoC , DoC, WM_Size }, { WM_ERASEBKGND, DoC , DoC, WM_erasebkgnd }, { WM_CLOSE , DoC , DoC, WM_command_lopeta }, { WM_COMMAND , IDOK , DoC, WM_command_idok }, { WM_COMMAND , LOPETA , DoC, WM_command_lopeta }, { WM_COMMAND , AVUSTUS , DoC, WM_command_apuva }, { WM_COMMAND , OHJELMASTA, DoC, WM_command_ohjelma}, { WM_COMMAND , TRANGE , DoC, WM_command_tee_tyot, 0,0,KUUTIO,OMA }, { WM_COMMAND , KUVAA , DoC, WM_command_tee_tyot}, { WM_COMMAND , MATRIISIIN, DoC, WM_command_matriisiin}, { WM_COMMAND , TRANGE , DoC, WM_command_siirto, 0,0,ALAS,OIKEALLE }, { WM_COMMAND , TRANGE , DoC, WM_command_tee_tyot, 0,0,POISTA,ZOOM_BACK }, { WM_COMMAND , CM_KIERTO , DoC, WM_command_cm_kierto }, { WM_COMMAND , CM_SIIRTO , DoC, WM_command_cm_siirto }, { WM_COMMAND , CM_VAANTO , DoC, WM_command_cm_vaanto }, { WM_COMMAND , CM_NAKYY , DoC, WM_command_cm_nakyy }, { WM_COMMAND , TRANGE , DoC, WM_command_dim, 0,0,CM_2D,CM_4D }, { WM_COMMAND , TRANGE , DoC, WM_command_muuta_vari,0,0,CM_VIHREA,CM_TUMMANVIHREA }, { 0 } };