9_punkty
Transkrypt
9_punkty
Dostępne klasy graficznego kontekstu urządzenia: • • • • • • • • wxClientDC - rysowanie na obszarze roboczym okna (poza zdarzeniem OnPaint) wxBufferedDC - zamiennik wxClientDC przy podwójnym buforowaniu wxPaintDC - rysowanie na obszarze roboczym okna podczas obsługi zdarzenia OnPaint wxBufferedPaintDC - zamiennik wxPaintDC na podwójnym buforowaniem malarstwo. wxScreenDC - rysowanie na lub kopiowanie z ekranu. wxMemoryDC - rysowanie na obrazie w pamięci lub kopiowanie bitmapy. wxPrinterDC - rysowanie do drukarki. wxPostScriptDC - rysowanie do pliku PostScript lub drukarki. Jeśli chcesz rysować w obszarze roboczym okna poza zdarzeniem OnPaint, trzeba utworzyć obiekt klasy wxClientDC. Powinien to być obiekt tymczasowy na stosie, nie należy go przechowywać w pamięci. Konstruktor pobiera wskaźnik do okna, w którym chcesz rysować, np.: wxClientDC g(this); g.DrawCircle(wxPoint(x,y),r); wxClientDC *g = new wxClientDC(this); g->DrawCircle(wxPoint(x,y),r); delete g; Narzędzia rysujące: pióro i pędzel g.SetPen(wxPen(*wxRed,5)); g.SetBrush(*wxGreen); wxPen *p = new wxPen(wxColour, int width); wxBrush *b = new wxBrush(wxColour); g.SetBrush(b); delete b; g.SetPen(p); delete p; Metody klasy wxDC, bazowej dla wxClientDC, rysujące proste figury geometryczne (wybrane): DrawLine(wxPoint(x,y),r) DrawText(wxString,x,y) // bieżąca czcionka i kolor DrawRectangle(x,y,szer,wys) DrawPoint(x,y) DrawEllipse(x,y,szer,wys) DrawIcon(wxIcon,x,y); DrawCircle(wxPoint(x,y),r) FloodFill(x,y,wxColour, style) // w kolorze pióra // style = wxFLOOD_SURFACE / wxFLOOD_BORDER Rysowanie kółek w miejscu kliknięcia myszą i zapis współrzędnych do pliku tekstowego: #include <wx/txtstrm.h> #include <wx/wfstream.h> wxFileOutputStream plik("punkciki.txt"); wxTextOutputStream wy(plik); void Okno::OknoLeftDown(wxMouseEvent& event) { wxPoint p = event.GetPosition(); // odczyt współrzędnych myszy wxClientDC g(this); g.SetPen(wxPen(*wxRED,3)); // czerwona linia o szerokości 3 pixele g.SetBrush(*wxGREEN); // zielone wnętrze kółek g.DrawCircle(p,20); wy<<p.x<<" "<<p.y<<endl; } Losowanie współrzędnych punktów, lista punktów, znajdź punkt położony najdalej od początku okienka (0,0) oraz parę punktów najdalszych od siebie std::vector <wxPoint> P; // wektor będzie potrzebny do znalezienia największej odległości między dwoma punktami void Okno::LosujPunkty() { int szer = 400; int wys = this->GetClientSize().y; int n; int x,y; // współrzędne środka kółka wxString xs, ys; // współrzędne środka kółka jako typ wxString, do wyświetlenia na liście wxClientDC g(this); // wyczyść pole, listę i wektor wxColor k = wxColor(rand()%256,rand()%256,rand()%256); g.SetBrush(k); g.DrawRectangle(0,0,szer,wys); WxListBox1->Clear(); P.clear(); n=rand()%30+3; // losuj liczbę punktów WxStaticText1->SetLabel("Liczba punktów = " + wxString::Format("%i",n)); g.SetBrush(wxColor(rand()%256,rand()%256,rand()%256);); // losowy kolor wnętrza kółek double maxd=0; // max odległość od (0,0) int xm, ym; // współrzędne punktu położonego najdalej od (0,0) for (int i=0; i<n; i++) { x=rand()%350+20; . y=rand()%350+50; g.DrawCircle(wxPoint(x,y),10); xs.Clear(); xs<<x; ys.Clear(); ys<<y; WxListBox1->Append(xs+", "+ys); double d=sqrt(x*x+y*y); if (d>maxd) { maxd=d; xm=x; ym=y; } P.push_back(wxPoint(x,y)); } g.DrawLine(0,0,xm,ym); } void Okno::WxButton3Click(wxCommandEvent& event) { // najdalsza od siebie para punktów int n=P.size(); double dm=0; int x1=0,y1=0,x2=0,y2=0; for (int i=0; i<n; i++) for (int j=0; j<i; j++) { int dx=P[i].x- P[j].x; int dy=P[i].y- P[j].y; double d=sqrt(dx*dx+dy*dy); if (d>dm) { dm=d; x1=P[i].x; y1=P[i].y; x2=P[j].x; y2=P[j].y; } } wxClientDC g(this); g.SetPen(wxPen(*wxWHITE,5)); g.DrawLine(x1,y1,x2,y2); } // czytanie punktów z pliku I rysowanie kółek void Okno::WxButton1Click(wxCommandEvent& event) { if (WxOpenFileDialog1->ShowModal()) { wxFileInputStream plik(WxOpenFileDialog1->GetPath()); wxTextInputStream we(plik); // potrzebuje #include <wx/wfstream.h> // potrzebuje #include <wx/txtstrm.h> int szer = 400; int wys = this->GetClientSize().y; int n; int x,y; wxString xs, ys; // wyczyść pole wxClientDC g(this); wxColor k = wxColor(rand()%256,rand()%256,rand()%256); g.SetBrush(k); g.DrawRectangle(0,0,szer,wys); g.SetBrush(wxColor(rand()%256,rand()%256,rand()%256)); WxListBox1->Clear(); n=0; double maxd=0; int xm, ym; P.clear(); while (!plik.Eof()) { we>>x>>y; if (x>0) { xs.Clear(); ys.Clear(); xs<<x; // zamiana liczby na wxString, można też tak: xs = wxString::Format(”%i”,x) ys<<y; WxListBox1->Append(xs+", "+ys); g.DrawCircle(wxPoint(x,y),10); n++; P.push_back(wxPoint(x,y)); } } WxStaticText1->SetLabel("Liczba punktów = " + wxString::Format("%i",n)); } } Czytać dane z pliku tekstowego można też metodami klasy wxTextInputStream: ReadLine() – czyta i zwraca zawarość 1 linii pliku tekstowego, bez znaku końca linii ReadWord() – czyta i zwraca słowo, tzn łańcuch znaków aż do aktualnego znaku separatora SetStringSeparator(wxString) – ustawia bieżacy separator, dozwolona jest spacja i TAB ReadDouble() – czyta I zwraca liczbe rzeczywistą Read32() – czyta i zwraca liczbę całkowitą 32-bitową bez znaku Read32S() - czyta i zwraca liczbę całkowitą 32-bitową ze znakiem, signed Read8(), Read8S(), Read16(), Read16S() – obsługa liczb całkowitych 8- i 16-bitowych, można podać podstawę GetChar() – zwraca znak lub 0 jeśli nie ma więcej znaków w strumieniu