/****************/ /* kolmiom.cpp */ /****************/ // Ohjelma, joka aukaisee yhden ikkunan ja piirtää siihen rekursiivisen kolmion. // Esimerkki kuvan "päivittämisestä" ja piirtämisen kestosta // sekä säikeiden käytöstä. Piirtoa voi tehdä kesken näytön päivityksen. /vl-96 // Projektiin kolmiom.cpp ja ALI\timer.c. OWL 5.0 // Tehtäviä: // 1. Muuta versioksi, joka piirtää hiiren "jäljen" = "MopoCad" // #include // Owl 5.0:ssa owlpch.h => owl.h #include #include #include "timer.h" #include "owl\drawthre.h" //------------------------------------------------------------------------------ class cPiirto : public cDrawingThread { int dx; void kolmio(HDC hDC, double x, double y, double h); public: cPiirto(int idx) { dx = idx; } int Run(); }; //------------------------------------------------------------------------------ #define PIENIN_KOLMIO 0.2 /* Säädä tällä kauanko koko kuvan piirt. kest. */ #define I(x,y) hdc,((int)(x)),((int)(y)) //------------------------------------------------------------------------------ void cPiirto::kolmio(HDC hdc, double x, double y, double h) { double s2 = h / (sqrt(3)); if ( ShouldTerminate() ) return; MoveToEx(I(x,y),NULL); LineTo(I(x-s2,y-h)); LineTo(I(x+s2,y-h)); LineTo(I(x,y)); if ( h < PIENIN_KOLMIO ) return; kolmio(hdc,x-s2,y,h/2); /* Pienempi kolmio vasemmalle */ kolmio(hdc,x+s2,y,h/2); /* Pienempi kolmio oikealle */ kolmio(hdc,x,y-h,h/2); /* Pienempi kolmio yläpuolelle*/ } int cPiirto::Run() { char s[100]; Wnd().SetWindowText("Piirtosäie käynnissä..."); // Tämän kestää start_timer(1); kolmio(hDC(),300+dx,400,200); sprintf(s,"Kolmio: %5.2lf s.",stop_timer(1)); if ( !Terminating() ) // Jos pysähtymässä, ei saa kutsua mitään SendMessage Wnd().SetWindowText(s); // Tätä ei kestä aina! // Wnd().PostMessage(WM_SETTEXT,0,(LPARAM)(LPCTSTR)s); // Tämä ei tulosta??? return 0; } //------------------------------------------------------------------------------ class TMainWindow : public TFrameWindow { TDC *pHoldDC; // Siirron aikana käytössä oleva laiteyhteys TPoint old; cDrawingThreadFrame Piirto, Piirto2, Piirto3; public: TMainWindow(TWindow *Parent, LPCSTR ATitle) : TFrameWindow(Parent, ATitle) { pHoldDC = NULL; } void Paint(TDC &dc,bool, TRect &) { // Piirto.SetPriority(THREAD_PRIORITY_LOWEST); Piirto.SetPriority(THREAD_PRIORITY_HIGHEST); Piirto.Start(this,0); Piirto2.SetPriority(THREAD_PRIORITY_HIGHEST); Piirto2.Start(this,100); // Piirto3.SetPriority(THREAD_PRIORITY_HIGHEST); // Piirto3.Start(this,200); } void EvLButtonDown(UINT modKeys, TPoint& point) { if ( pHoldDC != NULL ) return; SetCapture(); // Direct all subsequent mouse input to this window pHoldDC = new TClientDC(*this); old = point; } void EvLButtonUp(UINT modKeys, TPoint& point) { if ( pHoldDC == NULL ) return; ReleaseCapture(); delete pHoldDC; pHoldDC = NULL; } void EvMouseMove(UINT modKeys, TPoint& point) { if ( pHoldDC == NULL ) return; pHoldDC->MoveTo(old); pHoldDC->LineTo(point); } DECLARE_RESPONSE_TABLE(TMainWindow); }; DEFINE_RESPONSE_TABLE1(TMainWindow,TFrameWindow) EV_WM_PAINT, EV_WM_LBUTTONDOWN, EV_WM_LBUTTONUP, EV_WM_MOUSEMOVE, END_RESPONSE_TABLE; //------------------------------------------------------------------------------ class TKolmiomApp : public TApplication { public: TKolmiomApp(const char far *name = 0) : TApplication(name) {}; void InitMainWindow() { MainWindow = new TMainWindow(NULL, Name); } }; //------------------------------------------------------------------------------ int OwlMain(int ,char far * []) { return TKolmiomApp("Kolmiom").Run(); }