2017-05-04 13 views
5

JUCE의 시각적 WYSISWYG 편집기를 사용하여 단일 페이지 응용 프로그램을 만드는 것으로부터, 새 창 (기본 GUI 창 외부)을 호출하는 방법을 알아 내려는 데 약간의 문제가 있습니다. 비주얼 에디터로 만든 최소의 메인 GUI 만있는 테스트 애플리케이션을 만들었습니다. "Make New Window"버튼이 있습니다. 내 목표는 해당 버튼을 클릭하고 새 창을 팝업으로 표시하고이 새 창은 JUCE "GUI 구성 요소"(일명 GUI/GUI GUI 편집기 파일)입니다. 자, 실제로 일종의이이 오류와 어설 션을 달성 했으므로 매우 간단한 단계별 자습서를 얻는 것이 좋습니다.JUCE - 새 창 만들기

나는 창을 만드는 방법에 대한 느낌을 얻기 위해 Projucer가 자동으로 만든 main.cpp 파일을 연구했습니다. 여기 내가 한 일이있다.

1) 내 프로젝트에서 새 GUI 구성 요소 (클래스가 됨)를 추가하고이를 "InvokedWindow"라고했습니다. 2) 내 주요 GUI 구성 요소 클래스 헤더에 InvokedWindow 유형의 새 범위 포인터를 추가했습니다. ScopedPointer<InvokedWindow> invokedWindow; 3) 메인 GUI 편집기에서 "Make New Window"라는 새 버튼을 만들고 핸들러 코드에이 코드를 추가했습니다 : newWindowPtr = new InvokedWindow; 버튼이 눌려지면 InvokedWindow 유형의 새 객체가 만들어집니다. InvokedWindow 클래스에서 4), 생성자에서 자동으로 생성 된 코드의 상단에, 내가 추가 : 나는 종류의 JUCE 응용 프로그램의 기본 파일에서 가져온

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

.

또한 기능을 추가하기 위해이 새 창에 슬라이더를 추가했습니다.

5) 나는 나 창 닫을 수 있도록 오버로드 기능 추가 : 새 창이 팝업 않습니다 내가 응용 프로그램을 실행할 때 지금, 그래서

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

을하고 만드는 새 창 버튼을 클릭,하지만 난 주장 얻을 : 또한

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

를, 내가 한 번 창을 닫고 newWindow의 다른 인스턴스를 만들 메인 GUI에서 버튼을 칠 수 있어요,하지만 그것을 두 번째 시간을 종료하면 오류에 이르게 :

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 프로그래밍이 부족하여 게시 된 솔루션 (내 자신의 잘못)을 이해할 수 없어 매우 간단한 안내서를 얻길 바랍니다. 대단히 감사하겠습니다. 고맙습니다.

+0

나는이 게시물이 길이만큼 downvoted라고 가정하고 있지만, 내 상황과 질문을 정확하게 묘사하는 데는 오랜 시간이 필요하다고 느낍니다. 너무 적은 정보를 제공하는 것보다 더 나쁜 것은 없습니다. 문제가 오해되거나 중요한 정보가 부족하기 때문에 문제에 적용되지 않는 솔루션을 얻는 것입니다. –

+1

귀하의 질문에 아무 문제가 없으므로, +1을 원하는대로 설명해 주셨습니다. 가이드를 찾고 계시다면 어떨까요 : https://www.juce.com/doc/tutorial_main_window 개인적으로 전에 이것을 해본 적이 없지만 그것을하는 방법에 대해 매우 궁금합니다. –

+1

@KingReload, 안심 감사드립니다. 나는 종종 내 게시물 길이에 투표를 내려. 또한, 나는 그 튜토리얼을 겪어 왔지만 꽤 괜찮습니다. 그러나 모든 것을 손으로 코딩해야하는 창만 추가 할 수 있다고 믿습니다. (새로운 창에 슬라이더를 추가하려면, 노브, 레이블, 텍스트 편집기 등 ... 당신은 JUCE의 그래픽 편집기를 통해 그것을 삽입 할 수 없으며, 배치, 매개 변수 등을 직접 코드화해야합니다. 새 창을 여는 방법을 알고 싶지만 그 창은 그래픽 JUCE 편집기를 통해 편집 할 수 있습니다. –

답변

1

나는 그것을 알아 냈다. 내가 만드는 데 필요한 :

  1. 새로운 GUI 구성 요소에 대한 쉘 역할을
  2. 클래스 (필자는 JUCE 데모 코드를 기반으로, BasicWindow라고 불렀다) (기억을,이 JUCE에서 시각적 편집기입니다) 이 새 창을 실행하고 GUI 구성 요소를 보유합니다.
  3. JUCE SafePointer는 버튼을 클릭 할 때마다 BasicWindow 유형의 새 객체를 만들고 해당 속성을 해당 창에 설정합니다.새로운 창을 만들 수있는 버튼의 핸들러 섹션 내부의 선 3)을 참조

    : 여기

내 코드)를 .cpp 파일을 2 줄 수

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

참조를 그 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 파일 관리자에 새 파일을 추가하기 만하면됩니다. "Add New GUI Component"를 클릭하고 모든 요소와 핸들러 코드를 시각적으로 추가합니다.

내 가장 큰 문제는 JUCE ScopedPointer를 사용했기 때문에 개체를 삭제 한 후 가리키는 포인터가 NULL로 다시 설정되지 않았기 때문입니다. SafePointer가이를 수행합니다. 더 많은 설명이 필요하다면, GUI가 많이 개발되지 않은 사람이 "자신의 띠 아래에서"끔찍한 일 이었기 때문에 기꺼이 도와 드리겠습니다.