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 コメント

コメントを投稿する

0 件のコメント:

コメントを投稿

top