#include "wx/wx.h" #include "wx/sizer.h" class BasicDrawPane : public wxPanel { public: BasicDrawPane(wxFrame* parent); void paintEvent(wxPaintEvent & evt); void paintNow(); void render(wxDC& dc); /* Перелік корисних подій - подано лише у цьому коді: void mouseMoved(wxMouseEvent& event); void mouseDown(wxMouseEvent& event); void mouseWheelMoved(wxMouseEvent& event); void mouseReleased(wxMouseEvent& event); void rightClick(wxMouseEvent& event); void mouseLeftWindow(wxMouseEvent& event); void keyPressed(wxKeyEvent& event); void keyReleased(wxKeyEvent& event); */ DECLARE_EVENT_TABLE() }; class MyApp: public wxApp { bool OnInit(); wxFrame *frame; BasicDrawPane * drawPane; public: }; IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); frame = new wxFrame((wxFrame *)NULL, -1, wxT("Приклад 1"), // заголовок вікна wxPoint(50,50), // верхній лівий кут wxSize(300,400)); // розміри вікна drawPane = new BasicDrawPane((wxFrame*) frame ); sizer->Add(drawPane, 1, wxEXPAND); frame->SetSizer(sizer); frame->SetAutoLayout(true); frame->Show(); return true; } BEGIN_EVENT_TABLE(BasicDrawPane, wxPanel) /* Перелік корисних подій - подано лише у цьому коді: EVT_MOTION(BasicDrawPane::mouseMoved) EVT_LEFT_DOWN(BasicDrawPane::mouseDown) EVT_LEFT_UP(BasicDrawPane::mouseReleased) EVT_RIGHT_DOWN(BasicDrawPane::rightClick) EVT_LEAVE_WINDOW(BasicDrawPane:: mouseLeftWindow) EVT_KEY_DOWN(BasicDrawPane::keyPressed) EVT_KEY_UP(BasicDrawPane::keyReleased) EVT_MOUSEWHEEL(BasicDrawPane:: mouseWheelMoved) */ // перехлення події малювання EVT_PAINT(BasicDrawPane::paintEvent) END_EVENT_TABLE() /* Перелік корисних подій - подано лише у цьому коді: void BasicDrawPane:: mouseMoved(wxMouseEvent& event) {} void BasicDrawPane:: mouseDown(wxMouseEvent& event) {} void BasicDrawPane:: mouseWheelMoved(wxMouseEvent& event){} void BasicDrawPane:: mouseReleased(wxMouseEvent& event) {} void BasicDrawPane:: rightClick(wxMouseEvent& event) {} void BasicDrawPane:: mouseLeftWindow(wxMouseEvent& event) {} void BasicDrawPane:: keyPressed(wxKeyEvent& event) {} void BasicDrawPane:: keyReleased(wxKeyEvent& event) {} */ BasicDrawPane:: BasicDrawPane(wxFrame* parent): wxPanel(parent) {} /* Буде викликано, коли панель потребуватиме перемалювання. Можна запустити цей виклик за допомогою Refresh()/Update(). */ void BasicDrawPane:: paintEvent(wxPaintEvent & evt) { wxPaintDC dc(this); render(dc); } /* Можна також використати clientDC для малювання на панелі у будь-який час. Такий спосіб не звільняє від потреби перехоплювати подій малювання, коли це можливо. Наприклад, менеджер вікон відкидає малюнком, коли вікно йде на задній план, і очікує на перемалювання, коли вікно повертається назад. У більшості випадків це не потрібно; достатньо перехоплювати події малювання й викликати Refresh() для оновлення. */ void BasicDrawPane::paintNow() { wxClientDC dc(this); render(dc); } /* Далі - поточна візуалізація окремим методом. Окремим для того, щоб він спрацював незалежно від використаного типу DC (наприклад, wxPaintDC чи wxClientDC).У наступних прикладах буде змінено лише розміри вікна і наступну частину коду. Для журнальної публікації замість усього коду буде подано лише цю частину. */ void BasicDrawPane::render(wxDC& dc) { // чорний контур ширини 1 піксель dc.SetPen(wxPen(wxColor(0,0,0),1)); for (int j = 0; j<20; j++) {// зафарбування точки (40+j,10+j) dc.DrawPoint(40+j,10+j); dc.DrawPoint(40+j,29-j); } wxFont font1( // опис шрифту 12, // розмір wxFONTFAMILY_DEFAULT,//родина wxFONTSTYLE_NORMAL, //стиль написання wxFONTWEIGHT_NORMAL, //наповнення false, // підкреслити? "Ubuntu"); // гарнітура dc.SetFont(font1); // призначення шрифту // чорний колір шрифту dc.SetTextForeground(wxColor(0,0,0)); // прозоре тло для виведення тексту dc.SetBackgroundMode(wxTRANSPARENT); // Виведення тексту з точки (40, 40) dc.DrawText(wxT("Текст"),40,40); wxFont font2 (12, // розмір wxFONTFAMILY_DEFAULT, wxFONTSTYLE_ITALIC, //стиль написання wxFONTWEIGHT_BOLD, //наповнення true, "Ubuntu"); // гарнітура */ dc.SetFont(font2); // призначення шрифту // Виведення повернутого тексту з (90,40) dc.DrawRotatedText( wxT("повернуто на 333º"),90,40,333); // заповнення зеленим кольором dc.SetBrush(*wxGREEN_BRUSH); // червоний контур ширини 5 пікселів dc.SetPen(wxPen(wxColor(255,0,0),5)); // намалювати коло радіусом 25 // і центром (40, 100) dc.DrawCircle(wxPoint(40,100), 25); // заповнення блакитним кольором dc.SetBrush(*wxBLUE_BRUSH); // рожевий контур ширини 20 пікселів dc.SetPen(wxPen(wxColor(255,175,175),20)); // намалювати прямокутник з верхньою лівою // вершиною (40,150) і розмірами 200x200 dc.DrawRectangle( 40, 150, 200, 200); // жовтий контур ширини 3 пікселі dc.SetPen(wxPen( wxColor(255,255,0),3)); // сполучити відрізком прямої точки // (40,150) і (240,350) dc.DrawLine(40,150,240,350); }