2016-10-19 9 views
0

Я изучаю wxWidgets на прошлой неделе, как с помощью IDE, так и с написанием кода на C++. Я начинаю отчаиваться, когда-либо получаю то, что выглядит хорошо, поскольку способность позиционировать позиции кажется очень ограниченной.Возможно ли это с помощью wxWidgets?

Я портирую крупно-иш-проект от C++ Builder до VStudio по соображениям затрат. У меня появилось довольно много диалогов для воссоздания. Обычно они содержат различные комбинации «блоков» ввода - из-за отсутствия лучшего слова. Я выбрал wxWidgets для моего графического интерфейса, потому что я думал, что смогу создать диалоги в коде из функций, которые создают строку формы. Например, в диалоговом окне, показанном ниже, у меня могут быть функции CreateLabelEdit, CreateLabelCombo, CreateBoldLabel и т. Д. На самом деле у меня есть некоторый успех в этой части, но у меня нет проблем с дизайном диалога.

enter image description here

Вот некоторые из проектных критериев из этой конкретной формы:

  1. Все входы оставлены выровнены и разной ширины, соответствующих их содержанию.

  2. Вводные метки выравниваются вправо.

  3. Точка выравнивания (т.е.. Ширина столбца, содержащий входные метки одинакова во всех диалогах, и ширина различных входов, а также. Конечно, есть исключения!

  4. Другого типы меток выравниваются в другом месте. BoldLabels в этом случае.

в основном я хочу, чтобы контролировать размер, расположение и выравнивание моих объектов. ли это случай иметь неправильное мышление для инструмента Я выбрал? Или такие вещи могут быть с помощью этого инструмента?


ЧАСТИЧНОЕ РЕШЕНИЕ Я попытался использовать абсолютные позиции, смешанные с дробилок и что не работает.

Затем я попытался использовать flexgrid sizer, чтобы сделать часть примера. Если я могу сделать один из блоков, я могу сшить несколько блоков. Это все хорошо, за исключением того, когда я установить ширину первого столбца с использованием SetItemMinSize, как это было предложено @VZ, что элемент теряет это sizerflag настройки:

form4::form4() :wxDialog(nullptr, wxID_ANY, "title") 
{ 
    wxSizerFlags flagT1(1); 
    flagT1.Align(wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT).Border(wxTOP | wxLEFT, 10); 
    wxSizerFlags flagT2(1); 
    flagT2.Align(wxALIGN_CENTER_VERTICAL).Border(wxTOP | wxLEFT, 10); 
    wxSizerFlags flagT3(1); 
    flagT3.Align(wxALIGN_CENTER_VERTICAL).Border(wxTOP | wxLEFT| wxRIGHT, 10); 

    wxBoxSizer* bSize = new wxBoxSizer(wxVERTICAL); 
    wxStaticText* _Text = new wxStaticText(this, wxID_ANY, "this should be bold"); 
    wxFont _Font = _Text->GetFont(); 
    _Font.MakeBold(); 
    _Font.SetPixelSize(_Font.GetPixelSize()*1.1); 
    _Text->SetFont(_Font); 
    bSize->Add(_Text, wxSizerFlags().Border(wxTOP, 10).Center()); 
    bSize->Add(new wxStaticText(this, wxID_ANY, "this should be bold"), 

    wxSizerFlags().Border(wxTOP, 10).Center()); 
    wxFlexGridSizer* bSizer = new wxFlexGridSizer(3,0,0); 
    _Text = new wxStaticText(this, wxID_ANY, "bob"); 
    // bSizer->SetItemMinSize(_Text, wxSize(150, -1)); //this has no effect here 
    bSizer->Add(_Text, flagT1); 
    bSizer->SetItemMinSize(_Text, wxSize(150, -1));// loses styling of flagT1 
    bSizer->Add(new wxTextCtrl(this, wxID_ANY, "default_value", wxDefaultPosition, wxSize(150, -1)), flagT2); 
    bSizer->Add(new wxStaticText(this, wxID_ANY, "cm", wxPoint(200, 20)), flagT3); 

    bSizer->Add(new wxStaticText(this, wxID_ANY, " longer"), flagT1); 
    bSizer->Add(new wxTextCtrl(this, wxID_ANY, "default_value2", wxPoint(-1, -1), wxSize(150, -1)), flagT2); 
    bSizer->Add(new wxStaticText(this, wxID_ANY, "cm", wxPoint(200, 20)), flagT3); 

    bSizer->Add(new wxStaticText(this, wxID_ANY, "bob"), flagT1); 
    bSizer->Add(new wxTextCtrl(this, wxID_ANY, "default_value3", wxPoint(-1, -1), wxSize(150, -1)), flagT2); 
    bSizer->Add(new wxStaticText(this, wxID_ANY, "cm", wxPoint(200, 20)), flagT3); 

    bSize->Add(bSizer); 

    bSize->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL), wxSizerFlags(0).Border(wxALL, 10)); 
    this->SetSizerAndFit(bSize); 
    // this->Layout(); 
    this->Centre(wxBOTH); 
} 

производит это:

enter image description here

+2

Выполняете ли вы абсолютное позиционирование или используете разделитель для макета? – smcd

+0

Попробуйте wxFormBuilder – macroland

+0

@smcd. Я пытаюсь использовать sizers, как это рекомендует вся документация, но теперь я думаю, что предоставление размеров для x-компонентов и разрешение sizer обрабатывать y-компонент может быть решением. – marcp

ответ

1

Данный диалог не особенно просто создавать в wxWidgets, потому что это невозможно сделать с помощью простого wxFlexGridSizer. У вас есть несколько вариантов:

  1. Если вы хотите немного скомпрометировать, полностью перемещайте жирные надписи в левую колонку. Затем он становится простым двумя столбцами wxFlexGridSizer, и его создание должно быть очень простым либо в коде, либо в редакторе диалога.
  2. Если вы хотите сохранить именно этот макет, но все же хотите использовать wxFlexGridSizer, вам необходимо иметь несколько из них и вручную выровнять их первые столбцы.Для этого нужно найти ширину самой длинной метки (используйте GetTextExtent()) и установите минимальный размер элемента (SetItemMinSize()) для всех sizers.
  3. Если вы не хотите беспокоиться о вычислении ширины, но все же хотите иметь этот точный макет, вы также можете использовать wxGridBagSizer. Лично я не рекомендую использовать его, потому что он беспорядочен (вам нужно вручную отслеживать столбцы/строки), но он позволяет делать именно то, что вы хотите.
+0

Можете ли вы привести пример использования SetItemMinSize? Я изменил свой вопрос, пытаясь использовать его, но у него есть побочные эффекты. – marcp

+0

Если ваш ярлык занимает больше места, чем нужно, вам нужно выровнять его текст внутри него, чтобы он был эффективно выровнен по своему усмотрению, т. Е. Использовать 'wxALIGN_RIGHT' как стиль' wxStaticText'. –

+0

это именно то, что я сделал в примере кода flagT1 имеет '' 'wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT'''. Если я применяю setminsize к элементу управления statictext перед добавлением в sizer, то sizerflag переопределяет его, и я не получаю minsize, но если я добавлю его в sizer с флагом, а затем примените minsize, я получу размер без стилизации , – marcp

 Смежные вопросы

  • Нет связанных вопросов^_^