透過ボタンを作成する

MSDN フォーラムで質問が上がっていたのですが、PictureBox の上に Buttonコントロールを貼り付け、背景の画像を透過させたいとのこと。(正確には PictureBox はコンテナオブジェクトではないので、フォーム等に貼り付けた Button を PictureBox の前面に描画させてるだけなんだろうが・・・)



例えば、これを

こうしたいらしい・・・(2010/04/28 00:18 時点での推測です)


この質問、すぐ誰かが回答するだろうと思って様子見してたわけですが、なかなかこれがレスが付かない。で、ちょっくら私が回答しようと思って調べてみたのですが、これが意外と手強い!!


Button.FlatStyle プロパティを Flat とかに変更すれば、コンテナオブジェクトの背景が描画されるようになるのですが、Flat だとボタンの存在がわかりにくくなるし(まぁ実際そういうニーズもあるのでしょうけど)、Popup にすると OS で設定されたスタイルが反映されなくなるので、見栄えがよろしくありません。
ましてや今回の御題は「PictureBox の画像を Buton コントロールで透過させたい」という話なので、そもそもコンテナでもない関係ないコントロールの画像をどうやってボタンコントロールに描画させるのか、しばらく考えさせられた訳ですが、PictureBox のimage を Button にコピーし、Graphics.DrawImageUnscaledAndClipped メソッドを使って位置調整すればいいことに気が付いた。

で、以下サンプルです。Button をクリックすると、透明ボタンになります。
Graphics.DrawImageUnscaledAndClipped の一つ目のパラメータに、背景側のイメージを指定するところがちと判りにくいんですがね。