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

Podobne dokumenty