便利時計 VB6 |
文字盤数字の描画1
文字盤のマークはやはり数字のほうがよい。ここでは、数字を表示することを考える。文字を表示するには、Printメソッドを使用する。表示される位置は、最初は(0,0)、それ以降は、グラフィックス描画後の座標となる。この座標は、CurrentXプロパティとCurrentYプロパティで参照・設定することができる。座標と文字の位置は右図のような関係にある。
前の例で描画した円の中心座標は、外枠上にあるので、次のようにプログラムを変更して実行すると、数字が外枠をはみ出る部分ができてしまう。(プログラムリスト右図は実行したときのイメージ図)
・プログラムリストT
Option Explicit Const PI = 3.14159 Private Sub Form_Load() TokeiHyoji End Sub Private Sub TokeiHyoji() Dim xa As Integer, ya As Integer, r As Integer Dim xb As Integer, yb As Integer Dim n As Double Dim suuji As Integer … 省 略 … '文字盤数字表示 suuji = 1 For n = 0 To 2 * PI Step PI / 6 xb = r * Cos(n) + xa yb = r * Sin(n) + ya picTokei.CurrentX = xb 'X座標設定 picTokei.CurrentY = yb 'Y座標設定 picTokei.Print suuji '数字表示 suuji = suuji + 1 Next n End Sub
イメージ図から、(1)座標(xb,yb)の位置に文字の中心がくるようにすると数字はすべて外枠上に配置される。(2)座標(xb,yb)の計算で使用する半径を短くすれば外枠内に数字が配置される。(3)数字の10〜12は2文字なので工夫が必要である。ということがわかる。
また、数字が時計と反対周りで、しかも1がなく13がある。これについては(4)変数suujiを3から始める。(5)変数suujiが12になったら次は1になるようにする。(6)For文の繰り返しは2πまでではなく(2π-π/6)までとする(2πと0は同じ)。
まず、(1)の文字の中心を計算するには文字の大きさ、一般に使われるポイント単位ではなくtwip単位の大きさが必要になる。この文字の大きさはTextHeightプロパティとTextWidthプロパティで参照することができる。文字の大きさがわかれば、文字の大きさ分(大きさ分の数倍程度)だけ(2)の半径を小さくすれば数字を外枠内に配置することができる。
数字を配置する座標(xb,yb)は、左図のような計算をすればよい。suHとsuWはそれぞれ文字の高さと幅であり、次のようにして求める。
suH = picTokei.TextHeight("8")
suW = picTokei.TextWidth("8")
(2)で使用する半径も(r - suH)などとして、外枠の内側になるようにする。
・プログラムリストU
Private Sub TokeiHyoji() Dim xa As Integer, ya As Integer, r As Integer Dim xb As Integer, yb As Integer Dim n As Double Dim suuji As Integer, suH As Integer, suW As Integer … 省 略 … '文字盤数字表示 suuji = 3 suH = picTokei.TextHeight("8") '使用文字の高さ suW = picTokei.TextWidth("8") '使用文字の幅 For n = 0 To 2 * PI - PI / 6 Step PI / 6 If suuji = 13 Then '数字変更 suuji = 1 End If xb = (r - suH) * Cos(n) + xa yb = (r - suH) * Sin(n) + ya picTokei.CurrentX = xb - suW / 2 'X座標設定 picTokei.CurrentY = yb - suH / 2 'Y座標設定 picTokei.Print suuji '数字表示 suuji = suuji + 1 Next n End Sub
実行すると左図のように数字全体が右側に寄った形となる。計算上、このようにはならないはずである。なぜなのか考えてみよう。
文字の書き始めとなる座標(xb-suW/2, yb-suH/2)から文字を囲むように四角を描画してみることにする。四角の大きさは、suHとsuWである。四角は赤色で描画する。
・プログラムリストV(追加部分のみ)
picTokei.Print suuji '数字表示 suuji = suuji + 1 xb = (r - suH) * Cos(n) + xa yb = (r - suH) * Sin(n) + ya picTokei.CurrentX = xb - suW / 2 'X座標設定 picTokei.CurrentY = yb - suH / 2 'Y座標設定 picTokei.Line -Step(suW, suH), RGB(255, 0, 0), B Next n End Sub
追加したプログラムリストの最初の4行は数字を表示したときと同じ計算である。次のLineメソッドで四角を描画している。
Line -Step(suW, suH), RGB(255, 0, 0), B
始点の座標が省略されている。始点の座標を省略するとCurrentX, CurrentYが始点として使われる。
また、座標の前のStepは、次の( )内の座標がこの場合は始点からの相対量となる。
実行すると左図のように赤色の四角が数字全体を囲まないで、数字の左側に寄った形となる。数字の3や8をよく見ると数字の半分だけが四角に囲まれているようだ。ここで、相対量を Step(suW * 2, suH) と変更して実行すると次のように数字が四角で囲まれる。
すなわち、文字の幅については、2倍する必要があるということがわかった。
四角を描画した部分は削除する。
プログラムリストのCurrentXを計算している部分で、suW / 2 としている部分を suW とする。
suW / 2 * 2 → suW
プログラムリストを変更すると数字が考えた(計算した)とおりになる(10〜12以外)。
・プログラムリストW(変更部分のみ)
'文字盤数字表示 suuji = 3 suW = picTokei.TextWidth("8") '使用文字の高さ suH = picTokei.TextHeight("8") '使用文字の高さ For n = 0 To 2 * PI - PI / 6 Step PI / 6 If suuji = 13 Then '数字変更 suuji = 1 End If xb = (r - suH) * Cos(n) + xa yb = (r - suH) * Sin(n) + ya picTokei.CurrentX = xb - suW 'X座標設定 picTokei.CurrentY = yb - suH / 2 'Y座標設定 picTokei.Print suuji '数字表示 suuji = suuji + 1 Next n End Sub
Copyright © 2001 Hiroshi Masuda |