ゴミ箱.net

汚物は消毒

フォームの上に透過画像を重ねて表示するウルテク

麻呂は、.NET Frameworkでコントロールを持つフォームの上に透過画像を重ねて表示したいなあと思いました。

KanjiCross1.png
このように、ラベルやテキストボックスが存在するフォームの上に、○を重ねて表示するのだ。
最初はフォームにPictureBoxや独自Controlを貼り付けて、背景を透過させようと思っていた。しかし、いろいろ試したのだがどうしても実現できなかった。プロパティBackColorにTransparentを設定することはできるが、本当の透過じゃなくて単に親の背景色を持ってきているだけらしい。

じゃあどうすればいいの?

結論から言うと、枠やタイトルのない別のフォームを重ねて表示させている


まず、画像を表示するための独自フォームをSystem.Windows.Forms.Form型の派生クラスとして作成する。
その独自フォームにおいて、フォームデザイナを使ってプロパティを以下のように設定する。

BackColor: TransparencyKeyと同じ色
FormBorderStyle: None
ShowIcon: False
ShowInTaskbar: False
TransparencyKey: 画像で使用していない任意の色(Magentaあたりがお勧め)

画像を動かす必要がない場合は、単純にプロパティBackgroundImageに表示したい画像を設定すればおk。アルファ値を持つ画像であれば、アルファ値が0のところが透過される。
画像を動かすなどのカスタマイズをする場合は、メソッドOnPaintをオーバーライドして独自描画を使ってもよい。
ただし、どちらの場合であっても各ピクセルはプロパティTransparencyKeyに一致する色の箇所は完全な透明、それ以外の箇所は完全な不透明として扱われる。そのため、画像のジャギーをアルファチャンネルを使ってなくすことはできない。


次に、画像を表示したいフォーム(以後親フォームとする)の子のモードレスウィンドウとして上記の独自フォームを登録する。

親フォームにメンバ変数m_childFormを定義する。型は上記の独自フォームの型とする。
そして親フォームのコンストラクタの、メソッドInitializeComponent()を呼び出した後に、以下の処理を追加する。(独自フォームの位置を合わせるためのメソッドSetChildPosition()は、後ほど作成する。)

m_childForm = new ChildForm(); //型は適当に変えてください
m_childForm.Owner = this;
SetChildPosition(); //後でメソッドを作成します
m_childForm.Show();


親フォームが移動したりリサイズされたりしたときに独自フォームの位置を合わせるため、親フォームのイベントハンドラに処理を追加する。
対象となるイベントはMove、VisibleChanged、SizeChangedとする。これらのイベントハンドラにおいてメソッドSetChildPosition()を呼び出す。

private void Form1_Move(object sender, EventArgs e)
{
SetChildPosition();
}

private void Form1_VisibleChanged(object sender, EventArgs e)
{
SetChildPosition();
}

private void Form1_SizeChanged(object sender, EventArgs e)
{
SetChildPosition();
}


最後に、親フォームに対する独自フォームの相対位置を計算するためのメソッドSetChildPosition()を親フォームのクラスに定義する。
以下は、独自フォームを親フォームとまったく同じ位置、大きさにする例である。親フォームのスクリーン座標と幅、高さをそのまま独自フォームに指定している。。

private void SetChildPosition()
{
Point p = PointToScreen(new Point(0, 0));
m_childForm.Location = p;
m_childForm.Size = Size;
}


これで、親フォームの上に透過画像を重ねて表示できるようになった。

ちなみに、独自フォームのプロパティOpacityを調整することで透過画像を半透明にすることも可能である。
ただし、透過画像の透明度は一括でしか指定できず、ピクセルごとに透明度を変えることはできない。
スポンサーサイト

PageTop

コメント


管理者にだけ表示を許可する