调整添加到wxRibbonButtonBar的按钮的大小或调整ribbonPanel的大小

时间:2015-10-23 21:57:09

标签: wxwidgets

我有一个基本的窗口(框架)(实际上是用FormBuilder 3.5制作),带有一个垂直的sizer,然后是一个水平的(显示在代码中)。在H sizer中,我有一个带有1(页面,面板,按钮栏)和一个按钮的完整功能区。
我在功能区页面添加一个面板,然后在面板上添加一个按钮。它的大小非常小,按钮最终位于一个带有按钮的下拉框(窗格?)中。应该没有大小限制,它有足够的空间作为按钮。

//late creation code
wxRibbonPage *ribbonPage = m_mainFrame->m_mainRibbonPage;//public pointer
if (nullptr != ribbonPage)
{
    wxBoxSizer *a = new wxBoxSizer(wxHORIZONTAL);
    wxRibbonPanel *panel = new wxRibbonPanel(ribbonPage, wxID_ANY, wxT("button group"), wxNullBitmap, wxDefaultPosition, wxSize(-1, -1), wxRIBBON_PANEL_DEFAULT_STYLE);
    panel->SetSizer(a);
    panel->SetSize(wxSize(300, -1));//looks same with/without
    wxRibbonButtonBar *btnBar = new wxRibbonButtonBar(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0);
    btnBar->AddToggleButton(wxID_ANY, wxT("play"), wxArtProvider::GetBitmap(wxART_MISSING_IMAGE, wxART_TOOLBAR), wxEmptyString);

}
m_mainFrame->m_ribbonBar2->Realize();
m_mainFrame->m_ribbonBar2->Layout();
m_mainFrame->Bind(wxEVT_MENU, &MyApp::OnSelectCard, this);//these easy
m_mainFrame->Show();

- 有没有小组标题似乎没有帮助 - 调用wxButtonBar-> Realize()似乎没有帮助。
-Calling wxRibbonBar-> Layout()似乎没有帮助 - 将最小面板宽度设置为300似乎没有影响 - 创建一个H box sizer并使用newPanel-> SetSizer(wxBoxSizer a)nope。
- 设置盒子大小调整器后设置面板尺寸,不 并且作为额外的好处,面板宽度与尺寸调整器一起约为0。

//early object code derived from wxForm
wxBoxSizer* bSizer26;
bSizer26 = new wxBoxSizer( wxHORIZONTAL );

m_ribbonBar2 = new wxRibbonBar( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRIBBON_BAR_DEFAULT_STYLE );
m_ribbonBar2->SetArtProvider(new wxRibbonDefaultArtProvider); 
m_mainRibbonPage = new wxRibbonPage( m_ribbonBar2, ID_RIBBON_PAGE, wxEmptyString , wxNullBitmap , 0 );
m_ribbonBar2->SetActivePage( m_mainRibbonPage ); 
m_ribbonPanel2 = new wxRibbonPanel( m_mainRibbonPage, wxID_ANY, wxEmptyString , wxNullBitmap , wxDefaultPosition, wxDefaultSize, wxRIBBON_PANEL_DEFAULT_STYLE );
m_ribbonPanel2->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );

m_ribbonButtonBar2 = new wxRibbonButtonBar( m_ribbonPanel2, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
m_ribbonButtonBar2->AddHybridButton( wxID_ANY, wxT("Card Select"), wxArtProvider::GetBitmap( wxART_MISSING_IMAGE, wxART_TOOLBAR ), wxEmptyString);
m_ribbonBar2->Realize();

bSizer26->Add( m_ribbonBar2, 1, wxALL, 0 );

我一直在关注wxwidgets.org。 我一直在参考样本。 我找了类似的问题。 如果我(在评论中)链接到有答案的资源,我会在没有答案的情况下撰写答案。

1 个答案:

答案 0 :(得分:1)

发生这种情况的原因是因为功能区会自动调整按钮的大小,使其所包含的面板的自动尺寸变小。如果向面板添加至少两个按钮,则它看起来很好。

但不要害怕,有办法解决这个问题。我不得不破解源代码来解决它,所以它可能有点像黑客。我不确定开发人员是否计划公开功能。

buttonbar.h标题不会公开wxRibbonButtonBarButtonSizeInfowxRibbonButtonBarButtonBase的成员,因此首先您必须在源代码中声明它们:

class wxRibbonButtonBarButtonSizeInfo
{
public:
    bool is_supported;
    wxSize size;
    wxRect normal_region;
    wxRect dropdown_region;
};

class wxRibbonButtonBarButtonBase
{
public:
    wxRibbonButtonBarButtonInstance NewInstance();
    wxRibbonButtonBarButtonState GetLargestSize();
    bool GetSmallerSize(wxRibbonButtonBarButtonState* size, int n = 1);
    wxString label;
    wxString help_string;
    wxBitmap bitmap_large;
    wxBitmap bitmap_large_disabled;
    wxBitmap bitmap_small;
    wxBitmap bitmap_small_disabled;
    wxRibbonButtonBarButtonSizeInfo sizes[3];
    wxClientDataContainer client_data;
    int id;
    wxRibbonButtonKind kind;
    long state;
};

现在您宣布了这些成员,您只需更改" x" " LARGE"的价值您添加到栏中的按钮的大小:

wxRibbonButtonBarButtonBase* newButton = buttonBar->AddButton( wxID_NEW,
    "New", wxArtProvider::GetBitmap(wxART_NEW, wxART_TOOLBAR) );
newButton->sizes[wxRIBBON_BUTTONBAR_BUTTON_LARGE].size.x = 48;

中提琴!现在具有正确宽度的单个按钮将在面板上正确显示。似乎48像素是正确的最小尺寸。

此外,您不需要水平尺寸确定器来容纳色带。我通常只是在垂直分级器中堆叠一个色带和面板,然后使用面板来实现" main"窗户的一部分。

wxFrame* frame = new wxFrame( NULL, wxID_ANY, "wxTestProject",
    wxDefaultPosition, wxSize(640,480) );
wxRibbonBar* ribbon = new wxRibbonBar( frame, wxID_ANY );
wxPanel* panel = new wxPanel( frame );

wxBoxSizer* sizer = new wxBoxSizer( wxVERTICAL );
sizer->Add( ribbon, 0, wxGROW, 0 );
sizer->Add( panel, 1, wxGROW, 0 );
frame->SetSizer( sizer );