JUCE学习笔记01——子组件与Graphics类
一、知识点:
- Graphics类的基本用法
- 创建并使用子组建
二、目的:
使用GUI应用程序模板,通过创建和添加子组件绘制房子学习Graphics类中基础图形的绘制、了解父子组件
三、内容:
- Projucer中创建子组建(.h与.cpp分开,继承自Component类),IDE(VS、XCode等)打开JUCE工程
- 主组建中包含子组建的头文件、创建子组建对象
- 使用Graphics类绘制子组件(wall)——矩形
void WallComponent::paint (Graphics& g)
{
Rectangle<float> wall(200,150,200, 100);//创建矩形
g.fillCheckerBoard(wall, 20, 10, Colours::grey, Colours::dimgrey); //使用棋盘填充矩形,模拟墙面
g.drawRect(wall); //绘制创建的矩形
}
- 在主组件中添加并显示子组件
addAndMakeVisible(wall);
- 主组件中设置wall子组件的位置
void MainComponent::resized()
{
wall.setBounds(getLocalBounds());
}
运行效果:
- 添加草地(Grass)组件——直线
void GrassComponent::paint (Graphics& g)
{
g.setColour(Colours::green); //设置颜色
g.drawLine(50, 260, getWidth() - 50, 260,20); //绘制宽为20像素的草坪
}
运行效果:
- 添加三角形(Roof)屋顶,Graphics类没有直接绘制三角形的方法,所以通过Path类绘制——三角形
void RoofComponent::paint (Graphics& g)
{
g.setColour(Colours::red); //设置颜色
Path p; //创建Path对象
p.startNewSubPath(160, 150); //绘制起始点
p.lineTo(440, 150); //三角形第二个点
p.lineTo(300, 100); //第三个点
p.closeSubPath(); //封闭路径形成三角形
g.fillPath(p); //填充颜色
}
运行效果:
8. 添加阳光(Sun)组件——椭圆
void SunComponent::paint (Graphics& g)
{
g.drawEllipse(400,50,30,30,0.5);//绘制椭圆
g.setColour(Colours::yellow); //设置颜色
g.fillEllipse(400, 50, 30, 30); //填充
}
运行效果:
9. 添加文本子组件(Text)——文本
void TextComponent::paint (Graphics& g)
{
Font myFont("Gill Sans Ultra Condensed","Ultra Bold",30);//创建字体
g.setFont(myFont); //使用字体
g.setColour(Colours::gold); //设置颜色
g.drawText("The Audio Programmer!", 10, 10, 300, 50, Justification::centred); //绘制文本
}
运行效果:
四、JUCE工程目录与代码:
//MainComponent.h
#pragma once
#include "../JuceLibraryCode/JuceHeader.h"
#include "WallComponent.h"
#include "GrassComponent.h"
#include "RoofComponent.h"
#include "SunComponent.h"
#include "TextComponent.h"
class MainComponent : public Component
{
public:
//====================================================================
MainComponent();
~MainComponent();
//====================================================================
void paint (Graphics&) override;
void resized() override;
private:
//====================================================================
// Your private member variables go here...
WallComponent wall;
GrassComponent grass;
RoofComponent roof;
SunComponent sun;
TextComponent text;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainComponent)
};
//MainComponent.cpp
#include "MainComponent.h"
//=========================================================================
MainComponent::MainComponent()
{
setSize (600, 400);
addAndMakeVisible(wall); //主组件中添加并显示子组件
addAndMakeVisible(grass);
addAndMakeVisible(roof);
addAndMakeVisible(sun);
addAndMakeVisible(text);
}
MainComponent::~MainComponent()
{
}
//========================================================================
void MainComponent::paint (Graphics& g)
{
g.fillAll(Colours::skyblue); //填充主组件背景色
}
void MainComponent::resized()
{
wall.setBounds(getLocalBounds());
grass.setBounds(getLocalBounds());
roof.setBounds(getLocalBounds());
sun.setBounds(getLocalBounds());
text.setBounds(getLocalBounds());
}