上一篇漏掉了一個主類別的函數:
void anotherInstanceStarted (const String& commandLine) override
{
}
以 Windows 系統為例,執行檔 .exe 被重覆執行時,會有多個 Process 產生。而 anotherInstanceStarted
這支 Callback 函數當「條件」滿足時,會被呼叫。
預設情況下,JUCE 程式可以同時運行。不過,有時候會限制同時間只有一支程式執行。要達到這個目的,只要修改主類別中的 moreThanOneInstanceAllowed()
函數回傳值,由 true
改成 false
:
class SamGUIApplicationApplication : public juce::JUCEApplication
{
public:
SamGUIApplicationApplication() {}
bool moreThanOneInstanceAllowed() override { return false; }
};
上述改動編譯後,同支程式被執行第二次時,anotherInstanceStarted()
會被呼叫,而 commandLine
參數是第二次執行時指示的參數。例如:
demo.exe
demo.exe 2ndArg
anotherInstanceStarted()
會被呼叫,而 commandLine
的值為「2ndArg」。
不少應用程式只允許一個 Process 存在,JUCE 只要改動一個地方即可達到目的。輕鬆愜意。
前述幾個函數是 JUCE GUI Application 的核心,接下來是視窗應用程式中,負責「視窗」顯示的核心。
SamGUIApplicationApplication
class 內含了一個 MainWindow
class,繼承自 juce::DocumentWindow
。MainWindow
負責下圖中,紅框以外的區域:
上圖中的系統按鈕(關閉、縮小、最大化),以及視窗大小是否可變,預設視窗大小,是否以全螢幕的方式呈現,是否要隱藏等邏輯,通通由 MainWindow
負責。其預設建構式如下:
MainWindow (String name)
: DocumentWindow (name,
Desktop::getInstance().getDefaultLookAndFeel()
.findColour (ResizableWindow::backgroundColourId),
DocumentWindow::allButtons)
{
setUsingNativeTitleBar (true);
setContentOwned (new MainComponent(), true);
#if JUCE_IOS || JUCE_ANDROID
setFullScreen (true);
#else
setResizable (true, true);
centreWithSize (getWidth(), getHeight());
#endif
setVisible (true);
}
底下列出幾個重點說明。JUCE 的視窗風格有兩種,一種是符合系統原生外觀樣式(如上圖);另一種是 JUCE 自有風格,如下:
只要將 MainWindow
建構式中的 setUsingNativeTitleBar
參數改成 false
,表示不使用原生(Native)的視窗風格。