如何在wxwidgets中绘制矩形?

问题描述 投票:-2回答:1
#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中进行任何错误处理。

c++ wxwidgets
1个回答
0
投票

发布的代码存在多个问题,但我将此答案限于所提出的问题。如果要在应用程序框架上绘制矩形,则需要

  1. 在框架类中声明OnPaint方法,然后
  2. 更改事件表宏以设置OnPaint方法来处理绘画事件。

以下是这两个更改的更正示例:

#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类,但是该类从未在任何地方使用。

© www.soinside.com 2019 - 2024. All rights reserved.