想用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):
该回答引用GPTᴼᴾᴱᴺᴬᴵ
根据你提供的代码和效果图,可能有以下几个问题导致sizer无法按照预期工作:
没有给sizer中的组件指定proportion和flag参数
sizer的第二个参数是proportion,用于指定组件在可用空间中占据的比例。sizer的第三个参数是flag,用于指定组件的布局方式,如wxALL、wxEXPAND等。在你的代码中,你没有为sizer中的组件指定这些参数,导致sizer无法按照预期工作。
没有给组件指定位置和大小
在menu.cpp中,你使用了wxBoxSizer来布局组件,但没有给组件指定具体的位置和大小。如果没有指定位置和大小,组件将默认在父容器的左上角,并且大小为默认大小。
没有使用布局管理器来管理父容器
在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并不会改变尺寸,需要手工设置尺寸。