iT邦幫忙

2021 iThome 鐵人賽

DAY 18
0
Software Development

JUCE 入門 @ 跨平台應用程式開發使用 C++系列 第 18

Day 17:Layout Using Grid

介紹了 juce::Rectangle 以及 juce::FlexBox 這兩個拉版工具後,這篇介紹 juce::Grid。Grid 跟 FlexBox 有相似處,各有優缺點,熟悉兩者後,視需求挑選。

延續前一篇範例,以 Grid 改寫如下:

void MainComponent::resized()
{
  const int kRowDistance = 10;
  const int kButtonDistance = 20;

  auto bounds = getLocalBounds().reduced(20, 10);
  auto first_row = bounds.removeFromTop(getLocalBounds().getHeight() * 0.2);

  // Caculate width for each button.
  const auto button_width = (bounds.getWidth() - (kButtonDistance * 2.0)) / 3.0;
  const auto button_height= getLocalBounds().getHeight() * 0.2;

  juce::Grid grid;
  grid.rowGap = 20_px;
  grid.columnGap = 20_px;

  using Track = Grid::TrackInfo;
  grid.templateRows = {Track(1_fr), Track(2_fr), Track(2_fr)};
  grid.templateColumns = {Track(1_fr), Track(1_fr), Track(1_fr)};

  grid.items.add(GridItem(google_button_).withWidth(button_width));
  grid.items.add(GridItem(duckduckgo_button_));
  grid.items.add(GridItem(bing_button_));

  grid.performLayout(bounds);
}

Grid 使用 Row(橫列)以及 Column(直行)來拉版面。上述程式碼先設定行列間距為 20 pixel。

接著利用 templateRows 以及 templateColumns 來設定行與列的數量以及大小分佈。

然後把三個 TextButton 以 GridItem 包裝起來後,加到 Grid。最後再呼叫 performLayout 進行排版。效果如下:

目前為止介紹的 GUI Layout 工具可以視不同場合互相搭配,以建構複雜的使用者介面。 接下來要介紹的是改變個別控制項「外觀」的工具——juce::LookAndFeel

JUCE DemoRunner 的範例如下,一模一樣的控制項(行為不變),透過 JUCE LookAndFeel 機制,外觀可以千變萬化:


上一篇
Day 16:Layout Using FlexBox
下一篇
Day 18:分離控制項的外觀與行為
系列文
JUCE 入門 @ 跨平台應用程式開發使用 C++29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言