簡體   English   中英

如何在 wxwidgets 中繪制矩形?

[英]How to draw a rectangle in wxwidgets?

#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. 在框架類中聲明 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 類,但該類從未在任何地方使用過。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM