投稿者 VB+VC# Beginner  (社会人) 投稿日時 2020/10/15 23:59:40
魔界の仮面弁士様

こんばんは。
先日書きこんでいただいた内容をゆっくり読んでみました。

『 Invalidate / Update / Refresh メソッド 』について、
実験結果からある程度分かってきました。
ありがとうございます。

『 もしも PictureBox を矩形(正方形/長方形)以外の形状にしたい場合には、
Region プロパティを使うことができます。
https://dobon.net/vb/dotnet/form/formregion.html 』

とても参考になりました。
① PictureBox を2つ
  (もう一度「日の丸」を例にしますと、外側の白い部分と内側の赤い円の部分)
  に分割することによって、外側の目盛等は1回だけ、内側の針と中央の点は毎秒
  描画することができました。
② 今回の質問の一番最初に、「 PictureBox を作ると針が消えてしまう 」問題も、
  PictureBox に円をくりぬくことによって、解決しました。

上記の変更を試行錯誤しながら行っているうちに、新たな疑問が出てきました。
その説明の前に、私の時計の具体的な大きさを書きますと、
フォームのクライアントサイズは「 1000 x 1000 」
原点の位置を変更する方法を知らない時に作り始めましたので、原点は左上で
時計の中心の座標は (500,500) です。
数字や目盛は全て半径 400 以上、針は半径 350 以下なので、今回の内側の領域は
半径 375 つまり、「 750 x 750 」です。

①の場合、

    path.AddEllipse(New Rectangle(500 - 375, 500 - 375, 375 * 2, 375 * 2))

の円をくりぬきましたので、内側に配置する針と点は、元の中心点 (500,500) ではなく、
新しい領域の中心点 (375,375) を基準にして描画しないと、フォームの中心に
描画されませんでした。その時は、「円の内側の領域は領域の左上が 125 ずれた分、
中心がずれたのかな」と理解しました。

ところが、②の場合、ShapeContainer の領域を

    .SetBounds(500 - 375, 500 - 375, 375 * 2, 375 * 2)

    .SetBounds(0, 0, 1000, 1000)

のどちらにしても、針の EndPoint ゃ中央の点の座標は (500,500) にしないと、
正しく描画されません。
ということは、PictureBox に円をくりぬきさえすれば、ShapeContainer の
位置やサイズは変更する必要がないのでしょうか?

取り敢えず、①・②とも、希望通りに動いてくれているので問題ないのですが、
記述方法が異なる理由が知りたくて、質問させて頂きました。
説明が拙くて、わかりづらくなってすみません。