【问题标题】:Size a button added to a wxRibbonButtonBar or size the ribbonPanel调整添加到 wxRibbonButtonBar 的按钮的大小或调整ribbonPanel 的大小
【发布时间】:2015-10-23 21:57:08
【问题描述】:

我有一个基本的窗口(框架)(实际上是用 FormBuilder 3.5 制作的),有一个垂直的尺寸器,然后是一个水平的尺寸器(如代码所示)。在 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() 似乎没有帮助。
- 调用 wxRibbonBar->Layout() 似乎没有帮助。
- 将最小面板宽度设置为 300 似乎没有任何影响。
- 创建一个 H box sizer 并使用 newPanel->SetSizer(wxBoxSizer a) nope.
- 设置box sizer后设置面板大小,不行。
作为一个额外的好处,面板宽度使用 sizer 约为 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。 我一直在参考样本。 我一直在寻找类似的问题。 如果我(在 cmets 中)链接到有答案的资源,如果没有答案,我会撰写答案。

【问题讨论】:

    标签: wxwidgets


    【解决方案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;
    };
    

    现在您已经声明了这些成员,您可以简单地更改添加到栏的按钮的“LARGE”大小的“x”值:

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

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

    此外,您不需要水平尺寸器来容纳功能区。我通常只是将功能区和面板堆叠在垂直大小调整器中,然后将面板用于窗口的“主要”部分。

    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 );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多