Top > Programmingとか > VB / VB.NET > 半透明グラデーションなウィンドウを作ってみたい

2005年06月11日

01 半透明グラデーションなウィンドウ

検証環境 自作ATX(PenIII1.2GHz/GA-6VTXE/512MB)
WinXPPro(2002)SP2/VS.NET2003(7.1.3091) & .NET Framework1.1(1.1.4322SP1)/MSDN-Lib Oct,2004

とーとつですが、グラデーションな背景を持つウィンドウを作ってみたくなりました。

vb02-01-01.gif
↑こんなの。

いゃこの時点でもぅできてるじゃんとかグラデーションじゃなくてしましまじゃんとかのツッコミはご勘弁いただくとして。

ふつーに考えれば、黄色→黒のグラデーションの画像を用意して、Form1.BackGroundImageに指定してやればいいんだろぅな、と。
実際上に提示したFormはそーやって作ったものなんですが。

これを、BackColorで指定した任意の色を起点に黒へグラデーションがかかるウィンドウにできないかなーと考えてみたわけです。

vb02-01-02.gif
↑こんなのを元に、


vb02-01-01.gif
↑こんなふうに。

あー、てことはだ。
半透明なグラデーションを持つ画像をpngかなんかで用意して張り込めばいいんじゃないかしら、と。

vb02-01-03.png
↑IEではわかりませんが、半透明なグラデーションを持つpng画像。

FireFox/Operaの最新では半透明っぷりがわかります。


vb02-01-04.gif
↑BackGroundImageプロパティに設定してみたところ。いい感じじゃん。

で、実行してみると。

vb02-01-05.gif
…Form自体が半透明になっていますよ?


vb02-01-06.gif
…しかも移動させるとダメダメですよ?


vb02-01-07.gif
…でもいったん他のウィンドウの下に隠してから再度前面に出すと再びいい感じですよ?

えー、 うーんと。
どぅもこれ、WindowsFormのPaintメソッドが走る時に、デスクトップとのアルファブレンドまで自動的にやってくれているみたいな感じの動作ですね。

てことは、ドラッグ中にもPaintメソッドが走るよぅにしてやればいいんではないかしら。

てことで、

Private Sub Form1_Move( _
ByVal sender As Object _
, ByVal e As System.EventArgs _
) Handles MyBase.Move
Me.Invalidate()
End Sub

てゅう感じでコードを書いてみました。

vb02-01-08.gif
だめだ、移動するごとに驚きの黒さに!

上記のコードは1ピクセル移動するごとにPaintメソッドが走るよぅな指定なわけなんですが、どぅもブレンドする元が、その直前に表示されている自分自身を含むデスクトップみたいで。
もともと黒くグラデーションがかかっている画像にさらに黒いグラデーションをかけるわけですから、Paintメソッドが走るごとにどんどん黒さが増していくんですね。

うーむ。おもしろい動作をするんだけどなぁ。
使い物にならないところまでしか調べられませんでしたが、とりあえずここまででいったんメモしておくことにします。

なんかいいアイデアが思いついたら続編、といぅことでひとつ。



2006.06.23 追記
なんだかこんな失敗サンプルをほしいと言ってくださった方がいらっしゃいますので、提供することにしてみました。あくまでも失敗サンプルですので、そのつもりで笑っていただければ幸いです。
ってこれほしいと言われた方は日本語わからなそうなんだよなぁ…本気でデスクトップに対して半透明Windowを期待されていたとしたら申し訳なくってしょうがありませんが。