juce实现自定义控件

实现自定义控件

1.实现效果如下仅是demo

请添加图片描述

2.实现功能代码

  • 1)在工程中添加资源文件

请添加图片描述

  • 2)实现按钮类

    //ImageButton.h文件
    class ImageButton  : public juce::TextButton
    {
    public:
        ImageButton(const juce::String& buttonName, const juce::Image& normalImage, const juce::Image& overImage, const juce::Image& downImage);
      
        ~ImageButton() override;
        
        void paintButton(juce::Graphics& g, bool isMouseOverButton, bool isButtonDown) override;
    
    private:
        juce::Image normalImage, overImage, downImage;
        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ImageButton)
    };
    
    // ImageButton.cpp
    
    #include <JuceHeader.h>
    #include "ImageButton.h"
    
    //==============================================================================
    ImageButton::ImageButton(const juce::String& buttonName, const juce::Image& normalImage, const juce::Image& overImage, const juce::Image& downImage)
        : juce::TextButton(buttonName, {})
        , normalImage(normalImage)
        , overImage(overImage)
        , downImage(downImage)
    {
    }
    
    ImageButton::~ImageButton()
    {
    }
    // 绘制图片
    void ImageButton::paintButton(juce::Graphics& g, bool isMouseOverButton, bool isButtonDown)
    {
        juce::Image imageToDraw = normalImage;
    
        if (isMouseOverButton)
            imageToDraw = overImage;
        else if (isButtonDown)
            imageToDraw = downImage;
        
        g.drawImageWithin(imageToDraw,0, 0, getWidth(), getHeight(),juce::RectanglePlacement(36));
    }
    

    3)在自定义控件中添加该按钮

    // CustomButton.h
    #pragma once
    #include <JuceHeader.h>
    
    class ImageButton;
    //==============================================================================
    /*
    */
    class CustomButton  : public juce::Component,
        public juce::Button::Listener
    {
    public:
        CustomButton();
        ~CustomButton() override;
    
        void paint (juce::Graphics&) override;
        void resized() override;
        
        void buttonClicked(juce::Button*) override;
    private:
        std::unique_ptr<ImageButton> ptr_close; // 添加的按钮
        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CustomButton)
    };
    
    #include <JuceHeader.h>
    #include "CustomButton.h"
    #include "ImageButton.h"
    //==============================================================================
    CustomButton::CustomButton():ptr_close(new ImageButton("start", 
                                                            juce::ImageFileFormat::loadFrom(BinaryData::clear_png, BinaryData::clear_pngSize),
                                                            juce::ImageFileFormat::loadFrom(BinaryData::clear_png, BinaryData::clear_pngSize),
                                                            juce::ImageFileFormat::loadFrom(BinaryData::clear_png, BinaryData::clear_pngSize)))
    {
        addAndMakeVisible(*ptr_close); // 使按钮显示
        ptr_close->addListener(this); // 添加按钮监听click事件
        setSize(60,40); // 设置自定义控件 
    }
    
    CustomButton::~CustomButton()
    {
    }
    
    void CustomButton::paint (juce::Graphics& g)
    {
    	// 绘制自定义控件
        g.fillAll (getLookAndFeel().findColour (juce::ResizableWindow::backgroundColourId));   // clear the background
    
        g.setColour (juce::Colours::red);
        g.drawRect (getLocalBounds(), 1);   // draw an outline around the component
    
        g.setColour (juce::Colours::white);
        g.setFont (14.0f);
        g.drawText ("CustomButton", getLocalBounds(),
                   juce::Justification::centred, true);   // draw some placeholder text
    }
    
    void CustomButton::resized()
    {
       	// 设置按钮的位置和大小
        juce::Rectangle<int> area = getLocalBounds();
        ptr_close->setBounds(area.removeFromRight(20).removeFromTop(20));
    }
    // 按钮自定义事件
    void CustomButton::buttonClicked(juce::Button* button)
    {
        if (button == ptr_close.get())
        {
            printf("hello");
        }
    }
    
    

    3)在主窗口中添加自定义控件

    // MainComponent.h
    #pragma once
    
    #include <JuceHeader.h>
    #include "CustomButton.h"
    
    class MainComponent  : public juce::Component
    {
    public:
        //==============================================================================
        MainComponent();
        ~MainComponent() override;
    
        //==============================================================================
        void paint (juce::Graphics&) override;
        void resized() override;
    
    private:
        //==============================================================================
        // Your private member variables go here...
    
        CustomButton custom_button;
        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainComponent)
    };
    
    #include "MainComponent.h"
    
    //==============================================================================
    MainComponent::MainComponent()
    {
        setSize (600, 400);
    
        addAndMakeVisible(custom_button); // 按钮设置显示
    }
    
    MainComponent::~MainComponent()
    {
    }
    
    //==============================================================================
    void MainComponent::paint (juce::Graphics& g)
    {
    }
    
    void MainComponent::resized()
    {
    	// 设置自定义控件的位置和大小
        auto area = getLocalBounds();
        custom_button.setBounds(area.removeFromRight(60).removeFromTop(40));
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值