我有一个基本的窗口(框架)(实际上是用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。 我一直在参考样本。 我找了类似的问题。 如果我(在评论中)链接到有答案的资源,我会在没有答案的情况下撰写答案。
答案 0 :(得分:1)
发生这种情况的原因是因为功能区会自动调整按钮的大小,使其所包含的面板的自动尺寸变小。如果向面板添加至少两个按钮,则它看起来很好。
但不要害怕,有办法解决这个问题。我不得不破解源代码来解决它,所以它可能有点像黑客。我不确定开发人员是否计划公开功能。
buttonbar.h
标题不会公开wxRibbonButtonBarButtonSizeInfo
或wxRibbonButtonBarButtonBase
的成员,因此首先您必须在源代码中声明它们:
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 );