本文整理匯總了C++中ShuttleGui::StartTwoColumn方法的典型用法代碼示例。如果您正苦於以下問題:C++ ShuttleGui::StartTwoColumn方法的具體用法?C++ ShuttleGui::StartTwoColumn怎麽用?C++ ShuttleGui::StartTwoColumn使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在類ShuttleGui
的用法示例。
在下文中一共展示了ShuttleGui::StartTwoColumn方法的11個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的C++代碼示例。
示例1: PopulateOrExchange
void ExportFFmpegWMAOptions::PopulateOrExchange(ShuttleGui & S)
{
S.StartHorizontalLay(wxEXPAND, 0);
{
S.StartStatic(_("WMA Export Setup"), 0);
{
S.StartTwoColumn();
{
S.TieChoice(_("Bit Rate:"), wxT("/FileFormats/WMABitRate"),
180189, mBitRateNames, mBitRateLabels);
}
S.EndTwoColumn();
}
S.EndStatic();
}
S.EndHorizontalLay();
S.AddStandardButtons();
Layout();
Fit();
SetMinSize(GetSize());
Center();
return;
}
示例2: PopulateOrExchange
void DirectoriesPrefs::PopulateOrExchange(ShuttleGui & S)
{
S.SetBorder(2);
S.StartStatic(_("Temporary files directory"));
{
S.StartMultiColumn(3, wxEXPAND);
{
S.SetStretchyCol(1);
S.Id(TempDirID);
mTempDir = S.TieTextBox(_("&Location:"),
wxT("/Directories/TempDir"),
wxT(""),
30);
S.Id(ChooseButtonID);
S.AddButton(_("C&hoose..."));
S.AddFixedText(_("Free Space:"));
mFreeSpace = S.AddVariableText(wxT(""));
}
S.EndMultiColumn();
}
S.EndStatic();
#ifdef DEPRECATED_AUDIO_CACHE
// See http://bugzilla.audacityteam.org/show_bug.cgi?id=545.
S.StartStatic(_("Audio cache"));
{
S.TieCheckBox(_("Play and/or record using &RAM (useful for slow drives)"),
wxT("/Directories/CacheBlockFiles"),
false);
S.StartTwoColumn();
{
S.TieNumericTextBox(_("Mi&nimum Free Memory (MB):"),
wxT("/Directories/CacheLowMem"),
16,
9);
}
S.EndTwoColumn();
S.AddVariableText(_("If the available system memory falls below this value, audio will no longer\nbe cached in memory and will be written to disk."))->Wrap(600);
}
S.EndStatic();
#endif // DEPRECATED_AUDIO_CACHE
}
示例3: PopulateOrExchange
void WaveformPrefs::PopulateOrExchange(ShuttleGui & S)
{
mPopulating = true;
S.SetBorder(2);
// S.StartStatic(_("Track Settings"));
{
mDefaultsCheckbox = 0;
if (mWt) {
/* i18n-hint: use is a verb */
mDefaultsCheckbox = S.Id(ID_DEFAULTS).TieCheckBox(_("&Use Preferences"), mDefaulted);
}
S.StartStatic(_("Display"));
{
S.StartTwoColumn();
{
mScaleChoice =
S.Id(ID_SCALE).TieChoice(_("S&cale") + wxString(wxT(":")),
*(int*)&mTempSettings.scaleType,
&mScaleChoices);
mRangeChoice =
S.Id(ID_RANGE).TieChoice(_("Waveform dB &range") + wxString(wxT(":")),
*(int*)&mTempSettings.dBRange,
&mRangeChoices);
S.SetSizeHints(mRangeChoices);
}
S.EndTwoColumn();
}
S.EndStatic();
}
// S.EndStatic();
/*
S.StartStatic(_("Global settings"));
{
}
S.EndStatic();
*/
EnableDisableRange();
mPopulating = false;
}
示例4: PopulateOrExchange
void NormalizeDialog::PopulateOrExchange(ShuttleGui & S)
{
wxTextValidator vld(wxFILTER_NUMERIC);
S.StartHorizontalLay(wxCENTER, false);
{
S.AddTitle(_("by Dominic Mazzoni"));
}
S.EndHorizontalLay();
S.StartHorizontalLay(wxCENTER, false);
{
// Add a little space
}
S.EndHorizontalLay();
S.StartTwoColumn();
{
S.StartVerticalLay(false);
{
mDCCheckBox = S.Id(ID_DC_REMOVE).AddCheckBox(_("Remove any DC offset (center on 0.0 vertically)"),
mDC ? wxT("true") : wxT("false"));
mGainCheckBox = S.Id(ID_NORMALIZE_AMPLITUDE).AddCheckBox(_("Normalize maximum amplitude to:"),
mGain ? wxT("true") : wxT("false"));
S.StartHorizontalLay(wxALIGN_CENTER, false);
{
mLevelTextCtrl = S.Id(ID_LEVEL_TEXT).AddTextBox(wxT(""), wxT(""), 10);
mLevelTextCtrl->SetValidator(vld);
mLevelTextCtrl->SetName(_("Maximum amplitude dB"));
mLeveldB = S.AddVariableText(_("dB"), false,
wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
mWarning = S.AddVariableText( wxT(""), false,
wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
}
S.EndHorizontalLay();
mStereoIndCheckBox = S.AddCheckBox(_("Normalize stereo channels independently"),
mStereoInd ? wxT("true") : wxT("false"));
}
S.EndVerticalLay();
}
S.EndTwoColumn();
}
示例5: PopulateOrExchange
void DirectoriesPrefs::PopulateOrExchange(ShuttleGui & S)
{
S.SetBorder(2);
S.StartStatic(_("Temporary files directory"));
{
S.StartMultiColumn(3, wxEXPAND);
{
S.SetStretchyCol(1);
S.Id(TempDirID);
mTempDir = S.TieTextBox(_("Location:"),
wxT("/Directories/TempDir"),
wxT(""),
30);
S.Id(ChooseButtonID);
S.AddButton(_("Choose..."));
S.AddFixedText(_("Free Space:"));
mFreeSpace = S.AddVariableText(wxT(""));
}
S.EndMultiColumn();
}
S.EndStatic();
S.StartStatic(_("Audio cache"));
{
S.TieCheckBox(_("Play and/or record using RAM (useful for slow drives)"),
wxT("/Directories/CacheBlockFiles"),
false);
S.StartTwoColumn();
{
S.TieTextBox(_("Minimum Free Memory (MB):"),
wxT("/Directories/CacheLowMem"),
16,
9);
}
S.EndTwoColumn();
S.AddVariableText(_("If the available system memory falls below this value, audio will no longer\nbe cached in memory and will be written to disk."))->Wrap(600);
}
S.EndStatic();
}
示例6: PopulateOrExchange
void WaveformPrefs::PopulateOrExchange(ShuttleGui & S)
{
mPopulating = true;
S.SetBorder(2);
// S.StartStatic(_("Track Settings"));
{
mDefaultsCheckbox = 0;
if (mWt) {
/* i18n-hint: use is a verb */
mDefaultsCheckbox = S.Id(ID_DEFAULTS).TieCheckBox(_("Use Preferences"), mDefaulted);
}
S.StartStatic(_("Display"));
{
S.StartTwoColumn();
{
S.Id(ID_SCALE).TieChoice(_("S&cale") + wxString(wxT(":")),
*(int*)&mTempSettings.scaleType,
&mScaleChoices);
}
S.EndTwoColumn();
}
S.EndStatic();
}
// S.EndStatic();
/*
S.StartStatic(_("Global settings"));
{
}
S.EndStatic();
*/
S.StartMultiColumn(2, wxALIGN_RIGHT);
{
S.Id(ID_APPLY).AddButton(_("Appl&y"));
}
S.EndMultiColumn();
mPopulating = false;
}
示例7: PopulateOrExchange
void SpectrumPrefs::PopulateOrExchange(ShuttleGui & S)
{
mPopulating = true;
S.SetBorder(2);
// S.StartStatic(_("Track Settings"));
// {
mDefaultsCheckbox = 0;
if (mWt) {
/* i18n-hint: use is a verb */
mDefaultsCheckbox = S.Id(ID_DEFAULTS).TieCheckBox(_("Use Preferences"), mDefaulted);
}
S.StartStatic(_("Scale"));
{
S.StartTwoColumn();
{
S.Id(ID_SCALE).TieChoice(_("S&cale") + wxString(wxT(":")),
*(int*)&mTempSettings.scaleType,
&mScaleChoices);
mMinFreq =
S.Id(ID_MINIMUM).TieNumericTextBox(_("Mi&nimum Frequency (Hz):"),
mTempSettings.minFreq,
12);
mMaxFreq =
S.Id(ID_MAXIMUM).TieNumericTextBox(_("Ma&ximum Frequency (Hz):"),
mTempSettings.maxFreq,
12);
}
S.EndTwoColumn();
}
S.EndStatic();
S.StartStatic(_("Colors"));
{
S.StartTwoColumn();
{
mGain =
S.Id(ID_GAIN).TieNumericTextBox(_("&Gain (dB):"),
mTempSettings.gain,
8);
mRange =
S.Id(ID_RANGE).TieNumericTextBox(_("&Range (dB):"),
mTempSettings.range,
8);
mFrequencyGain =
S.Id(ID_FREQUENCY_GAIN).TieNumericTextBox(_("Frequency g&ain (dB/dec):"),
mTempSettings.frequencyGain,
4);
}
S.Id(ID_GRAYSCALE).TieCheckBox(_("S&how the spectrum using grayscale colors"),
mTempSettings.isGrayscale);
S.EndTwoColumn();
}
S.EndStatic();
S.StartStatic(_("Algorithm"));
{
S.StartMultiColumn(2);
{
mAlgorithmChoice =
S.Id(ID_ALGORITHM).TieChoice(_("A&lgorithm") + wxString(wxT(":")),
*(int*)&mTempSettings.algorithm,
&mAlgorithmChoices);
S.Id(ID_WINDOW_SIZE).TieChoice(_("Window &size:"),
mTempSettings.windowSize,
&mSizeChoices);
S.SetSizeHints(mSizeChoices);
S.Id(ID_WINDOW_TYPE).TieChoice(_("Window &type:"),
mTempSettings.windowType,
&mTypeChoices);
S.SetSizeHints(mTypeChoices);
#ifdef EXPERIMENTAL_ZERO_PADDED_SPECTROGRAMS
mZeroPaddingChoiceCtrl =
S.Id(ID_PADDING_SIZE).TieChoice(_("&Zero padding factor") + wxString(wxT(":")),
mTempSettings.zeroPaddingFactor,
&mZeroPaddingChoices);
S.SetSizeHints(mZeroPaddingChoices);
#endif
}
S.EndMultiColumn();
}
S.EndStatic();
#ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH
S.Id(ID_SPECTRAL_SELECTION).TieCheckBox(_("Ena&ble Spectral Selection"),
mTempSettings.spectralSelection);
#endif
//.........這裏部分代碼省略.........
示例8: PopulateOrExchange
void QualityPrefs::PopulateOrExchange( ShuttleGui & S )
{
S.SetBorder( 2 );
S.StartStatic(_("Sampling"),0 );
{
S.StartTwoColumn();
S.AddPrompt( _("Default Sample Rate:") );
DefineSampleRateControl( S ); // A tricky control.
S.TieChoice(_("Default Sample Format:"),
wxT("/SamplingRate/DefaultProjectSampleFormat"),
floatSample, mmSampleFormatNames, mmSampleFormatLabels );
// JKC For the old style of layout, uncomment the next line.
// #define OLD_STYLE_LAYOUT
// Once we've chosen which layout to use we'll remove the
// other one. (June/2006).
#ifdef OLD_STYLE_LAYOUT
S.TieChoice(_("Real-time sample rate converter:"),
wxT("/Quality/LibresampleSampleRateConverter"),
(int)0, mConverterNames, mConverterLabels),
S.TieChoice(_("High-quality sample rate converter:"),
wxT("/Quality/LibresampleHQSampleRateConverter"),
(int)1, mConverterNames, mConverterLabels),
S.TieChoice(_("Real-time dither:"),
wxT("/Quality/DitherAlgorithm"),
Dither::none, mmDitherNames, mmDitherLabels );
S.TieChoice(_("High-quality dither:"),
wxT("/Quality/HQDitherAlgorithm"),
Dither::shaped, mmDitherNames, mmDitherLabels );
#endif
S.EndTwoColumn();
}
S.EndStatic();
// The new style of layout has
// - columns for converter and dither.
// - rows for Real-time and High-quality.
#ifndef OLD_STYLE_LAYOUT
S.StartStatic( _("Conversion") );
{
// We use blank labels here and there to end up with
// a three column layout.
S.StartMultiColumn(3);
S.AddFixedText(wxT(""));
S.AddTitle(_("Sample Rate Converter" ));
S.AddTitle(_("Dither"));
S.TieChoice(_("Real-time:"),
wxT("/Quality/LibresampleSampleRateConverter"),
(int)0, mConverterNames, mConverterLabels),
S.TieChoice(wxT(""),
wxT("/Quality/DitherAlgorithm"),
Dither::none, mmDitherNames, mmDitherLabels );
S.TieChoice(_("High-quality:"),
wxT("/Quality/LibresampleHQSampleRateConverter"),
(int)1, mConverterNames, mConverterLabels),
S.TieChoice(wxT(""),
wxT("/Quality/HQDitherAlgorithm"),
Dither::shaped, mmDitherNames, mmDitherLabels );
S.EndMultiColumn();
}
S.EndStatic();
#endif
}
示例9: PopulateOrExchange
/// This PopulateOrExchange function is a good example of mixing the fully
/// automatic style of reading/writing from GUI to prefs with the partial form.
///
/// You'll notice that some of the Tie functions have Prefs identifiers in them
/// and others don't.
void LibraryPrefs::PopulateOrExchange(ShuttleGui & S)
{
S.SetBorder(2);
S.StartStatic(_("MP3 Export Library"));
{
S.StartTwoColumn();
{
S.AddVariableText(_("MP3 Library Version:"),
true,
wxALL | wxALIGN_RIGHT | wxALIGN_CENTRE_VERTICAL);
mMP3Version = S.AddVariableText(wxT("9.99"),
true,
wxALL | wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL);
S.AddVariableText(_("MP3 Library:"),
true,
wxALL | wxALIGN_RIGHT | wxALIGN_CENTRE_VERTICAL);
wxButton *locate_button = S.Id(ID_MP3_FIND_BUTTON).AddButton(_("&Locate..."),
wxALL | wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL);
S.AddVariableText(_("LAME MP3 Library:"),
true,
wxALL | wxALIGN_RIGHT | wxALIGN_CENTRE_VERTICAL);
wxButton *download_button = S.Id(ID_MP3_DOWN_BUTTON).AddButton(_("&Download"),
wxALL | wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL);
#ifdef DISABLE_DYNAMIC_LOADING_LAME
locate_button->Enable(FALSE);
download_button->Enable(FALSE);
#else
(void)locate_button;
(void)download_button;
#endif // DISABLE_DYNAMIC_LOADING_LAME
}
S.EndTwoColumn();
}
S.EndStatic();
S.StartStatic(_("FFmpeg Import/Export Library"));
{
S.StartTwoColumn();
{
S.AddVariableText(_("FFmpeg Library Version:"),
true,
wxALL | wxALIGN_RIGHT | wxALIGN_CENTRE_VERTICAL);
#if defined(USE_FFMPEG)
mFFmpegVersion = S.AddVariableText(_("No compatible FFmpeg library was found"),
true,
wxALL | wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL);
#else
mFFmpegVersion = S.AddVariableText(wxT("FFmpeg support is not compiled in"),
true,
wxALL | wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL);
#endif
S.AddVariableText(_("FFmpeg Library:"),
true,
wxALL | wxALIGN_RIGHT | wxALIGN_CENTRE_VERTICAL);
S.Id(ID_FFMPEG_FIND_BUTTON);
wxButton *bfnd = S.AddButton(_("Loca&te..."),
wxALL | wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL);
S.AddVariableText(_("FFmpeg Library:"),
true,
wxALL | wxALIGN_RIGHT | wxALIGN_CENTRE_VERTICAL);
S.Id(ID_FFMPEG_DOWN_BUTTON);
wxButton *bdwn = S.AddButton(_("Dow&nload"),
wxALL | wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL);
#if !defined(USE_FFMPEG) || defined(DISABLE_DYNAMIC_LOADING_FFMPEG)
bdwn->Enable(FALSE);
bfnd->Enable(FALSE);
#else
// fix compilation warnings about unused variables
bfnd, bdwn;
#endif
}
S.EndTwoColumn();
#ifdef EXPERIMENTAL_OD_FFMPEG
wxCheckBox* checkbox = S.TieCheckBox(_("Allow &background on-demand loading"),
wxT("/Library/FFmpegOnDemand"),
false);
#if !defined(USE_FFMPEG)
checkbox->Enable(FALSE);
#endif
#endif
}
S.EndStatic();
}
示例10: PopulateOrExchange
void SpectrumPrefs::PopulateOrExchange(ShuttleGui & S)
{
S.SetBorder(2);
S.StartStatic(_("FFT Window"));
{
S.StartMultiColumn(2);
{
S.TieChoice(_("Window size") + wxString(wxT(":")),
wxT("/Spectrum/FFTSize"),
256,
mSizeChoices,
mSizeCodes);
S.SetSizeHints(mSizeChoices);
S.TieChoice(_("Window type") + wxString(wxT(":")),
wxT("/Spectrum/WindowType"),
3,
mTypeChoices,
mTypeCodes);
S.SetSizeHints(mTypeChoices);
}
S.EndMultiColumn();
}
S.EndStatic();
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
wxArrayString wskipn;
wxArrayInt wskipv;
for (size_t i = 0; i < 7; i++) {
wskipn.Add(wxString::Format(wxT("%d"), (1 << i) - 1));
wskipv.Add((1 << i) - 1);
}
S.StartStatic(_("FFT Skip Points"));
{
S.StartMultiColumn(2);
{
S.TieChoice(_("Skip Points") + wxString(wxT(":")),
wxT("/Spectrum/FFTSkipPoints"),
0,
wskipn,
wskipv);
S.SetSizeHints(wskipn);
}
S.EndMultiColumn();
}
S.EndStatic();
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
S.StartStatic(_("Display"));
{
S.StartTwoColumn();
{
mMinFreq =
S.TieTextBox(_("Minimum Frequency (Hz):"),
wxT("/Spectrum/MinFreq"),
0,
12);
mMaxFreq =
S.TieTextBox(_("Maximum Frequency (Hz):"),
wxT("/Spectrum/MaxFreq"),
8000,
12);
mGain =
S.TieTextBox(_("Gain (dB):"),
wxT("/Spectrum/Gain"),
20,
8);
mRange =
S.TieTextBox(_("Range (dB):"),
wxT("/Spectrum/Range"),
80,
8);
mFrequencyGain =
S.TieTextBox(_("Frequency gain: (dB/dec)"),
wxT("/Spectrum/FrequencyGain"),
0,
4);
}
S.EndTwoColumn();
S.TieCheckBox(_("Show the spectrum using &grayscale colors"),
wxT("/Spectrum/Grayscale"),
false);
#ifdef EXPERIMENTAL_FFT_Y_GRID
S.TieCheckBox(_("Show a grid along the &Y-axis"),
wxT("/Spectrum/FFTYGrid"),
false);
#endif //EXPERIMENTAL_FFT_Y_GRID
}
S.EndStatic();
#ifdef EXPERIMENTAL_FIND_NOTES
//.........這裏部分代碼省略.........
示例11: PopulateOrExchange
void SpectrumPrefs::PopulateOrExchange( ShuttleGui & S )
{
wxArrayString windowTypeList;
for(int i=0; i<NumWindowFuncs(); i++)
windowTypeList.Add(WindowFuncName(i));
S.SetBorder( 2 );
S.StartHorizontalLay(wxEXPAND, 0 );
S.StartStatic( _("FFT Size"), 0 );
{
S.StartRadioButtonGroup( wxT("/Spectrum/FFTSize"), 256 );
S.TieRadioButton( _("8 - most wideband"), 8);
S.TieRadioButton( wxT("16"), 16);
S.TieRadioButton( wxT("32"), 32);
S.TieRadioButton( wxT("64"), 64);
S.TieRadioButton( wxT("128"), 128);
S.TieRadioButton( _("256 - default"), 256);
S.TieRadioButton( wxT("512"), 512);
S.TieRadioButton( wxT("1024"), 1024);
S.TieRadioButton( wxT("2048"), 2048);
#ifdef EXPERIMENTAL_FIND_NOTES
S.TieRadioButton( wxT("4096"), 4096);
S.TieRadioButton( wxT("8192"), 8192);
S.TieRadioButton( wxT("16384"), 16384);
S.TieRadioButton( _("32768 - most narrowband"),32768);
#else
S.TieRadioButton( _("4096 - most narrowband"),4096);
#endif //LOGARITHMIC_SPECTRUM
S.EndRadioButtonGroup();
// add choice for windowtype
S.StartMultiColumn(2, wxCENTER);
{
S.TieChoice( _("Window type:"), windowType, &windowTypeList);
S.SetSizeHints(-1,-1);
}
S.EndMultiColumn();
}
S.EndStatic();
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
S.StartHorizontalLay(wxEXPAND, 0 );
S.StartStatic( _("FFT Skip Points"), 0 );
{
S.StartRadioButtonGroup(wxT("/Spectrum/FFTSkipPoints"), 0);
S.TieRadioButton(wxT("0"), 0);
S.TieRadioButton(wxT("1"), 1);
S.TieRadioButton(wxT("3"), 3);
S.TieRadioButton(wxT("7"), 7);
S.TieRadioButton(wxT("15"), 15);
S.TieRadioButton(wxT("31"), 31);
S.TieRadioButton(wxT("63"), 63);
S.EndRadioButtonGroup();
}
S.EndStatic();
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
S.StartStatic( _("Display"),1 );
{
// JC: For layout of mixtures of controls I prefer checkboxes on the right,
// with everything in two columns over what we have here.
S.TieCheckBox( _("&Grayscale"), wxT("/Spectrum/Grayscale"), false);
S.StartTwoColumn(); // 2 cols because we have a control with a separate label.
S.Id(ID_MINFREQUENCY).TieTextBox(
_("Minimum Frequency (Hz):"), // prompt
minFreqStr, // String to exchange with
12 // max number of characters (used to size the control).
);
S.Id(ID_MAXFREQUENCY).TieTextBox(
_("Maximum Frequency (Hz):"), // prompt
maxFreqStr, // String to exchange with
12 // max number of characters (used to size the control).
);
S.EndTwoColumn();
#ifdef EXPERIMENTAL_FFT_Y_GRID
S.TieCheckBox( _("&Y-Grid"), wxT("/Spectrum/FFTYGrid"), false);
#endif //EXPERIMENTAL_FFT_Y_GRID
#ifdef EXPERIMENTAL_FIND_NOTES
S.TieCheckBox( _("&Find Notes"), wxT("/Spectrum/FFTFindNotes"), false);
S.TieCheckBox( _("&Quantize Notes"), wxT("/Spectrum/FindNotesQuantize"), false);
S.StartTwoColumn(); // 2 cols because we have a control with a separate label.
S.Id(ID_FIND_NOTES_MIN_A).TieTextBox(
_("Minimum Amplitude (dB):"), // prompt
findNotesMinAStr, // String to exchange with
8 // max number of characters (used to size the control).
);
S.Id(ID_FIND_NOTES_N).TieTextBox(
_("Max. Number of Notes (1..128):"), // prompt
findNotesNStr, // String to exchange with
8 // max number of characters (used to size the control).
);
S.EndTwoColumn();
#endif //EXPERIMENTAL_FIND_NOTES
}
S.EndStatic();
S.EndHorizontalLay();
}