⛩️
HandyGraphicsで文字を真ん中寄せ(マクロ)
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