2011年04月29日

半透明のフォームの作り方(2つのフォームを重ねる)・ラスト

前回の続きです。

上に重ねるフォームを分からなくするため、色々設定します。
詳しくはコメントを参照してください。

また、半透明のフォームの移動に追従させるために、Moveイベントも追加しておきます。

private void Form1_Load(object sender, EventArgs e)
{
    Form2 f2 = new Form2();

    f2.ShowInTaskbar = false; // タスクバーに表示させない
    f2.ControlBox = false; // コントロールボックスを表示しない
    f2.FormBorderStyle = FormBorderStyle.None; // 枠線スタイル=枠線なし
    f2.Size = this.ClientSize; // Form2のサイズはForm1のクライアント領域のサイズ
    f2.StartPosition = FormStartPosition.Manual; // Form2の初期位置はLocationで指定
    f2.Location = this.PointToScreen(this.ClientRectangle.Location); // Form2の位置をForm1のクライアント領域にセット
    // 背景を塗る(this.BackColorだとコントロールの背景も変わってしまうのでダメ)
    {
        // フォームと同じ大きさのBITMAPを作成
        Bitmap image = new Bitmap(f2.Width, f2.Height);

        // 透過色で塗りつぶす
        Graphics g = Graphics.FromImage(image);
        g.Clear(Color.Green); // 何色でも良いが他のコントロールの色と違うものにする

        // 背景に設定
        f2.BackgroundImage = image;
    }
    // 透過色の設定
    f2.TransparencyKey = Color.Green;

    // 半透明フォームをオーナーにする
    this.AddOwnedForm(f2);

    // 連動イベント
    this.FormClosing += delegate { f2.Close(); }; // Closeに追従
    this.Move += delegate { f2.Location = this.PointToScreen(this.ClientRectangle.Location); }; // Moveに追従

    f2.Show();
}

実行するとこんな感じです。
左側のコントロールは背景が透けていますが、右側のコントロールは透けていません。
dual-form-3.png

ただし、このフォームには重大な欠点があります。
右側の透明なフォームの方のコントロールを触ると、透明なフォームがアクティブになるのでタイトルバーの色がノンアクティブになってしまいます。(フォーカスが外れたときと同じような表示になります)
今のところ、良い解決方法が思いつきません。解決方法が分かったら、追って記事にしたいと思います。

良かったらクリックしてください
にほんブログ村 IT技術ブログ プログラム・プログラマーへ  人気ブログランキングへ

posted by among at 22:15 | Comment(2) | TrackBack(0) | C#
この記事へのコメント
> ただし、このフォームには重大な欠点があります。
> 右側の透明なフォームの方のコントロールを触ると、透明なフォームがアクティブになるのでタイトルバーの色がノンアクティブになってしまいます。(フォーカスが外れたときと同じような表示になります)
> 今のところ、良い解決方法が思いつきません。解決方法が分かったら、追って記事にしたいと思います。

こんなのはどうですか?

透明フォーム.GotFocus += (sender, e) =>
{ 非透明フォーム.Focus(); }

弱点として、ちょっとちらつきますが…。
Posted by c# 初心者 at 2012年04月08日 22:36
c# 初心者 さん。情報ありがとうございます。
やってみたのですが上手く行きませんでした。

透明フォームというのは右側のものですので、この例ではForm2になりますね。
非透明フォームはForm1です。

GotFocusでForm2がフォーカスを得たときにForm1にフォーカスをセットするわけですが
これだとコントロールを操作することができないのではないでしょうか?
ボタンはともかく、テキストボックスは編集できないような……?
Posted by at 2012年07月14日 12:49
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/44291081

この記事へのトラックバック