JUCE - 开辟新窗口

时间:2017-05-04 00:27:39

标签: c++ juce

使用JUCE中的可视化WYSISWYG编辑器制作单页应用程序,我在确定如何调用新窗口(在主GUI窗口之外)时遇到了一些麻烦。我创建了一个测试应用程序,它只有一个我用可视化编辑器创建的小型主GUI。它有一个按钮" Make New Window。"我的目标是能够单击该按钮并弹出一个新窗口,并且这个新窗口是JUCE" GUI组件," (AKA,图形/可视GUI编辑器文件)。现在,我实际上有实现了这个,但是,它抛出错误和断言,所以获得一个非常简单的分步教程会很棒。

我研究了Projucer自动创建的main.cpp文件,以便了解它们如何创建窗口。这就是我的所作所为。

1)在我的项目中,我添加了一个新的GUI组件(它成为一个类),并将其命名为&#34; InvokedWindow。&#34; 2)在我的主GUI组件类头中,我添加了一个类型为InvokedWindow的新范围指针:ScopedPointer<InvokedWindow> invokedWindow; 3)我在主GUI编辑器中创建了一个名为&#34; Make New Window&#34;并将其添加到处理程序代码中: newWindowPtr = new InvokedWindow;这样,只要按下按钮,就会创建一个InvokedWindow类型的新对象。 4)在InvokedWindow类中,在构造函数中,在自动生成的代码之上,我添加了:

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

我从JUCE应用程序的主文件中获得了哪些内容。

我还在这个新窗口中添加了一个滑块,只是为了添加功能。

5)我添加了一个重载函数让我关闭窗口:

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

所以,现在当我运行应用程序并单击make new window按钮时,会弹出一个新窗口,但我得到一个断言:

/* 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.
*/

此外,我可以关闭窗口一次并点击主GUI中的按钮来创建另一个newWindow实例,但是第二次关闭它会导致错误:

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

这有点过头了。我觉得通过一个按钮创建一个新窗口并不会太糟糕。我可以使用图形GUI编辑器编辑的新窗口,但我无法通过自己完全解决所有问题。任何人都可以按照正确的方式发布分步指南吗?我在JUCE论坛上发布了这个,但是由于我缺乏GUI编程,我无法理解发布的解决方案(我自己的错),所以我希望得到一个非常简单的指南。非常感谢。谢谢。

1 个答案:

答案 0 :(得分:3)

我明白了。我需要创建:

  1. 一个新的GUI组件(请记住,这是JUCE中的可视化编辑器)
  2. 一个类(我称之为BasicWindow,基于JUCE演示代码),它充当shell来运行这个新窗口并保存GUI组件。
  3. 一个JUCE SafePointer,只要单击该按钮,就会生成一个BasicWindow类型的新对象,并将属性设置为该窗口。
  4. 这是我的代码:

    参考第3行)在按钮的处理程序部分内创建新窗口:

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

    参考第2行).cpp文件,定义BasicWindow是什么:

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

    参考第1行)制作GUI编辑器组件,这很容易做到。您只需在JUCE文件管理器中添加一个新文件即可。 “添加新的GUI组件”,然后直观地添加所有元素和处理程序代码。

    我最大的问题是我使用的是JUCE ScopedPointer,因此在删除对象后,指向它的指针没有被设置回NULL。 SafePointer执行此操作。如果需要更多的解释,我很乐意提供帮助,因为对于没有太多GUI开发的人来说这很糟糕。“