虽然可以用ColourId来定位到非常准确的颜色,但ID值写在代码中就成了魔鬼数字。如果再定义一下,还不如直接用已经定义的,基本够用:
cpp主要代码:
MainComponent::MainComponent()
{
setSize (1800, 1200);
colourBlocks.add({"black ", juce::Colours::black });
colourBlocks.add({"navy ", juce::Colours::navy });
colourBlocks.add({"darkblue ", juce::Colours::darkblue });
...
colourBlocks.add({"lightyellow ", juce::Colours::lightyellow });
colourBlocks.add({"ivory ", juce::Colours::ivory });
colourBlocks.add({"white ", juce::Colours::white });
}
void MainComponent::paint (juce::Graphics& g)
{
// (Our component is opaque, so we must completely fill the background with a solid colour)
// g.fillAll (getLookAndFeel().findColour (juce::ResizableWindow::backgroundColourId));
// g.setFont (juce::Font (16.0f));
g.setColour (juce::Colours::white);
g.fillAll();
int blockWidth = getWidth() / 15; // 假设每行有15个颜色块
int blockHeight = getHeight() / 10; // 假设每列有10个颜色块
for (int i = 0; i < colourBlocks.size(); ++i)
{
int row = i % 15;
int col = i / 15;
int x = row * blockWidth;
int y = col * blockHeight;
if (row < 15 && col < 10)
{
g.setColour(colourBlocks[i].colour);
g.fillRect(x, y, blockWidth, blockHeight);
if (colourBlocks[i].name.contains("black") || colourBlocks[i].name.contains("dark") ||
colourBlocks[i].name.contains("night") || colourBlocks[i].name.contains("navy") ||
colourBlocks[i].name.contains("indigo") || colourBlocks[i].name.contains("maroon") )
{
g.setColour(juce::Colours::white);
}
else
{
g.setColour(juce::Colours::black);
}
g.drawMultiLineText(colourBlocks[i].name, x + 5, y + (blockHeight / 2), blockWidth - 2, 20, juce::Justification::centred);
}
}
}
.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...
struct ColourBlock
{
juce::String name;
juce::Colour colour;
};
juce::Array<ColourBlock> colourBlocks;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainComponent)
};