⛩️

HandyGraphicsで文字を真ん中寄せ(マクロ)

2022/09/21に公開

HandyGraphics(以下HG)には文字を描画する方法がありますが、真ん中寄せするための関数は用意されていません。
文字を真ん中寄せにしたい時は、文字の描画範囲を調べて調整するしかありません。範囲といっても幅と高さが分かれば真ん中寄せはできます。

原理は単純で、文字の中央にしたい位置から幅と高さを、それぞれ1/2倍して引くだけです。
次の図を見れば、理解できるかもしれません。(図の作り方が下手でごめんなさい)

C言語で書くと次のようになります。

double x, y, dw, dh;

// 指定した文字列で実際に描画したときの描画範囲を調べる
HgWTextSize(layer, &dw, &dh, "ほげほげほげ");

// 中央の座標を決める
// (100, 200)を基準に真ん中寄せにしたい
x = 100;
y = 200;

// 真ん中に寄せる
x = x - dw / 2.0;
y = y - dh / 2.0;

// 文字を描画
HgWText(layer, x, y, "ほげほげほげ");

さて、ここで困ったことがあります。というのは、毎回この長ったらしいコードを描かなきゃいけないんですね!
一回くらいなら我慢できますが、それ以上は我慢したく無いです。
そこでC言語のマクロ(関数マクロ)を使ってみようと思います。自分も深く理解してるわけではないし、もっと良いやり方があるかもしれません。(知ってたら教えてください)

マクロについて気になる人は調べてみてください。自分はちゃんと説明できないです。

マクロ
#define CenteredText(layer, x, y, ...)                                 \
  {                                                                    \
    double _dp1, _dp2;                                                 \
    HgWTextSize(layer, &_dp1, &_dp2, __VA_ARGS__);                     \
    HgWText((layer), (x - _dp1 / 2.0), (y - _dp2 / 2.0), __VA_ARGS__); \
  }
使用例
#include <handy.h>

#define CenteredText(layer, x, y, ...)                                 \
  {                                                                    \
    double _dp1, _dp2;                                                 \
    HgWTextSize(layer, &_dp1, &_dp2, __VA_ARGS__);                     \
    HgWText((layer), (x - _dp1 / 2.0), (y - _dp2 / 2.0), __VA_ARGS__); \
  }

int main(void) {
  // ウィンドウを作成
  int window = HgOpen(600, 400);

  // (300, 100)に「Hello World」を真ん中寄せで描画
  CenteredText(window, 300, 100, "Hello World");

  // 書式演算子も使える
  CenteredText(window, 300, 200, "%d", 123456);

  // 何かのキーが押されるまで待機
  HgGetChar();
  HgClose();
  return 0;
}

書式演算子も使えて、一行で真ん中寄せの文字が描画できるようになりました。
これで快適です。

Discussion