• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

juce:跨平台的C++用户界面库

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

如果你用过QT和MFC,那你必然知道QT是基于C++的跨平台库,而MFC是微软针对widows平台推出来基础类库。且不论MFC的设计如何,从我个人和身边朋友的经历来看,MFC是一些非常难以理解的类的组合,其设计模式和各式各样不知所谓的宏都让人十分费解。相比之下,QT在这方面要好很多。哈哈,你以为我会介绍QT吧?错了,QT大家都都很熟悉了。在这里给大家推荐的是 juce,一个跨平台的C++用户界面库。

Juce的主页是:http://www.juce.com

据说当初主要是在音频处理领域用得比较多,因此包含了比较多的音频相关代码。后来推广到各个领域,如图形图像,GUI等。


个人感觉,Juce的设计思想与android的基础类库思想比较接近。因此,如果你会android编程,那juce用起来就会似曾相识,比如两者都采用多继承等。相比之一,juce的代码看起来更为简洁。同时juce创建的用户界面也比较简洁美观。下面给出一个例子说明。


程序启动后的样子:



外观样式默认是mac风格的。在这里添加几行代码,实现一个简单的交互,在按下按钮后提示按钮已按下:




整个程序的代码如下:

Maincomponet.h:

 

/*
  ==============================================================================

    This file was auto-generated!

  ==============================================================================
*/

#ifndef MAINCOMPONENT_H_INCLUDED
#define MAINCOMPONENT_H_INCLUDED

#include "../JuceLibraryCode/JuceHeader.h"


//==============================================================================
/*
    This component lives inside our window, and this is where you should put all
    your controls and content.
*/
class MainContentComponent   : public Component,public ButtonListener
{
public:
    //==============================================================================
    MainContentComponent();
    ~MainContentComponent();

    void paint (Graphics&);
    void resized();
	void buttonClicked(Button* button);
private:
	TextButton* button1;
	String msg;
private:
    //==============================================================================
    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent)
};


#endif  // MAINCOMPONENT_H_INCLUDED



 



MainComponent.cpp:

 

/*
  ==============================================================================

    This file was auto-generated!

  ==============================================================================
*/

#include "MainComponent.h"


//==============================================================================
MainContentComponent::MainContentComponent()
{
    setSize (500, 400);
	button1 = new TextButton("click me");;
	addAndMakeVisible(button1);
	button1->setBounds (10, 10, 75, 30);
	button1->addListener(this);
	msg = "Hello World!";

}

MainContentComponent::~MainContentComponent()
{
	deleteAllChildren();
}
void MainContentComponent::buttonClicked(Button* button)
{
	if(button == button1)
	{
		msg = "button clicked!";
		this->repaint();
	}
}
void MainContentComponent::paint (Graphics& g)
{
    g.fillAll (Colour (0xffeeddff));
    g.setFont (Font (16.0f));
    g.setColour (Colours::black);
    g.drawText (msg, getLocalBounds(), Justification::centred, true);
}

void MainContentComponent::resized()
{
    // This is called when the MainContentComponent is resized.
    // If you add any child components, this is where you should
    // update their positions.
}


main.cpp:

 

 

/*
  ==============================================================================

    This file was auto-generated by the Introjucer!

    It contains the basic startup code for a Juce application.

  ==============================================================================
*/

#include "../JuceLibraryCode/JuceHeader.h"
#include "MainComponent.h"


//==============================================================================
class myguiApplication  : public JUCEApplication
{
public:
    //==============================================================================
    myguiApplication() {}

    const String getApplicationName()       { return ProjectInfo::projectName; }
    const String getApplicationVersion()    { return ProjectInfo::versionString; }
    bool moreThanOneInstanceAllowed()       { return true; }

    //==============================================================================
    void initialise (const String& commandLine)
    {
        // This method is where you should put your application's initialisation code..

        mainWindow = new MainWindow();
    }

    void shutdown()
    {
        // Add your application's shutdown code here..

        mainWindow = nullptr; // (deletes our window)
    }

    //==============================================================================
    void systemRequestedQuit()
    {
        // This is called when the app is being asked to quit: you can ignore this
        // request and let the app carry on running, or call quit() to allow the app to close.
        quit();
    }

    void anotherInstanceStarted (const String& commandLine)
    {
        // When another instance of the app is launched while this one is running,
        // this method is invoked, and the commandLine parameter tells you what
        // the other instance's command-line arguments were.
    }

    //==============================================================================
    /*
        This class implements the desktop window that contains an instance of
        our MainContentComponent class.
    */
    class MainWindow    : public DocumentWindow
    {
    public:
        MainWindow()  : DocumentWindow ("MainWindow",
                                        Colours::lightgrey,
                                        DocumentWindow::allButtons)
        {
            setContentOwned (new MainContentComponent(), true);

            centreWithSize (getWidth(), getHeight());
            setVisible (true);
        }

        void closeButtonPressed()
        {
            // This is called when the user tries to close this window. Here, we'll just
            // ask the app to quit when this happens, but you can change this to do
            // whatever you need.
            JUCEApplication::getInstance()->systemRequestedQuit();
        }

        /* Note: Be careful if you override any DocumentWindow methods - the base
           class uses a lot of them, so by overriding you might break its functionality.
           It's best to do all your work in your content component instead, but if
           you really have to override any DocumentWindow methods, make sure your
           subclass also calls the superclass's method.
        */

    private:
        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainWindow)
    };

private:
    ScopedPointer<MainWindow> mainWindow;
};

//==============================================================================
// This macro generates the main() routine that launches the app.
START_JUCE_APPLICATION (myguiApplication)


整个演示程序只需以上的代码,比起MFC来够简洁了吧! 另外,你也许注意到了,以上的代码大部分是自动生成的。的确,juce提供了一个自动创建项目的小程序,叫做introjucer,在你下载的juce包里,用vs编译一下即可用。

 


对了,juce的下载地址是:https://github.com/julianstorer/JUCE,文档地址:http://www.juce.com/documentation

上面的文档事实上不太利于理解juce,建议看这个:

http://lubyk.org/en/software/mimas/document171.pdf

或者从这里下载






 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
解决Collection__NSArrayM:0xb550c30wasmutatedwhilebeingenumerated.-发布时间:2022-07-13
下一篇:
C语言中,scanf与scanf_s的简单区别发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap