10月末から、今日までひたすら続いてた工作がやっと終わった。
11月はゆとりある一ヶ月になってほしいですね。
けどそれは無理だと思う。試験あるし。
Windowsフォームでラベルというのはよく使う。
その変な使い方というわけで、Regionプロパティの話。
import clr
import System
clr.AddReferenceByPartialName("System.Windows.Forms")
clr.AddReferenceByPartialName("System.Drawing")
myform=System.Windows.Forms.Form()
mylabel=System.Windows.Forms.Label()
mylabel.Size=System.Drawing.Size(100,100)
mylabel.BackColor=System.Drawing.Color.LightPink
mylabel.TextAlign=System.Drawing.ContentAlignment.MiddleCenter
mylabel.Text="丸"
zone=System.Drawing.Drawing2D.GraphicsPath()
zone.AddEllipse(0,0,100,100)
mylabel.Region=System.Drawing.Region(zone)
myform.Controls.Add(mylabel)
myform.ShowDialog()
IronPythonなら簡単に試せますね。
重要なのは、zoneというGraphicsPathのインスタンスを作って、
そこに円状の領域を設定、これでもってRegionを作成し、設定。
これにより何ができるのかというとコントロールの表示領域が円状になる。
実際実行してみると、ピンク色の円の中に”円”という字が書いてある。
このピンク色の円こそがラベルです。
まぁ今回は文字列が書いてあるからラベルっぽいけど、
文字列ないにも関わらずラベルでこれを描いているときがある。
無駄じゃないかというのはあるかも知れんが、実は便利。
PictureBoxの場合、一時的に書くのは非常に容易なのだが、
もしウインドウの影に隠れたりして、再描画するとき復帰しない。
復帰するためにはGrapicsに空のBitmapをセットしてから書けばよいのだが…
まぁその都合は@ITで紹介されてるな。「PictureBoxコントロールにグラフィックを描画するには?」
有名な事実だとは思いますけどね。
けど、この方法ならそんなこと気にしなくてもOK。
しかもこのRegionで切り抜く方法は重なり合いが発生したときにも有利。
mytbox=System.Windows.Forms.TextBox()
myform.Controls.Add(mytbox)
myform.ShowDialog()
驚くことに、ラベルの下にきちんとテキストボックスが表示されてる。
これは実はかなりすごいことなんです。
Regionで指定した範囲しかコントロールの領域じゃないんです。
だからClickイベントを設定して、丸まってる部分をクリックしても反応無し。
ただ透明に設定することとの違いについては、
mylabel.BackColor=System.Drawing.Color.Transparent
myform.BackColor=System.Drawing.Color.LightBlue
としたときの動作を見ればよくわかります。
背景色が透明になれば、テキストボックス全体が透けそうですね。
しかし、透明であるべきラベルの領域は全域真っ青。
この透明というのは、親コントロールの上に子が配置される前の表示そのものが背景という意味。
なので、親コントロールの上に配置した2つ以上のものが重なり合うと悲しい結果になる。
まぁ、この性質を理解して、Aの上にB、Bの上にCを重ねるという方針なら、
Aの子にBを、Bの子にCを登録すればいいのです。わかりやすい。
まぁなかなか理解してない人は混乱する話です。
まぁこんな風にしてラベルでいろいろ作りました。
ラベルは切り絵のように使うことができるということです。
明らかに使い方がおかしいだろと言われたけど、
しかし使えるものは便利に使いたいものです。
Regionプロパティはそれを支援してくれますよ。