/* kolmiom.c */ /****************************************************************************/ /* ** Malliohjelma kauan kestävästä piirtämisestä. ** Piirretään rekursiivisesti joukko kolmioita. ** ** Majava & Mäkelä ** ** Kääntäminen: ** Tee projekti kolmiom.prj: ** kolmiom.c ** simplet.def ** ALI\tabhand.c ** ALI\checker.c ** ----------------------------------------------------------------------------*/ #include #include #include "timer.h" #include "tabhand.h" /****************************************************************************/ TblClassSWindowMAIN_C("´MopacadMClass",0,"MopoCad",MsgTbl,0); /* c */ /* ^^ */ /* c */ /****************************************************************************/ #define KOKO 100 #define I(x,y) hdc,((int)(x)),((int)(y)) static int n=0; static POINTS pisteet[KOKO]; /***************************************************************************/ static EVENT WM_paint(tMSGParam *msg) /* # MAKE_DC # */ { int i; for ( i=0;ihDC,pisteet[i].x,pisteet[i].y,NULL); if (pisteet[i+1].x == -1) continue ; if (pisteet[i].x == -1) continue; LineTo(msg->hDC,pisteet[i+1].x,pisteet[i+1].y); } return 0; } /****************************************************************************/ /* ** Seuraavissa aliohjelmissa on seuraavat parametrit: ** ** hWnd - ikkunan kahva ** wParam - SHIFT, CTRL ja ALT -näppäimen tile, voidaan testata esim. ** if ( wParam && MK_CONTROL ) ... hommat jos CTRL alhaalla ** lParam - x = LOWORD(lParam) ja y = HIWORD(lParam) ** kätevämpi on kuitenkin selvittää hiiren paikka: ** POINTS pt = MAKEPOINTS(lParam) ** ----------------------------------------------------------------------------*/ static POINTS old = {0,0}; static pen_down = 0; /****************************************************************************/ static EVENT WM_lbuttondown(tMSGParam *msg) /* # MAKE_DC # */ /* Aliohjelmaa kutsutaan kun hiiren nappa on painettu alas */ { old = MAKEPOINTS(msg->lParam); pisteet[n]=old; if ( n < KOKO-1 ) n++; pen_down = 1; return 0; } /****************************************************************************/ static EVENT WM_lbuttonup(tMSGParam *msg) /* Aliohjelmaa kutsutaan kun hiiren nappi on päästetty ylös */ { #pragma argsused pen_down = 0; pisteet[n].x = -1; pisteet[n].y = -1; if ( n < KOKO-1 ) n++; return 0; } /****************************************************************************/ static EVENT WM_mousemove(tMSGParam *msg) /* # MAKE_DC # */ /* Aliohjelmaa kutsutaan kun hiiri on liikkunut */ { POINTS pt = MAKEPOINTS(msg->lParam); if ( !pen_down || n >= KOKO -1 ) return 0; MoveToEx(msg->hDC,old.x,old.y,NULL); LineTo(msg->hDC,pt.x,pt.y); old=pt; pisteet[n]=old; if ( n < KOKO-1 ) n++; return 0; } /****************************************************************************/ static EVENT WM_create(tMSGParam *msg) /* Aliohjelmaa kutsutaan kun ikkuna on luotu, muttei vielä näytössä. */ { MoveWindow(msg->hWnd,10,10,600,500,FALSE); return 0; } /****************************************************************************/ /* Viestien käsittelytaulukko */ /****************************************************************************/ #define DoC DONT_CARE tMSGEntry MsgTbl[] = { EV_HANDLE_WM_DESTROY, { WM_PAINT , DoC , DoC , WM_paint, MAKE_DC }, /*a*/ { WM_LBUTTONDOWN , DoC , DoC , WM_lbuttondown, MAKE_DC }, /*a*/ { WM_LBUTTONUP , DoC , DoC , WM_lbuttonup }, /*a*/ { WM_MOUSEMOVE , DoC , DoC , WM_mousemove, MAKE_DC }, /*a*/ { WM_CREATE , DoC , DoC , WM_create }, /*a*/ { 0 } }; /****************************************************************************/