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#

2011年04月24日

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

前回の続きです。

上に重ねるフォームを透明にします。
フォームを透明にするには、TransparencyKeyとBackColorに同じ色を設定すると良いのですが、コントロールの背景もBackColorになるので、コントロールも透けてしまいます。(ボタンも透けてしまう)
そこで、少し強引ですが、BackgroundImageにTransparencyKeyの色で塗りつぶしたBITMAPを指定することで、背景だけの透明化を実現します。

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

    // 背景を塗る(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;

    // 表示
    f2.Show();
}

実行するとこんな感じです。背景だけが透明になり、コントロールは不透明になっています。
dual-form-2.png

続きます

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

posted by among at 21:10 | Comment(0) | TrackBack(0) | C#

2011年04月23日

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

レイヤードウィンドウを使った半透明のフォームには、コントロールが描画されない、描画が重たい、などの問題がありました。それに、せっかくのC#なのに、WindowsAPIを呼び出して実行するのも良くありません(個人的に)
フォームのOpacityを設定すれば良いのですが、それではフォームに配置したコントロールも半透明になります。コントロールは不透明のまま、背景のみ半透明にするにはどうしたら良いでしょうか。
多少強引ですが、半透明のフォームの上に背景のみ透明にしたフォームを重ね合わせることで、解決を試みます。

まず、半透明のフォームを作ります。テキストボックスとボタンを配置しておきます。

public partial class Form1 : Form
{
    // テキスト
    private TextBox text1;

    // ボタン
    private Button button1;

    public Form1()
    {
        InitializeComponent();

        // テキストを生成して配置
        text1 = new TextBox();
        text1.Text = "テキスト1";
        text1.Left = 10;
        text1.Top = 10;
        this.Controls.Add(text1);

        // ボタンを生成して配置
        button1 = new Button();
        button1.Text = "ボタン2";
        button1.Left = 10;
        button1.Top = text1.Bottom + 10;
        this.Controls.Add(button1);

        // キャプション
        this.Text = "半透明フォーム";

        // 半透明指定
        this.Opacity = 0.75;
    }
}

もう一つ、上に重ねるフォームを作ります。重ねたときに分かるように、コントロールは右側に配置します。

public partial class Form2 : Form
{
    // テキスト
    private TextBox text2;

    // ボタン
    private Button button2;

    public Form2()
    {
        InitializeComponent();

        // テキストを生成して配置
        text2 = new TextBox();
        text2.Text = "テキスト2";
        text2.Left = 150;
        text2.Top = 10;
        this.Controls.Add(text2);

        // ボタンを生成して配置
        button2 = new Button();
        button2.Text = "ボタン2";
        button2.Left = 150;
        button2.Top = text2.Bottom + 10;
        this.Controls.Add(button2);

        // キャプション
        this.Text = "上重ねフォーム";
    }
}

この時点で両方のフォームを表示すると、このような感じになります。まだ上に重ねるフォームは不透明です。

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

dual-form-1.png

続きます

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

posted by among at 20:01 | Comment(0) | TrackBack(0) | C#