2017-05-04 9 views
5

Da ich mit JSCE in WYSISWYG-Editor einzelne Seiten mit dem visuellen WYSISWYG-Editor erstellen möchte, habe ich Probleme, herauszufinden, wie man neue Fenster (außerhalb des Hauptfensters) aufruft. Ich habe eine Testanwendung erstellt, die nur eine kleine minimale Haupt-GUI hat, die ich mit dem visuellen Editor erstellt habe. Es hat eine Schaltfläche "Make New Window." Mein Ziel ist es, auf diese Schaltfläche klicken zu können und ein neues Fenster zu öffnen. Dieses neue Fenster ist eine JUCE- "GUI-Komponente" (AKA, die grafische/visuelle GUI-Editor-Datei). Nun, ich habe tatsächlich Art von erreicht dies jedoch seine Wurffehler und Behauptungen, so wäre es toll, ein sehr einfaches, Schritt-für-Schritt-Tutorial zu bekommen.JUCE - Erstellen eines neuen Fensters

Ich studierte die main.cpp-Datei, die der Projecer automatisch erstellte, um ein Gefühl dafür zu bekommen, wie sie ein Fenster erstellen. Hier ist was ich getan habe.

1) In meinem Projekt habe ich eine neue GUI-Komponente (die eine Klasse wird) hinzugefügt und nannte es "InvokedWindow". 2) In meinem Haupt-GUI-Komponenten-Header habe ich einen neuen Bereichszeiger vom Typ InvokedWindow hinzugefügt: ScopedPointer<InvokedWindow> invokedWindow; 3) Ich erstellte eine neue Schaltfläche im Haupt-GUI-Editor namens "Make New Window" und fügte diese dem Handler-Code hinzu: newWindowPtr = new InvokedWindow;, so dass jedes Mal, wenn die Schaltfläche gedrückt wird, ein neues Objekt vom Typ InvokedWindow erstellt wird. 4) In der InvokedWindow Klasse im Konstruktor auf dem Code automatisch generiert, fügte ich hinzu:

setUsingNativeTitleBar (true); 
setCentrePosition(400, 400); 
setVisible (true); 
setResizable(false, false); 

Welche Art von ich von der Hauptdatei der JUCE Anwendung kam.

Ich habe auch einen Schieberegler zu diesem neuen Fenster hinzugefügt, nur um Funktionalität hinzuzufügen.

5) Ich habe eine überladene Funktion mir das Fenster schließen lassen:

void InvokedWindow::closeButtonPressed() 
{ 
    delete this; 
} 

So, jetzt, wenn ich die app ausführen und klicken Sie auf die neue Fenster Taste, ein neues Fenster wird Pop, aber ich erhalten eine Behauptung:

/* Agh! You shouldn't add components directly to a ResizableWindow - this class 
    manages its child components automatically, and if you add your own it'll cause 
    trouble. Instead, use setContentComponent() to give it a component which 
    will be automatically resized and kept in the right place - then you can add 
    subcomponents to the content comp. See the notes for the ResizableWindow class 
    for more info. 

    If you really know what you're doing and want to avoid this assertion, just call 
    Component::addAndMakeVisible directly. 
*/ 

auch ich bin in der Lage, die Fenster einmal und drücken sie die Taste in der Haupt GUI zu schließen andere Instanz eines newWindow zu schaffen, aber es ein zweites Mal führt zu einem Fehler endet:

template <typename ObjectType> 
struct ContainerDeletePolicy 
{ 
    static void destroy (ObjectType* object) 
    { 
     // If the line below triggers a compiler error, it means that you are using 
     // an incomplete type for ObjectType (for example, a type that is declared 
     // but not defined). This is a problem because then the following delete is 
     // undefined behaviour. The purpose of the sizeof is to capture this situation. 
     // If this was caused by a ScopedPointer to a forward-declared type, move the 
     // implementation of all methods trying to use the ScopedPointer (e.g. the destructor 
     // of the class owning it) into cpp files where they can see to the definition 
     // of ObjectType. This should fix the error. 
     ignoreUnused (sizeof (ObjectType)); 

     delete object; 
    } 
}; 

Das ist alles ein bisschen über meinen Kopf. Ich stellte mir vor, dass es nicht schade wäre, mit einem Knopf ein neues Fenster zu erstellen. Ein neues Fenster, das ich mit dem grafischen GUI-Editor bearbeiten konnte, aber ich bin nicht in der Lage, es komplett selbst herauszufinden, ich habe es versucht. Könnte jemand eine Schritt-für-Schritt-Anleitung veröffentlichen, um dies richtig zu machen? Ich habe dies in den JUCE-Foren gepostet, aber aufgrund meines Mangels an GUI-Programmierung war ich nicht in der Lage, die veröffentlichten Lösungen zu verstehen (meine eigene Schuld), also hoffe ich, einen sehr einfachen Leitfaden dazu zu bekommen. Es würde sehr geschätzt werden. Vielen Dank.

+0

Ich gehe davon aus, dass dieser Post für die Dauer von es wird, aber ich fühle es so lange benötigt, um meine Situation und Frage genau zu beschreiben. Nichts Schlimmeres, als zu wenig Informationen zu liefern und dann Lösungen zu finden, die nicht auf Ihr Problem zutreffen, weil Ihr Problem falsch interpretiert wurde oder wichtige Informationen fehlen. –

+1

es ist nichts falsch mit Ihrer Frage, Sie haben einen tollen Job zu erklären, was Sie wollen +1 plus, wenn Sie nach einem Leitfaden suchen, vielleicht könnten Sie dies versuchen: https://www.juce.com/doc/tutorial_main_window Ich persönlich habe ich das vorher noch nicht gemacht, bin aber sehr gespannt wie es geht. –

+1

@KingReload, danke für die Zusicherung. Ich werde oft für meine Postlängen abgestimmt. Außerdem habe ich dieses Tutorial durchgearbeitet und es ist ziemlich gut, aber ich glaube, dass es nur erlaubt, dass Sie ein Fenster hinzufügen, dass Sie alles manuell programmieren müssen (das heißt, wenn Sie dem neuen Fenster einen Schieberegler hinzufügen möchten, Knopf, Label, Texteditor, etc ... Sie können ihn nicht über den grafischen Editor in JUCE einfügen, Sie müssen seine Platzierung, Parameter usw. manuell codieren. Ich würde gerne wissen, wie man ein neues Fenster öffnet, aber dieses Fenster kann durch den grafischen JUCE-Editor bearbeitet werden. –

Antwort

1

Ich fand es heraus. Ich brauchte zu erstellen:

  1. Eine neue GUI-Komponente (Denken Sie daran, dies ist der visuelle Editor in JUCE)
  2. A-Klasse (ich nannte es BasicWindow, basierend auf dem JUCE Demo-Code), die als eine Schale wirkt auf führe dieses neue Fenster aus und halte die GUI-Komponente.
  3. Ein JUCE SafePointer, der beim Klicken auf die Schaltfläche ein neues Objekt vom Typ BasicWindow erstellt und die Attribute für dieses Fenster festlegt.

Hier ist mein Code:

auf Linie 3) im Handler Teil der Taste Mit Bezug das neue Fenster zu erstellen:

basicWindow = new BasicWindow("Information", Colours::grey, DocumentWindow::allButtons); 

basicWindow->setUsingNativeTitleBar(true); 
basicWindow->setContentOwned(new InformationComponent(), true);// InformationComponent is my GUI editor component (the visual editor of JUCE) 

basicWindow->centreWithSize(basicWindow->getWidth(), basicWindow->getHeight()); 
basicWindow->setVisible(true); 

Mit Bezug auf der Linie 2) eine CPP-Datei, definiert, was der BasicWindow ist:

#include "../JuceLibraryCode/JuceHeader.h" 

class BasicWindow : public DocumentWindow 
{ 
private: 
    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BasicWindow) 

public: 
    BasicWindow (const String& name, Colour backgroundColour, int buttonsNeeded) 
    : DocumentWindow (name, backgroundColour, buttonsNeeded) 
    { 
    } 

    void closeButtonPressed() override 
    { 
     delete this; 
    } 
}; 

und unter Bezugnahme auf Linie 1), um die GUI-Editor-Komponente Stellen, die diese einfach zu tun sind. Sie fügen einfach eine neue Datei in den JUCE-Dateimanager ein. "Neue GUI-Komponente hinzufügen" und fügen Sie dann alle Ihre Elemente und den Handler-Code visuell hinzu.

Mein größtes Problem war, dass ich einen JUCE ScopedPointer verwendete. Nach dem Löschen des Objekts wurde der darauf zeigende Zeiger nicht auf NULL zurückgesetzt. Der SafePointer macht das. Wenn noch weitere Erklärungen benötigt werden, bin ich gerne bereit zu helfen, da dies für jemanden, der nicht viel GUI-Entwicklung hat, schrecklich war.

Verwandte Themen