JUCEアプリのウィンドウ生成など、基本的な部分が気になりますね。
グラフィックのチュートリアルで勉強できそうだね。
JUCEプログラミングの「Graphics」の項目、「The application window」チュートリアルをやっていきます。Projucerではテンプレートで生成されてしまい、自動で作られるところですが、ウィンドウの生成の仕組みを順番に実装して、理解していくようなチュートリアルとなっています。
公式のチュートリアルページはこちらになります。
こんな人の役に立つかも
・JUCEプログラミングを勉強している人
・JUCEの「Graphocs」チュートリアルをやっている人
・JUCEアプリのウィンドウ生成を勉強したい人
プロジェクトの準備
ウィンドウを生成するだけの簡単なデモアプリを作成します。チュートリアルでは、Projucerの「GUI」テンプレートを利用して、「Main.cpp」のファイルのみを生成する設定でプロジェクトを作成しています。
※Projucerのバージョンアップで、チュートリアルとは設定項目名が違うようです。「File Creation Option」という項目でソースファイルの生成設定を変更できるようになっています。
![](https://panda-clip.com/wp-content/uploads/2021/01/fig1-18.png)
ウィンドウを生成するだけのアプリ
ウィンドウのサブクラスを作成
作成されたアプリの枠は、まだウィンドウを表示するプログラムすらはいっていません。ウィンドウを生成するためのプログラムを追加していきます。
class MainWindowTutorial01Application : public juce::JUCEApplication
{
public:
//...略...
//[1]ウィンドウクラスをサブクラスとして作成します。
class MainWindow : public juce::DocumentWindow
{
public:
//[1-1]ウィンドウ初期化のための処理です。
MainWindow(juce::String name) : DocumentWindow(name,
juce::Colours::lightgrey,
DocumentWindow::allButtons)
{
centreWithSize(300, 200);
setVisible(true);
}
//[1-2]閉じるボタンの処理です。
void closeButtonPressed() override
{
juce::JUCEApplication::getInstance()->systemRequestedQuit();
}
private:
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(MainWindow)
};
private:
//[2]MainWindowクラスのオブジェクトのポインタをスマートポインタで作成します。
std::unique_ptr<MainWindow> mainWindow;
};
[1]では、メインウィンドウとなるサブクラスを定義します。「Juce::DocumentWindow」クラスを継承しているクラスになります。ウィンドウにタイトル、最大化、最小化、閉じるボタンの機能をそなえたウィンドウを生成できるクラスです。
[1-1]では、コンストラクタとしてJUCE::String型でアプリケーション名を受け取ります。メンバイニシャライザで、コンストラクタで受け取ったアプリ名でDocumentWindowクラスのコンストラクタを呼び出します。ここで、ウィンドウ背景色をlightGrayにします。3つ目の引数としては、最小化、最大化、閉じるのボタンすべてを表示するような設定「AllButtons」を与えています。
[1-2]では、ウィンドウの閉じるボタンを押したときの処理になります。OSにアプリの終了を伝えるような処理を行っています。
そして、[2]で、作成したサブクラス「MainWindow」を利用して、「mainWindow」というオブジェクトを定義します。
アプリの初期化と終了
定義したウィンドウのサブクラスでアプリの起動時にウィンドウを生成します。
initialise関数に以下のようにスマートポインタのreset関数を使用してnewでMainWindowオブジェクトを生成します。unique_ptrのresetは、リソースの所有権を放棄して、確保するという働きの関数です。
void initialise (const juce::String& commandLine) override
{
//unique_ptrのresetで新たなリソースをnewします。
mainWindow.reset(new MainWindow(getApplicationName()));
}
スマートポインタのunique_ptrについては、以前も参考にした以下の記事を参考にさせていただきました。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9QyUyQiUyQjExJUUzJTgyJUI5JUUzJTgzJTlFJUUzJTgzJUJDJUUzJTgzJTg4JUUzJTgzJTlEJUUzJTgyJUE0JUUzJTgzJUIzJUUzJTgyJUJGJUU1JTg1JUE1JUU5JTk2JTgwJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmcz01ZTYwZWQ5NDQ2MzlmMmY2NTEzZGQ3NDljYWU0Yzg2MA&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBobWl0byZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9MmUzNTIyMDcyYzI3OTczMmE5NzMwZGU0MzliOGQwMTc&blend-x=142&blend-y=486&blend-mode=normal&s=925f45f34e7409316b2d4ef16ee61688)
終了時の処理として、shutdown関数で、mainwindowに「nullptr」をいれておきます。
void shutdown() override
{
//mainWindowをnullptrとします。
mainWindow = nullptr;
}
スマートポインタのmainWindowを明示的にアプリ終了時に開放するようにしているようです。調べたところ、reset()と引数をとらないresetで破棄できるようですが、ここではnullptrを代入しています。
C++的に小難しいところはありますが、windowの生成と破棄の流れをつかむことができます。
続きの記事はこちらになります。
![](https://panda-clip.com/wp-content/uploads/2021/01/JUCE110-300x200.jpg)