C++ C++;wxWidgets施胶器的巨大差距(初学者)

C++ C++;wxWidgets施胶器的巨大差距(初学者),c++,wxwidgets,C++,Wxwidgets,我正在使用水平和垂直Boxsizer来构建我的GUI,到目前为止,我已经成功地使用每个sizer上的expand将所有内容添加到sizer中,然后调整diff元素的最小或最大宽度/高度以获得我想要的内容。不过我遇到了一个奇怪的问题 在我的GUI内容中有两个缺口我不理解。这是一张图片: 差距#1 我不理解差距1,因为它似乎没有必要。整个GUI从一个包含2个元素的垂直boxsizer开始。红色StaticText上面的所有内容都进入顶部,红色StaticText包含在第二个元素中 在顶部条带中的子

我正在使用水平和垂直Boxsizer来构建我的GUI,到目前为止,我已经成功地使用每个sizer上的expand将所有内容添加到sizer中,然后调整diff元素的最小或最大宽度/高度以获得我想要的内容。不过我遇到了一个奇怪的问题

在我的GUI内容中有两个缺口我不理解。这是一张图片:

差距#1

我不理解差距1,因为它似乎没有必要。整个GUI从一个包含2个元素的垂直boxsizer开始。红色StaticText上面的所有内容都进入顶部,红色StaticText包含在第二个元素中

在顶部条带中的子尺寸标注器中,需要的最大高度是TextCtrls的“浇注料”和“焊盘”列。这让我想到了奇怪的差距#2

差距#2

直到我为上面的4个按钮设置了最大高度,这个间隙才出现。我用油漆画了紫色的轮廓,这样你就可以看到尺寸器是如何装配在一起的(或者它们应该如何装配在一起,除非我弄错了)。间隙位于垂直尺寸器的开始处,然后包含一些其他尺寸器。。。在我设置这4个按钮的最大高度之前,这4个按钮的高度正好填补了这个空白区域。当我为它们设置最大高度时,我希望下面的所有内容都向上滑动,而不是向下滑动

下面是我在构建整个GUI的构造函数中的所有代码

// mainPanel
wxPanel *mainPanel = new wxPanel(this, wxID_ANY);

// mainPanelSizer (vertical)
wxBoxSizer *mainPanelSizer = new wxBoxSizer(wxVERTICAL);

// progSizer (horizontal)
// contains program along top, and log window is along the bottom
// program contains 3 "columns"
wxBoxSizer *progSizer = new wxBoxSizer(wxHORIZONTAL);
mainPanelSizer->Add(progSizer, wxSizerFlags(1).Expand());

// 1. DECK
// deckSizer (horizontal)
wxBoxSizer *deckSizer = new wxBoxSizer(wxHORIZONTAL);
progSizer->Add(deckSizer, wxSizerFlags(1).Expand());

// castables column
wxBoxSizer *deckSizerCasts = new wxBoxSizer(wxVERTICAL);
deckSizer->Add(deckSizerCasts, wxSizerFlags(1).Expand());

// castables title
wxStaticText *deckCastsTitle = new wxStaticText(mainPanel, wxID_ANY, "Castables", wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER_HORIZONTAL);
deckCastsTitle->SetBackgroundColour(*wxYELLOW);
deckCastsTitle->SetMaxSize(wxSize(-1, 25));
deckSizerCasts->Add(deckCastsTitle, wxSizerFlags(1).Expand());

// castables content
for ( int i = 0; i < 25; i++ )
{
    wxTextCtrl *textCtrl = new wxTextCtrl(mainPanel, wxID_ANY, wxEmptyString);
    textCtrl->SetMinSize(wxSize(200, -1));
    textCtrl->SetMaxSize(wxSize(-1, 25));
    deckInputCastables.push_back(textCtrl);
    deckSizerCasts->Add(textCtrl, wxSizerFlags(1).Expand());
}

// lands column
wxBoxSizer *deckSizerLands = new wxBoxSizer(wxVERTICAL);
deckSizer->Add(deckSizerLands, wxSizerFlags(1).Expand());

// lands title
wxStaticText *deckLandsTitle = new wxStaticText(mainPanel, wxID_ANY, "Lands", wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER_HORIZONTAL);
deckLandsTitle->SetBackgroundColour(*wxGREEN);
deckLandsTitle->SetMaxSize(wxSize(-1, 25));
deckSizerLands->Add(deckLandsTitle, wxSizerFlags(1).Expand());


// lands content
for ( int i = 0; i < 25; i++ )
{
    wxTextCtrl *textCtrl = new wxTextCtrl(mainPanel, wxID_ANY, wxEmptyString);
    textCtrl->SetMinSize(wxSize(200, -1));
    textCtrl->SetMaxSize(wxSize(-1, 25));
    deckInputLands.push_back(textCtrl);
    deckSizerLands->Add(textCtrl, wxSizerFlags(1).Expand());
}


// 2. HAND
// handSizer (vertical)
wxBoxSizer *handSizer = new wxBoxSizer(wxVERTICAL);
progSizer->Add(handSizer, wxSizerFlags(1).Expand());

// hand title
wxStaticText *deckHandTitle = new wxStaticText(mainPanel, wxID_ANY, "Hand", wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER_HORIZONTAL);
deckHandTitle->SetBackgroundColour(*wxCYAN);
deckHandTitle->SetMaxSize(wxSize(-1, 25));
handSizer->Add(deckHandTitle, wxSizerFlags(1).Expand());


// hand content
for ( int i = 0; i < 7; i++ )
{
    wxTextCtrl *textCtrl = new wxTextCtrl(mainPanel, wxID_ANY, wxEmptyString);
    textCtrl->SetMinSize(wxSize(200, -1));
    textCtrl->SetMaxSize(wxSize(-1, 25));
    handInputs.push_back(textCtrl);
    handSizer->Add(textCtrl, wxSizerFlags(1).Expand());
}


// 3. OPTS
wxBoxSizer *optsSizer = new wxBoxSizer(wxVERTICAL);
progSizer->Add(optsSizer, wxSizerFlags(1).Expand());

// a. OPTS INSTRUCTIONS (horizontal)
// contains buttons for things can do,
// add or remove needs, reset all, or calculate
wxBoxSizer *optsInstructSizer = new wxBoxSizer(wxHORIZONTAL);
optsSizer->Add(optsInstructSizer, wxSizerFlags(1).Expand());

wxButton *addNeedButton = new wxButton(mainPanel, wxID_ANY, "+ Need");
//addNeedButton->SetMaxSize(wxSize(-1, 50));
optsInstructSizer->Add(addNeedButton, wxSizerFlags(1).Expand());

wxButton *removeNeedButton = new wxButton(mainPanel, wxID_ANY, "- Need");
//removeNeedButton->SetMaxSize(wxSize(-1, 50));
optsInstructSizer->Add(removeNeedButton, wxSizerFlags(1).Expand());

wxButton *resetAllButton = new wxButton(mainPanel, wxID_ANY, "Reset All");
//resetAllButton->SetMaxSize(wxSize(-1, 50));
optsInstructSizer->Add(resetAllButton, wxSizerFlags(1).Expand());

wxButton *calculateButton = new wxButton(mainPanel, wxID_ANY, "Calculate");
//calculateButton->SetMaxSize(wxSize(-1, 50));
optsInstructSizer->Add(calculateButton, wxSizerFlags(1).Expand());

// b. NEEDS WRAP SIZER
// contains all the needs
wxBoxSizer *needsWrapSizer = new wxBoxSizer(wxVERTICAL);
optsSizer->Add(needsWrapSizer, wxSizerFlags(1).Expand());

// b1. a single need we can copy to make more needs
wxBoxSizer *needsItemSizer = new wxBoxSizer(wxVERTICAL);
needsWrapSizer->Add(needsItemSizer, wxSizerFlags(1).Expand());

// each need has 3 horrizontal components
// i. filters check area
// we'll do 3 columns of filters so 12 possible.
// this is
wxBoxSizer *needsItemFiltersSizer = new wxBoxSizer(wxHORIZONTAL);
needsItemSizer->Add(needsItemFiltersSizer, wxSizerFlags(1).Expand());


// 4 filters per column: col 1
wxBoxSizer *needsItemFiltersCol1Sizer = new wxBoxSizer(wxVERTICAL);
needsItemFiltersSizer->Add(needsItemFiltersCol1Sizer, wxSizerFlags(1).Expand());
for ( int i = 0; i < 4; i++ )
{
    wxCheckBox *filterCheck = new wxCheckBox(mainPanel, wxID_ANY, "filter " + wxString::Format(wxT("%d"), (int)(i + 1)));
    filterCheck->SetBackgroundColour(*wxGREEN);
    needsItemFiltersCol1Sizer->Add(filterCheck, wxSizerFlags(1).Expand());
}

// 4 filters per column: col 2
wxBoxSizer *needsItemFiltersCol2Sizer = new wxBoxSizer(wxVERTICAL);
needsItemFiltersSizer->Add(needsItemFiltersCol2Sizer, wxSizerFlags(1).Expand());
for ( int i = 4; i < 8; i++ )
{
    wxCheckBox *filterCheck = new wxCheckBox(mainPanel, wxID_ANY, "filter " + wxString::Format(wxT("%d"), (int)(i + 1)));
    needsItemFiltersCol2Sizer->Add(filterCheck, wxSizerFlags(1).Expand());
}

// 4 filters per column: col 3
wxBoxSizer *needsItemFiltersCol3Sizer = new wxBoxSizer(wxVERTICAL);
needsItemFiltersSizer->Add(needsItemFiltersCol3Sizer, wxSizerFlags(1).Expand());
for ( int i = 8; i < 12; i++ )
{
    wxCheckBox *filterCheck = new wxCheckBox(mainPanel, wxID_ANY, "filter " + wxString::Format(wxT("%d"), (int)(i + 1)));
    needsItemFiltersCol3Sizer->Add(filterCheck, wxSizerFlags(1).Expand());
}


// ii. build line (3 variations: land/land+fixing, specific card, and other
// should put in a ramp, but for now just do "land"
wxBoxSizer *needsItemBuildLineSizer = new wxBoxSizer(wxHORIZONTAL);
needsItemSizer->Add(needsItemBuildLineSizer, wxSizerFlags(1).Expand());

// line item -> "("
wxButton *needsItemOpenBrackButton = new wxButton(mainPanel, wxID_ANY, "(");
needsItemBuildLineSizer->Add(needsItemOpenBrackButton, wxSizerFlags(1).Expand());

// line item -> cards to draw combo box
wxComboBox *cardsToDrawCombo = new wxComboBox(mainPanel, wxID_ANY);
cardsToDrawCombo->Append("1 to Draw");
cardsToDrawCombo->Append("2 to Draw");
cardsToDrawCombo->Append("3 to Draw");
cardsToDrawCombo->Append("4 to Draw");
cardsToDrawCombo->Append("5 to Draw");
cardsToDrawCombo->Append("6 to Draw");
cardsToDrawCombo->Append("7 to Draw");
cardsToDrawCombo->Append("8 to Draw");
cardsToDrawCombo->Append("9 to Draw");
cardsToDrawCombo->Append("10 to Draw");
needsItemBuildLineSizer->Add(cardsToDrawCombo, wxSizerFlags(1).Expand());

// line item -> filters to apply (any/all)
wxComboBox *filtersApplyTypeCombo = new wxComboBox(mainPanel, wxID_ANY);
filtersApplyTypeCombo->Append("Any");
filtersApplyTypeCombo->Append("All");
needsItemBuildLineSizer->Add(filtersApplyTypeCombo, wxSizerFlags(1).Expand());

// line item -> cost colors combo
wxComboBox *filtersCostColorsCombo = new wxComboBox(mainPanel, wxID_ANY);
filtersCostColorsCombo->Append("Any");
filtersCostColorsCombo->Append("Black");
filtersCostColorsCombo->Append("Blue");
filtersCostColorsCombo->Append("Green");
filtersCostColorsCombo->Append("Red");
filtersCostColorsCombo->Append("White");
needsItemBuildLineSizer->Add(filtersCostColorsCombo, wxSizerFlags(1).Expand());

// line item -> cost amount combo
wxComboBox *filtersCostAmountCombo = new wxComboBox(mainPanel, wxID_ANY);
filtersCostAmountCombo->Append("<= 1");
filtersCostAmountCombo->Append("<= 2");
filtersCostAmountCombo->Append("<= 3");
filtersCostAmountCombo->Append("<= 4");
filtersCostAmountCombo->Append("<= 5");
filtersCostAmountCombo->Append("<= 6");
needsItemBuildLineSizer->Add(filtersCostAmountCombo, wxSizerFlags(1).Expand());

// line item -> ")"
wxButton *needsItemCloseBrackButton = new wxButton(mainPanel, wxID_ANY, ")");
needsItemBuildLineSizer->Add(needsItemCloseBrackButton , wxSizerFlags(1).Expand());

// line item -> "AND"
wxButton *needsItemAndButton = new wxButton(mainPanel, wxID_ANY, "AND");
needsItemBuildLineSizer->Add(needsItemAndButton, wxSizerFlags(1).Expand());

// line item -> "OR"
wxButton *needsItemOrButton = new wxButton(mainPanel, wxID_ANY, "OR");
needsItemBuildLineSizer->Add(needsItemOrButton, wxSizerFlags(1).Expand());


// iii. line buttons (reset, + row below, - this row
wxBoxSizer *needsItemButtonSizer = new wxBoxSizer(wxHORIZONTAL);
needsItemSizer->Add(needsItemButtonSizer, wxSizerFlags(1).Expand());

// buttons
wxButton *needsItemInlineAddButton = new wxButton(mainPanel, wxID_ANY, "+");
needsItemButtonSizer->Add(needsItemInlineAddButton, wxSizerFlags(1).Expand());

wxButton *needsItemInlineRemoveButton = new wxButton(mainPanel, wxID_ANY, "-");
needsItemButtonSizer->Add(needsItemInlineRemoveButton, wxSizerFlags(1).Expand());

wxButton *needsItemInlineResetButton = new wxButton(mainPanel, wxID_ANY, "R");
needsItemButtonSizer->Add(needsItemInlineResetButton, wxSizerFlags(1).Expand());


// b2. At the bottom of all needs is a
// test control that has the build string
wxBoxSizer *needsBuildDisplaySizer = new wxBoxSizer(wxVERTICAL);
needsWrapSizer->Add(needsBuildDisplaySizer, wxSizerFlags(1).Expand());

// outputSizer (horizontal)
wxStaticText *buildDisplay = new wxStaticText(mainPanel, wxID_ANY, "Build Display");
buildDisplay->SetBackgroundColour(*wxBLUE);
needsBuildDisplaySizer->Add(buildDisplay, wxSizerFlags(1).Expand());


// at the bottom of the main panel stretches the log output
wxBoxSizer *outputSizer = new wxBoxSizer(wxHORIZONTAL);
mainPanelSizer ->Add(outputSizer, wxSizerFlags(1).Expand());

// logOutput StaticText
logOutput = new wxStaticText(mainPanel, wxID_ANY, "Output Terminal");
logOutput->SetBackgroundColour(*wxRED);
outputSizer ->Add(logOutput, wxSizerFlags(1).Expand());



mainPanel->SetSizerAndFit(mainPanelSizer);
this->Fit();
//主面板
wxPanel*mainPanel=新的wxPanel(这个,wxID_ANY);
//主面板尺寸测定器(垂直)
wxBoxSizer*mainPanelSizer=新的wxBoxSizer(wxVERTICAL);
//编程器(水平)
//顶部包含程序,底部是日志窗口
//程序包含3个“列”
wxBoxSizer*progSizer=新的wxBoxSizer(wxHORIZONTAL);
mainPanelSizer->Add(progSizer,wxSizerFlags(1.Expand());
// 1. 甲板
//平板筛(卧式)
wxBoxSizer*deckSizer=新的wxBoxSizer(Wx水平);
progSizer->Add(deckSizer,wxSizerFlags(1.Expand());
//浇注料柱
wxBoxSizer*deckSizerCasts=新的wxBoxSizer(wxVERTICAL);
deckSizer->Add(deckSizerCasts,wxSizerFlags(1.Expand());
//浇注料名称
wxStaticText*deckCastsTitle=新的wxStaticText(主面板,wxID_任意,“浇注料”,wxDefaultPosition,wxDefaultSize,wxALIGN_中心水平);
DeckCastStile->SetbackgroundColor(*wxYELLOW);
deckCastsTitle->SetMaxSize(wxSize(-1,25));
deckSizerCasts->Add(DeckCastStite,wxSizerFlags(1.Expand());
//浇注料含量
对于(int i=0;i<25;i++)
{
wxTextCtrl*textCtrl=newwxtextctrl(主面板,wxID_ANY,wxEmptyString);
textCtrl->SetMinSize(wxSize(200,-1));
textCtrl->SetMaxSize(wxSize(-1,25));
deckInputCastables.向后推(textCtrl);
deckSizerCasts->Add(textCtrl,wxSizerFlags(1.Expand());
}
//地栏
wxBoxSizer*deckSizerLands=新的wxBoxSizer(wxVERTICAL);
deckSizer->Add(deckSizerLands,wxSizerFlags(1.Expand());
//土地所有权
wxStaticText*deckLandsTitle=新的wxStaticText(主面板,wxID_任意,“接地”,wxDefaultPosition,wxDefaultSize,wxALIGN_中心水平);
deckLandsTitle->SetbackgroundColor(*WX绿色);
deckLandsTitle->SetMaxSize(wxSize(-1,25));
deckSizerLands->Add(deckLandsTitle,wxSizerFlags(1.Expand());
//土地含量
对于(int i=0;i<25;i++)
{
wxTextCtrl*textCtrl=newwxtextctrl(主面板,wxID_ANY,wxEmptyString);
textCtrl->SetMinSize(wxSize(200,-1));
textCtrl->SetMaxSize(wxSize(-1,25));
deckInputLands.向后推(textCtrl);
deckSizerLands->Add(textCtrl,wxSizerFlags(1.Expand());
}
// 2. 手
//手持装置(垂直)
wxBoxSizer*手持设备=新的wxBoxSizer(wxVERTICAL);
progSizer->Add(handSizer,wxSizerFlags(1.Expand());
//手写标题
wxStaticText*deckHandTitle=新wxStaticText(主面板,wxID_任意,“手”,wxDefaultPosition,wxDefaultSize,wxALIGN_中心水平);
deckHandTitle->SetbackgroundColor(*wxCYAN);
deckHandTitle->SetMaxSize(wxSize(-1,25));
handSizer->Add(deckHandTitle,wxSizerFlags(1.Expand());
//手内容
对于(int i=0;i<7;i++)
{
wxTextCtrl*textCtrl=newwxtextctrl(主面板,wxID_ANY,wxEmptyString);
textCtrl->SetMinSize(wxSize(200,-1));
textCtrl->SetMaxSize(wxSize(-1,25));
手动输入。向后推(textCtrl);
handSizer->Add(textCtrl,wxSizerFlags(1.Expand());
}
// 3. 选择
wxBoxSizer*optsizer=新的wxBoxSizer(wxVERTICAL);
progSizer->Add(optsSizer,wxSizerFlags(1.Expand());
//a。OPTS指令(水平)
//包含可以执行的操作的按钮,
//添加或删除需求、全部重置或计算
wxBoxSizer*OptInstructSizer=新的wxBoxSizer(wxHORIZONTAL);
optsizer->Add(optsInstructSizer,wxSizerFlags(1.Expand());
wxButton*addNeedButton=新的wxButton(主面板,wxID_ANY,“+Need”);
//addNeedButton->SetMaxSize(wxSize(-1,50));
optinstructsizer->Add(addNeedButton,wxSizerFlags(1.Expand());
wxButton*removeNeedButton=新的wxButton(主面板,wxID_ANY,“-Need”);
//removeNeedButton->SetMaxSize(wxSize(-1,50));
optsInstructSizer->Add(移除按钮,wxSizerFlags(1.Expand());
wxButton*resetAllButton=新的wxButton(主面板,wxID_ANY,“全部重置”);
//resetAllButton->SetMaxSize(wxSize(-1,50));
optinstructsizer->Add(resetAllButton,wxSizerFlags(1.Expand());
wxButton*calculateButton=新的wxButton(主面板,wxID_ANY,“计算”);
//calculateButton->SetMaxSize(wxSize(-1,50));
optinstructsizer->Add(calculateButton,wxSizerFlags(1.Expand());
//b。需要包装浆纱机
//包含所有需要
wxBoxSizer*needsWrapSizer=新的wxBoxSizer(wxVERTICAL);
optsizer->Add(needsWrapSizer,wxSizerFlags(1.Expand());
//b1。我们可以复制一个需求来满足更多需求
wxBoxSizer*needsItemSizer=新的wxBoxSizer(wxVERTICAL);
needsWrapSizer->Add(needsItemSizer,wxSizerFlags(1.Expand());
//每个需求有3个横向组件
//一,。过滤器检查区
//我们将使用3列过滤器,这样就有12个可能。
//这是
wxBoxSizer*NeedSitemFilterSizer=新的wxBoxSizer(wxHORIZONTAL);
needsItemSizer->Add(needsItemFiltersSizer,wxSizerFlags(1.Expand());
//4楼
optsSizer->Add(optsInstructSizer, wxSizerFlags(0).Expand());
optsSizer->Add(optsInstructSizer, wxSizerFlags().Expand());