cxy0408 2023-03-05 16:58 采纳率: 37.5%
浏览 12
已结题

wxwidgets自定义按键大小无法获取wxsize里的值控制按键大小,如何解决?

想获取wxsize里的值来画矩形以改变按键大小,但是使用了getsize好像没有用,输出了一下获取的值,发现都是20,不知道这个20哪里来的,也不知道怎样才能获取wxsize里的值,希望大家能指点我如何解决,谢谢!

#include <wx/wx.h>
#include <wx/sizer.h>
#include <iostream>

using namespace std;

class wxCustomButton : public wxWindow
{

    bool pressedDown;
    wxString text;

public:

    wxCustomButton(wxFrame* parent, wxString text, const wxSize& size = wxDefaultSize);
    wxSize DoGetBestSize() const;

    void paintEvent(wxPaintEvent & evt);
    void paintNow();

    void render(wxDC& dc);

    // some useful events
    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()
};


BEGIN_EVENT_TABLE(wxCustomButton, wxPanel)

    EVT_MOTION(wxCustomButton::mouseMoved)
    EVT_LEFT_DOWN(wxCustomButton::mouseDown)
    EVT_LEFT_UP(wxCustomButton::mouseReleased)
    EVT_RIGHT_DOWN(wxCustomButton::rightClick)
    EVT_LEAVE_WINDOW(wxCustomButton::mouseLeftWindow)
    EVT_KEY_DOWN(wxCustomButton::keyPressed)
    EVT_KEY_UP(wxCustomButton::keyReleased)
    EVT_MOUSEWHEEL(wxCustomButton::mouseWheelMoved)

    // catch paint events
    EVT_PAINT(wxCustomButton::paintEvent)

END_EVENT_TABLE()



wxCustomButton::wxCustomButton(wxFrame* parent, wxString text, const wxSize& size) :
 wxWindow(parent, wxID_ANY)
{
    this->text = text;
    pressedDown = false;
}

void wxCustomButton::paintEvent(wxPaintEvent & evt)
{
    wxPaintDC dc(this);
    render(dc);
}
void wxCustomButton::paintNow()
{
    wxClientDC dc(this);
    render(dc);
}

wxSize wxCustomButton::DoGetBestSize() const
{
 return GetSize();
}

void wxCustomButton::render(wxDC&  dc)
{
    int width = DoGetBestSize().GetWidth();
    int height = DoGetBestSize().GetHeight();
    if (pressedDown)
        dc.SetBrush( *wxRED_BRUSH );
    else
        dc.SetBrush( *wxGREY_BRUSH );

    dc.DrawRectangle( 0, 0, width, height );
    cout << "width:" << width << endl;
    cout << "height:" << width << endl;//两个输出都是20
    dc.DrawText( text, 20, 15 );
}

void wxCustomButton::mouseDown(wxMouseEvent& event)
{
    pressedDown = true;
    paintNow();
}
void wxCustomButton::mouseReleased(wxMouseEvent& event)
{
    pressedDown = false;
    paintNow();

    wxMessageBox( wxT("You pressed a custom button") );
}
void wxCustomButton::mouseLeftWindow(wxMouseEvent& event)
{
    if (pressedDown)
    {
        pressedDown = false;
        paintNow();
    }
}

// currently unused events
void wxCustomButton::mouseMoved(wxMouseEvent& event) {}
void wxCustomButton::mouseWheelMoved(wxMouseEvent& event) {}
void wxCustomButton::rightClick(wxMouseEvent& event) {}
void wxCustomButton::keyPressed(wxKeyEvent& event) {}
void wxCustomButton::keyReleased(wxKeyEvent& event) {}

class MyApp: public wxApp
{

    wxFrame *frame;
    wxCustomButton* m_btn_1;
    wxCustomButton* m_btn_2;
    wxCustomButton* m_btn_3;

public:

    bool OnInit()
    {
        // make sure to call this first
        wxInitAllImageHandlers();

        wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
        frame = new wxFrame(NULL, wxID_ANY, wxT("Hello wxDC"), wxPoint(50,50), wxSize(800,600));

        // then simply create like this
        m_btn_1 = new wxCustomButton( frame, wxT("My Custom Button 11"), wxSize(150, 50));//想获取这个wxsize里的值
        sizer->Add(m_btn_1, 0, wxALL, 5);
        m_btn_2 = new wxCustomButton( frame, wxT("Hello World!"), wxSize(150, 50));
        sizer->Add(m_btn_2, 0, wxALL, 5);
        m_btn_3 = new wxCustomButton( frame, wxT("Foo Bar"), wxSize(150, 50));
        sizer->Add(m_btn_3, 0, wxALL, 5);

        frame->SetSizer(sizer);

        frame->Show();
        return true;
    }

};

IMPLEMENT_APP(MyApp)


  • 写回答

1条回答 默认 最新

  • 「已注销」 2023-03-05 18:22
    关注

    “Devil组”引证GPT后的撰写:

    • 在wxCustomButton的构造函数中,要将提供的size参数传递给基类wxWindow的构造函数,以便使用该大小初始化窗口。否则,将使用默认大小(即20x20),这可能是看到的20的原因。
    • 在wxCustomButton类中,添加一个成员变量来存储按钮的大小,并在构造函数中初始化它。可以使用GetClientSize()方法获取窗口客户区的大小,并使用SetSize()方法设置按钮大小。
    • 然后,可以使用wxCustomButton::GetSize()方法获取按钮的大小,而不是使用wxCustomButton::DoGetBestSize()方法。最后,可以使用dc.GetTextExtent(text)方法获取文本的大小,并相应地定位文本。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月14日
  • 已采纳回答 3月6日
  • 创建了问题 3月5日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效