2009年12月23日水曜日2:09:00

カスタムウィンドウで、角丸ウィンドウ

カスタムウィンドウで、角丸にしてみた。前回のカスタムウィンドウを使用。右下は角丸にしていないです。ギザギザが気になるので、角丸の半径は小さくしてます。

        protected override void OnResize ( EventArgs e )
        {
            base.OnResize( e );

            int radius = 5;
            System.Drawing.Drawing2D.GraphicsPath path =
                new System.Drawing.Drawing2D.GraphicsPath();
            // 左上
            path.AddPie( 0, 0, radius * 2, radius * 2, 180, 90 );
            // 右上
            path.AddPie( this.Width - radius * 2, 0, radius * 2, radius * 2, 270, 90 );
            // 左下
            path.AddPie( 0, this.Height - radius * 2, radius * 2, radius * 2, 90, 90 );

            // 中央
            path.AddRectangle( new Rectangle( radius, 0, 
                                                this.Width - radius * 2, this.Height) );
            // 左
            path.AddRectangle( new Rectangle( 0, radius,
                                                radius, this.Height - radius * 2 ) );
            // 右
            path.AddRectangle( new Rectangle( this.Width - radius, radius,  
                                                radius, this.Height - radius ) );
            this.Region = new Region( path );
        }

リサイズのときに角丸になるようにしてます。なので、初期状態で角丸にならないです。そのため、ロードイベントに次のコードを入れる。

OnResize( null );

これで、初期状態でも、リサイズしたときでも、角丸になるはず。

フルスクリーンのときも角丸になるので、気になるようだったら、つぎのように変更してみたり。

            if ( this.WindowState == FormWindowState.Normal )
            {
                // 省略
            }
            else if ( this.WindowState == FormWindowState.Maximized )
            {
                path.AddRectangle( new Rectangle( 0, 0, this.Width, this.Height ) );
            }
            this.Region = new Region( path );

参考サイト

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 );
            }
        }

top