视窗应用软件开发其中一个环节是版面设计。JUCE 有几种控制版面的作法,本篇介绍如何使用 juce::Rectangle
类别来安排控制项。
下图为设计目标:
首先加上必要的 TextButton
。为了说明方便,程序采「作业式」写法,在 MainComponent
加上以下三个 TextButton
物件:
juce::TextButton google_button_;
juce::TextButton duckduckgo_button_;
juce::TextButton bing_button_;
接着在 MainComponent
建构式初始化上述物件,并将其加入 MainComponent
:
class MainComponent : public juce::Component
{
public:
MainComponent() :
google_button_("Google!"),
duckduckgo_button_("DuckDuckGo"),
bing_button_("Bing")
{
setSize (600, 400);
addAndMakeVisible(google_button_);
addAndMakeVisible(duckduckgo_button_);
addAndMakeVisible(bing_button_);
}
};
然後替每个按钮加上行为。在 MainComponent
建构式内,采用「作业式」复制贴上大法:
google_button_.onClick = []()
{
juce::URL google("https://www.google.com");
google.launchInDefaultBrowser();
};
duckduckgo_button_.onClick = []()
{
juce::URL duckduckgo("https://duckduckgo.com/");
duckduckgo.launchInDefaultBrowser();
};
bing_button_.onClick = []()
{
juce::URL bing("https://www.bing.com/");
bing.launchInDefaultBrowser();
};
接下来是重头戏,要在 MainComponent::resized
函数里安排各个控制项的「大小」以及「位置」。本篇使用 juce::Rectangle
来切版。
首先定义两个常数,一个表示按钮宽度(kButtonWidth
);一个表示每一行之间的间隔(kRowDistance
)。
getLocalBounds 函数回传 Rectangle,代表 MainComponent 的可用大小,接着呼叫 reduced 函数,将上下左右分别内缩 (20, 10)。
取得内缩後的 Rectangle 後,利用 removeFromTop 函数取得整个 MainComponent 高度的 20%。
void MainComponent::resized()
{
const int kButtonWidth = 150;
const int kRowDistance = 10;
const int kButtonDistance = 20;
auto bounds = getLocalBounds().reduced(20, 10);
auto first_row = bounds.removeFromTop(getLocalBounds().getHeight() * 0.2);
}
取得第一列的 Rectangle
後,开始切三个按钮的位置。
void MainComponent::resized()
{
auto google_bounds = first_row.removeFromLeft(kButtonWidth);
google_button_.setBounds(google_bounds);
first_row.removeFromLeft(kButtonDistance);
auto duckduckgo_bounds = first_row.removeFromLeft(kButtonWidth);
duckduckgo_button_.setBounds(duckduckgo_bounds);
first_row.removeFromLeft(kButtonDistance);
auto bing_bounds = first_row.removeFromLeft(kButtonWidth);
bing_button_.setBounds(bing_bounds);
}
到目前为止,离我们的设计目标还有点距离,需要进一步调整。
juce::Rectangle
的详细用法,我建议阅读以下两篇:
>>: [Day 8] Leetcode 1189. Maximum Number of Balloons (C++)
今天就来介绍时间(time)的套件库吧。 time.time() : 显示从1970/1/1 00:...
tags: 2021铁人赛 React 系列文想法来源 因为笔者本身在金融业工作,日常生活中时常关注...
前言 昨天已经将TableView给建立完毕了,今天来跟大家聊聊TableViewCell的建立方法...
前面已经讲完 Processor 和 Connection 两个重要的 Componenet,我们就...
图的基本定义 图的表示方式与基本运作 表示方式 相邻矩阵 若G(V,E)是含n个顶点的图,表示图G的...