2009年12月20日日曜日17:53:00
フォームを2つ用いた一部だけ半透明のフォーム -カスタムウィンドウの練習もかねて
フォームのOpacityで透明度を設定すると、そのフォーム上のコントロールも半透明になってしまう。やめてください、コントロールは透明にならなくていいんです・・・!
フォームのコントロール上だと透明化してしまう。そこで、もうひとつフォームをつくって、それをコントロールに見せかけてみた。メインのフォームのコントロールじゃないので、もうひとつのフォームは透明化しない。もうひとつのフォームに、透明化したくないコントロールをずかずかおいていけばいい。
まず、もうひとつのフォームを表示して、位置とサイズを調整する。また、メインフォームより常に前面に表示されるようにする。
/// <summary> /// ロードイベント /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_Load ( object sender, EventArgs e ) { this.title_label.Text = this.Text; this.title_label.MouseDown += new MouseEventHandler( Form1_MouseDown ); this.title_label.MouseMove += new MouseEventHandler( Form1_MouseMove ); this.fm2 = new Form2(); this.fm2.FormClosing += new FormClosingEventHandler( fm2_FormClosing ); this.AddOwnedForm( fm2 ); this.fm2.Width = this.Width - 40; this.fm2.Height = this.Height - 60; this.fm2.Show(); this.fm2.Left = this.Left + 20; this.fm2.Top = this.Top + 40; }
もうひとつのフォームをコントロールに見せかけているだけなので、メインフォームが動いたり、サイズが変わると、モロバレしてしまう。したがって、メインフォームが動いたら、追従するように、位置とサイズを変更すればいい。
private void Form1_Move ( object sender, EventArgs e ) { this.fm2.Left = this.Left + 20; this.fm2.Top = this.Top + 40; } private void Form1_Resize ( object sender, EventArgs e ) { this.fm2.Width = this.Width - 40; this.fm2.Height = this.Height - 60; }
コントロールに見せかけるので、フォームのボーダースタイルをNoneに設定する。そして、タスクバーに表示されないように設定すれば、それっぽく見える。
ALT+F4で、もうひとつのフォームを消したら、エラーでたので、つぎのコードを追加。たぶんこれでエラーがでなくなるはず。
private void Form2_FormClosing ( object sender, FormClosingEventArgs e ) { if ( this.Owner != null ) { this.Owner.RemoveOwnedForm( this ); } }
0 件のコメント:
コメントを投稿