投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/9/7 00:30:09
> 某書籍の抜粋のページを見つけ、その書籍を購入しました。
何も書籍名を伏せずとも。(^^;


> 2.Timer1.Tick のイベントで、時計盤(外周円、目盛、数字)を描画し、
>  針(秒針・分針・時針)を描画する。
元の資料を見てみないと何とも言えませんが、
Tick 内で描画するのは、処理としては不自然ですね。

Tick の役目は、描画すべき座標計算値を更新したうえで、
PictureBox の Invalidate を呼ぶことだけに特化してみてください。
そして実際の描画処理は、PictureBox の Paint イベントで行わせるようにします。

また、Timer が並行して動作しているのなら、Refresh を呼ぶのは大げさで、
Invalidate で十分であるように思えます。これでちらつきが抑えられませんか?


> LineShape で描画しましたが、PictureBox を一番背面にしても、フォームの
> デザイン中に針は消え、「開始」を押しても、時計盤しか見えません。

仕様です。ざっくり言えば、描画されるレイヤーの違いです。
(それを制御しているのが、ShapeContainer という特殊コントロールなわけですが)

BackgroundImage などの描画結果は「下層」に描かれることになります。
LineShape / OvalShape / RectangleShape は、その上の「中層」に配置されます。
PictureBox や TextBox 等は、さらにその上の「上層」に配置されます。

各層はそれぞれ独立しており、層を超えた位置には配置できません。
たとえば、Form1 上に対して Graphics クラスの DrawLine メソッドを使った場合、
これは下層の描画処理なので、上層にある TextBox より手前に線が描かれることはありません。

同様に、中層にある各 Shape が、上層にある PictureBox や TextBox よりも
手前に来ることはありません。
ただし、コンテナコントロール(GroupBox や Panel 等)を経由すると、
それぞれのコンテナ内で、また下層・中層・上層とレイヤーが分かれることになります。

そして PictureBox はコンテナコントロールではないため、デザイン時には、
その上に他のコントロールを載せられないようになっています。

やろうと思えば、実行時に、「Me.PictureBox1.Controls.Add(Me.ShapeContainer1)」などとして
配置することはできなくもないですし、.desiger.vb を無理矢理書き換えれば
それっぽくなりますが…副作用が怖いので、自分なら Shape に頼らず、自前で描画してしまいますね。