2016-10-19 4 views
0

Ich habe wxWidgets für die letzte Woche gelernt, sowohl mit IDEs und Schreiben von C++ - Code. Ich fange an zu verzweifeln, jemals etwas zu bekommen, das gut aussieht, da die Fähigkeit, Gegenstände zu positionieren, sehr begrenzt erscheint.Ist das mit wxWidgets möglich?

Ich portiere ein groß-ish Projekt von C++ Builder zu VStudio, aus Kostengründen. Ich habe einige Dialoge, die ich neu erstellen kann. Sie enthalten im Allgemeinen unterschiedliche Kombinationen von "Blöcken" von Eingaben - mangels eines besseren Wortes. Ich wählte wxWidgets für meine GUI, weil ich dachte, ich könnte die Dialoge im Code von Funktionen aufbauen, die eine Reihe des Formulars erzeugen. Zum Beispiel könnte ich in dem unten gezeigten Dialog die Funktionen CreateLabelEdit, CreateLabelCombo, CreateBoldLabel, etc. haben. Ich habe tatsächlich einen Erfolg in diesem Teil, schade aber nicht, den Dialog zu gestalten.

enter image description here

Hier sind einige der Design-Kriterien von dieser besonderen Form:

  1. Alle Eingänge ausgerichtet sind links und unterschiedliche Breiten entsprechend ihrer Inhalte.

  2. Die Eingabeetiketten sind alle richtig ausgerichtet.

  3. Der Ausrichtungspunkt (dh. Die Breite des Spalts, die die Eingänge Etiketten enthält, ist das gleiche für alle Dialoge, und die Breiten der verschiedenen Eingänge als auch. Natürlich gibt es Ausnahmen!

  4. Andere Arten von Etiketten werden an einem anderen Ort. BoldLabels in diesem Fall ausgerichtet.

Grundsätzlich möchte ich die Größe, Lage und Ausrichtung meiner Objekte steuern. Ist dies ein Fall für die falsche Einstellung für das Werkzeug mit Ich habe gewählt? Oder können diese Arten von Dingen sein mit diesem Tool durchgeführt?


Teillösung Ich habe versucht, mit Sizer gemischt absoluten Positionen verwenden und dass überhaupt nicht funktioniert.

Dann habe ich versucht, einen Flexgrid-Sizer zu verwenden, um einen Teil des Beispiels zu tun, Wenn ich einen der Blöcke dann kann ich mehrere Blöcke zusammenfügen. Es ist alles gut, außer wenn ich die Breite des ersten Spalts SetItemMinSize gesetzt, wie @VZ vorgeschlagen, dass Artikel verlieren es sizerflag Einstellungen:

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

erzeugt dies:

enter image description here

+2

Machen Sie absolute Positionierung oder verwenden Sie einen Sizer für das Layout? – smcd

+0

Versuchen Sie wxFormBuilder – macroland

+0

@smcd, ich habe versucht, Sizers zu verwenden, wie die gesamte Dokumentation empfiehlt, aber jetzt denke ich, dass die Bereitstellung von Größen für die x-Komponenten und lassen Sizer die y-Komponente behandeln, die Lösung sein kann. – marcp

Antwort

1

Dieser besondere Dialog ist nicht besonders einfach in WxWidgets zu erstellen, weil es nicht mit einem einfachen wxFlexGridSizer getan werden kann. Sie haben mehrere Möglichkeiten:

  1. Wenn Sie bereit sind, leicht Kompromisse einzugehen, verschieben Sie die fett gedruckten Beschriftungen vollständig in die linke Spalte. Dann wird es eine einfache zweispaltige wxFlexGridSizer und das Erstellen sollte es entweder im Code oder einem Dialogeditor sehr einfach sein.
  2. Wenn Sie genau dieses Layout behalten möchten, aber trotzdem wxFlexGridSizer verwenden möchten, müssen Sie mehrere davon haben und ihre ersten Spalten manuell ausrichten.Der Weg ist, die Breite des längsten Etiketts zu finden (verwenden Sie GetTextExtent()) und legen Sie die minimale Artikelgröße (SetItemMinSize()) für alle Sizers fest.
  3. Wenn Sie sich nicht mit der Breitenberechnung beschäftigen möchten, aber dennoch genau dieses Layout haben möchten, können Sie auch wxGridBagSizer verwenden. Persönlich empfehle ich nicht, es zu verwenden, weil es unordentlicher ist (Sie müssen Spalten/Reihen manuell verfolgen), aber es erlaubt, genau zu tun, was Sie wünschen.
+0

könnten Sie ein Beispiel für die Verwendung von SetItemMinSize geben? Ich habe meine Frage mit einem Versuch geändert, es zu verwenden, aber es hat Nebenwirkungen. – marcp

+0

Wenn Ihr Etikett mehr Platz braucht, als es benötigt, müssen Sie seinen Text darin ausrichten, damit er effektiv ausgerichtet wird, wie Sie wollen, dh verwenden 'wxALIGN_RIGHT' als Stil von' wxStaticText'. –

+0

das ist genau das, was ich in dem Codebeispiel gemacht habe flagT1 hat '' 'wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT'''. Wenn ich setminsize auf das statictext-Steuerelement vor dem Hinzufügen zum Sizer anwende, dann überschreibt das Sizerflag es und ich bekomme nicht die minsize, aber wenn ich es mit dem Flag zum Sizer hinzufüge und dann minsize anwende, bekomme ich die Größe ohne Styling . – marcp