DocumentWindow主窗口类详解

DocumentWindow是GUI程序的窗口框架(主窗口),可具有标题栏、最大化、最小化、关闭按钮。该类继承自ToplevelWindow的派生类ResizableWindow(可调整大小的顶级窗口)。

须知:ResizableWindow及其派生类DocumentWindow添加和显示内容组件时,使用setContentOwned()或setContentNonOwned()函数,而不是addAndMakeVisible()函数。并且,不要将按钮、标签、选项卡、Viewport等控件直接添加到ResizableWindow及其派生类DocumentWindow中。正确的做法是:自定义内容组件类,添加各类控件和UI元素,而后本类使用setContentOwned()添加该内容组件。

使用DocumentWindow时,需自定义该类的派生类,即自定义本程序的窗口框架。所定义的窗口框架类对象,由程序主体类(JUCEApplication)所创建并管理。一个典型的窗口框架类如下所示(为方便理解,未做头源分离,全部集中在cpp源文件中):

class MainFrame : public DocumentWindow 
{	
public:
    // 1参名称,显示在标题栏中,2参背景色,3参所需的按钮
    MainFrame() : DocumentWindow (L"播放器", Colours:: grey, 
                                  DocumentWindow::allButtons) 
    {
        centreWithSize (1020, 660); // 桌面居中,正常状态时的大小
        setFullScreen (true);	    // 启动后最大化显示        
        setVisible (true);  	    // 是否显示(可视)

        // 是否可调大小,是否显示右下角的调整标记
        setResizable (true, false); 

        // 可调整的极限尺寸
        setResizeLimits (640, 480, 8192, 8192);
 
        setUsingNativeTitleBar (true);   // 标题栏样式

        // 设置标题栏按钮,是否位于左侧。设置为本地标题栏后,标题栏按钮的位置无效
        setTitleBarButtonsRequired (DocumentWindow::allButtons, true);   
        setTitleBarHeight (21);	// 设置标题栏高度

        // 创建、添加并显示基础组件. 不要使用addAndMakeVisible()!
        BaseComp* baseComp = new BaseComp (*this);
        setContentOwned (baseComp, false);

        // 本类的数据成员命令管理器对象注册程序命令目标
        commandManager->registerAllCommandsForTarget (baseComp);
        commandManager->registerAllCommandsForTarget (
                                 JUCEApplication::getInstance());

        // 本类的按键信息由所绑定的对象进行处理
        addKeyListener (commandManager.getKeyMappings());

        // 设置菜单栏(本例基础组件即菜单栏,同时它还是程序命令目标)
        setMenuBar (baseComp);

        // 菜单栏组件关注程序命令管理器中的命令信息
        baseComp->setApplicationCommandManagerToWatch (&commandManager); 
} 
//======================================================
~MainFrame()	 // 析构函数
{	
    setMenuBar (nullptr);       // 清空菜单栏

    // OSX系统下清理主菜单要使用特别的命令,
    // 此处用了类库预定义的平台宏
#if JUCE_MAC
        MenuBarModel::setMacMainMenu (nullptr);
#endif
        clearContentComponent();   // 清除内容组件
}
//===================================================
// 点击标题栏关闭按钮后自动调用此函数
void closeButtonPressed()
{
    JUCEApplication::getInstance()->systemRequestedQuit();
}
//===================================================
private:
    // 程序中只需声明一个提示窗栈对象,即可显示所有控件的实时提示
    TooltipWindow  toolTips;

    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainAppWindow)
};

如果程序运行时图标不需要出现在任务栏中,则重写getDesktopWindowStyleFlags()并返回0:

class PopupWindow : public DocumentWindow 
{
public:
   /* 返回0,任务栏中不出现。如果此时主窗口设置为使用本地标题栏,则此窗口将没有标题栏。返回1,任务栏中出现,如果此时主窗口设置为使用本地标题栏,则此窗口将没有标题栏。 */
   int getDesktopWindowStyleFlags() const   { return 0; }
};

DocumentWindow无需也不要重写Component类的resized(),moved()等函数。另外,自定义窗口框架类时,可重写ResizableWindow和ToplevelWindow的protected成员。

DocumentWindow类的重要成员函数(略)