ubuntu用codeblocks编译wxwidget项目自绘按键菜单,但sizer有问题,如何解决?

想用sizer设定菜单栏中的自绘按键的布局,但是sizer好像没有起作用,按键还是只在起始位置画,并且设置为wxALL的border好像也只加在下面,不知道哪里出了问题,希望大家能为我解答,谢谢!
main.cpp代码:

#include "wxcustommenu.h"
#include <wx/sizer.h>

class MyApp: public wxApp
{
  wxFrame *frame;
public:

  bool OnInit()
  {
      frame = new wxFrame(NULL, wxID_ANY, wxT("Hello wxDC"), wxPoint(50,50), wxSize(800,600));

      wxCustomMenu *menubar_panel_ = new wxCustomMenu( frame, wxT("GREY") );

      wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
        sizer->Add(menubar_panel_, 0, wxEXPAND);
      menubar_panel_ -> Show();

      frame -> SetSizer(sizer);
      frame -> Show();
      return true;
  }
};

IMPLEMENT_APP(MyApp)

wxcustommenu.cpp代码:


   #include "wxcustommenu.h"
#include <wx/sizer.h>

BEGIN_EVENT_TABLE(wxCustomMenu, wxWindow)
END_EVENT_TABLE()

wxCustomMenu::wxCustomMenu(wxWindow* parent, wxColor bg) : wxWindow(parent, wxID_ANY),
file_menu_popup_(NULL), setting_menu_popup_(NULL)
{
   wxInitAllImageHandlers();
   SetBackgroundColour(bg);
   wxBoxSizer* hbox = new wxBoxSizer(wxHORIZONTAL);
   wxPanel *menubar_panel_;
   menubar_panel_ = new wxPanel(this, wxID_ANY);
   menubar_panel_->SetBackgroundColour(bg);
   wxBoxSizer *top_sizer_= new wxBoxSizer(wxHORIZONTAL);

   m_btn_1 = new wxCustomButton( menubar_panel_, homeMENU, wxT("Home"), wxSize(130, 50), wxDefaultPosition);
   m_btn_1 -> normal_bitmap(normal)-> down_bitmap(down)-> hover_bitmap(hover);
   m_btn_1 -> disable_bitmap(disable);
   m_btn_1 -> pre_bg(prebg) -> hover_bg(hoverbg);
   hbox->Add(m_btn_1, 0, wxALL, 5);
   m_btn_2 = new wxCustomButton( menubar_panel_, libMENU, wxT("Library"), wxSize(130, 50), wxDefaultPosition);
   m_btn_2 -> normal_bitmap(normal1)-> down_bitmap(down)-> hover_bitmap(hover1);
   m_btn_2 -> disable_bitmap(disable);
   m_btn_2 -> pre_bg(prebg) -> hover_bg(hoverbg);
   hbox->Add(m_btn_2, 0, wxALL, 3);

   top_sizer_->Add(hbox, 1, wxEXPAND, 5);

   menubar_panel_-> SetSizer(hbox);

   hbox->Fit(menubar_panel_);
}

wxcustommenu.h代码:

#include <wx/wx.h>
#include "wxcustombutton.h"
class wxCustomMenu : public wxWindow
{
public:
    enum menu
    {
       homeMENU,
       libMENU,
       ID_FILEOPEN,
       ID_QUIT,
       ID_SETSNAPPATH,
       ID_ABOUT
     };

    wxBitmap* normal = new wxBitmap(wxT("m32.png"), wxBITMAP_TYPE_PNG);
    wxBitmap* down = new wxBitmap(wxT("s32.png"), wxBITMAP_TYPE_PNG);
    wxBitmap* hover = new wxBitmap(wxT("m32.png"), wxBITMAP_TYPE_PNG);
    wxBitmap* disable = new wxBitmap(wxT("w32.png"), wxBITMAP_TYPE_PNG);

    wxBitmap* normal1 = new wxBitmap(wxT("h32.png"), wxBITMAP_TYPE_PNG);
    wxBitmap* hover1 = new wxBitmap(wxT("c32.png"), wxBITMAP_TYPE_PNG);

    wxColor* prebg = new wxColor(wxT("GREEN"));
    wxColor* hoverbg = new wxColor(wxT("YELLOW"));

    wxCustomButton* m_btn_1;
    wxCustomButton* m_btn_2;

    wxCustomMenu(wxWindow* parent, wxColor bg);

    DECLARE_EVENT_TABLE()
};

效果图(下面绿色的是被遮挡的另一个按键,不知道为什么按键的上面和左边都没有设置到border):

img

img

该回答引用GPTᴼᴾᴱᴺᴬᴵ
根据你提供的代码和效果图,可能有以下几个问题导致sizer无法按照预期工作:

  1. 没有给sizer中的组件指定proportion和flag参数
    sizer的第二个参数是proportion,用于指定组件在可用空间中占据的比例。sizer的第三个参数是flag,用于指定组件的布局方式,如wxALL、wxEXPAND等。在你的代码中,你没有为sizer中的组件指定这些参数,导致sizer无法按照预期工作。

  2. 没有给组件指定位置和大小
    在menu.cpp中,你使用了wxBoxSizer来布局组件,但没有给组件指定具体的位置和大小。如果没有指定位置和大小,组件将默认在父容器的左上角,并且大小为默认大小。

  3. 没有使用布局管理器来管理父容器
    在main.cpp中,你创建了wxBoxSizer,并将wxCustomMenu添加到sizer中。但是,你没有将sizer添加到frame中,也没有使用布局管理器来管理frame。如果没有使用布局管理器来管理frame,frame的大小和位置将会是默认的。

针对以上问题,你可以尝试以下方法:
1.给sizer中的组件指定proportion和flag参数
在你的代码中,你可以为sizer中的组件指定proportion和flag参数,如下所示:

top_sizer_->Add(hbox, 1, wxEXPAND | wxALL, 0);


这里,将proportion设置为1,表示组件在可用空间中占据所有可用空间的比例。将flag设置为wxEXPAND和wxALL,表示组件将占据所有可用空间,并且在组件周围添加边框。

2.给组件指定位置和大小
在menu.cpp中,你可以使用wxSizerFlags来指定组件的位置和大小,如下所示:

wxSizerFlags flags;
flags.Border(wxALL, 3);
flags.Expand();
hbox->Add(m_btn_1, flags);


这里,使用wxSizerFlags设置了组件的边框和扩展标志。你也可以使用wxSizerFlags来设置组件的位置和大小。

3.使用布局管理器来管理父容器
在main.cpp中,你可以使用wxBoxSizer来管理frame,如下所示:

wxBoxSizer* frame_sizer = new wxBoxSizer(wxVERTICAL);
frame_sizer->Add(sizer, 1, wxEXPAND);
frame->SetSizer(frame_sizer);


这里,创建了一个wxBoxSizer来管理frame。将sizer添加到frame_sizer中,并将proportion设置为1,表示sizer将占据所有可用空间。
·
如果你对以上建议进行了修改但是仍然存在问题,可以提供更多的代码和效果图以帮助我们更好地理解问题所在。

sizer并不会改变尺寸,需要手工设置尺寸。