Как нарисовать прямоугольник в wxwidgets? - PullRequest
0 голосов
/ 29 января 2020
#include "wx/wx.h"

class MyFrame : public wxFrame{
   public:
       MyFrame();
       ~MyFrame();
    private:
       //DECLARE_EVENT_TABLE()
};

class MyWindow : public wxWindow{
   public:
    void OnPaint(wxPaintEvent& event);
    private:
      DECLARE_EVENT_TABLE()
};

class MyApp : public wxApp
{
    public:
       MyApp();
       ~MyApp();
       virtual bool OnInit();
        void DrawSimpleShapes(wxDC& dc);
    private:
       MyFrame* m_frame = NULL;
       //MyWindow* w = NULL;
};

MyFrame::MyFrame() : wxFrame(nullptr,wxID_ANY,"Rectangle",wxPoint(30,30),wxSize(800,600))
{

}

bool MyApp :: OnInit()
{
   m_frame = new MyFrame();
   m_frame->Show();
   //w = new MyWindow();
   //w->Show();
   return true;
}
wxIMPLEMENT_APP(MyApp);
wxBEGIN_EVENT_TABLE(MyWindow,wxWindow)
   EVT_PAINT(MyWindow::OnPaint)
wxEND_EVENT_TABLE()
MyFrame::~MyFrame()
{

}

MyApp::MyApp()
{

}

MyApp::~MyApp()
{

}

 void MyWindow :: OnPaint(wxPaintEvent& event)
 {
    wxPaintDC dc(this);
    dc.SetPen(*wxBLACK_PEN);
    dc.SetBrush(*wxRED_BRUSH);
    wxSize sz = GetClientSize();
    wxCoord w = 100, h = 50;
    int x = wxMax(0,(sz.x-w)/2);
    int y = wxMax(0,(sz.y - h)/2);
    wxRect recToDraw(x,y,w,h);
    dc.DrawRectangle(recToDraw);
 }

Мне нужны некоторые руководства по обучению wxWidgets. В чем проблема с моим кодом? Когда я запускаю этот код, он не печатает прямоугольник. Вместо этого он просто печатает только окно. Я новичок в библиотеке wxWidgets, поэтому мне трудно найти какие-либо ошибки. Я не могу обрабатывать ошибки в wxWidgets.

1 Ответ

1 голос
/ 29 января 2020

Существует много проблем с размещенным кодом, но я ограничу этот ответ вопросом, который был задан. Если вы хотите нарисовать прямоугольник на фрейме приложения, вам нужно

  1. объявить метод OnPaint в классе фрейма и
  2. изменить макрос таблицы событий, чтобы установить метод OnPaint для обработки события рисования.

Вот исправленный пример с этими 2 изменениями:

#include "wx/wx.h"

class MyFrame : public wxFrame{
   public:
       MyFrame();
       ~MyFrame();
    private:
       void OnPaint(wxPaintEvent& event);
       DECLARE_EVENT_TABLE()
};

class MyApp : public wxApp
{
    public:
       MyApp();
       ~MyApp();
       virtual bool OnInit();
    private:
       MyFrame* m_frame = NULL;
};

MyFrame::MyFrame() : wxFrame(nullptr,wxID_ANY,"Rectangle",wxPoint(30,30),wxSize(800,600))
{

}

bool MyApp :: OnInit()
{
   m_frame = new MyFrame();
   m_frame->Show();
   return true;
}
wxIMPLEMENT_APP(MyApp);

wxBEGIN_EVENT_TABLE(MyFrame,wxFrame)
   EVT_PAINT(MyFrame::OnPaint)
wxEND_EVENT_TABLE()

MyFrame::~MyFrame()
{

}

MyApp::MyApp()
{

}

MyApp::~MyApp()
{

}

void MyFrame :: OnPaint(wxPaintEvent& event)
{
    wxPaintDC dc(this);
    dc.SetPen(*wxBLACK_PEN);
    dc.SetBrush(*wxRED_BRUSH);
    wxSize sz = GetClientSize();
    wxCoord w = 100, h = 50;
    int x = wxMax(0,(sz.x-w)/2);
    int y = wxMax(0,(sz.y - h)/2);
    wxRect recToDraw(x,y,w,h);
    dc.DrawRectangle(recToDraw);
}

В опубликованном вами коде у вас был дополнительный класс MyWindow, но этот класс никогда не использовался нигде.

...