C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: pictureboxを透過にしたい


(過去ログ 60 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■34259 / inTopicNo.1)  pictureboxを透過にしたい
  
□投稿者/ ありあり (29回)-(2009/03/24(Tue) 19:33:33)

分類:[C#] 

開発環境 windowsxp visualstudio2005(C#)

フォームに横長のパネルが複数縦ににならんでいます。
パネル上にはいくつかのラベルがあります。
パネルとラベルの上に縦に縦断する縦線を引きたいです。
上手く出来ず困っています。

----------|----------------
パネル  ラ|ベル
----------|----------------
パネル ラ|ベル
----------|----------------


PictureBox(TransparentPictureBox)を使い、ビットマップ(透過)をしても、
なぜかPictureBoxの背景が透過されないので、パネルとラベルが隠れてしまいます。

    class TransparentPictureBox : System.Windows.Forms.PictureBox {
        public TransparentPictureBox() {
            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            this.BackColor = Color.Transparent;
        }

    }

this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent;
↑↑↑↑
これをやるとPictureBoxの背景が透過されるとありましたが
透過になりませんでした。

また、ビットマップを直にフォームに書くと、パネルの下に画像が隠れてしまいます。

ご教授よろしくお願いいたします。

引用返信 編集キー/
■34261 / inTopicNo.2)  Re[1]: pictureboxを透過にしたい
□投稿者/ 土居 (7回)-(2009/03/24(Tue) 20:36:33)
No34259 (ありあり さん) に返信
> 開発環境 windowsxp visualstudio2005(C#)
>
> フォームに横長のパネルが複数縦ににならんでいます。
> パネル上にはいくつかのラベルがあります。
> パネルとラベルの上に縦に縦断する縦線を引きたいです。
> 上手く出来ず困っています。
>
> ----------|----------------
> パネル ラ|ベル
> ----------|----------------
> パネル ラ|ベル
> ----------|----------------
>
>
> PictureBox(TransparentPictureBox)を使い、ビットマップ(透過)をしても、
> なぜかPictureBoxの背景が透過されないので、パネルとラベルが隠れてしまいます。
>
> class TransparentPictureBox : System.Windows.Forms.PictureBox {
> public TransparentPictureBox() {
> this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
> this.BackColor = Color.Transparent;
> }
>
> }
>
> this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
> this.BackColor = Color.Transparent;
> ↑↑↑↑
> これをやるとPictureBoxの背景が透過されるとありましたが
> 透過になりませんでした。
>
> また、ビットマップを直にフォームに書くと、パネルの下に画像が隠れてしまいます。
>
> ご教授よろしくお願いいたします。
>

http://dobon.net/vb/dotnet/form/formregion.html
このへんがヒントになるのでは?
引用返信 編集キー/
■34268 / inTopicNo.3)  Re[1]: pictureboxを透過にしたい
□投稿者/ Azulean (335回)-(2009/03/24(Tue) 23:10:50)
No34259 (ありあり さん) に返信
> this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
> this.BackColor = Color.Transparent;
> ↑↑↑↑
> これをやるとPictureBoxの背景が透過されるとありましたが
> 透過になりませんでした。
それはあくまで背景となる、フォームに描かれている絵が見える状態になるだけであって、フォームの上に置かれているコントロールが見えるわけではありません。
従って、厳密な意味の透明ではありません。
(FormのBackgroundImageプロパティに何か画像を設定してみると、イメージしやすいかもしれませんね)


やり口としては、Label等のコントロールでBorderStyleを設定してWidthを1にすることで擬似的に表現する、コントロールをRegionとして切り抜くといったところでしょうか?

# VB Power PacksのLineShape等はLabelの下に回るので今回の用途では使えません。
引用返信 編集キー/
■34289 / inTopicNo.4)  Re[2]: pictureboxを透過にしたい
□投稿者/ もろへいや (1回)-(2009/03/25(Wed) 11:22:04)
描画の順番を制御できないのかな・・・
無理やり最初に入れたら一番上に描画されました

InitializeComponent();
Panel p = new Panel();
p.Location = new Point(130, 20);
p.Size = new Size(1, 100);
p.BackColor = Color.Black;
p.TabIndex = 0;
Control[] cc = new Control[this.Controls.Count];
for (int i = 0; i < cc.Length; i++)
{
cc[i] = this.Controls[i];
}
this.Controls.Clear();
this.Controls.Add(p);
this.Controls.AddRange(cc);
引用返信 編集キー/
■34322 / inTopicNo.5)  Re[3]: pictureboxを透過にしたい
□投稿者/ Azulean (336回)-(2009/03/25(Wed) 23:27:50)
No34289 (もろへいや さん) に返信
> 描画の順番を制御できないのかな・・・
> 無理やり最初に入れたら一番上に描画されました
一番上に持ってきたいだけであれば、デザイナでそのコントロールを選択して、右クリックして表示されるメニューから「最前面へ移動」を選択することで実現できます。

但し、今回は描画の順番ではなく、背景を"完全な透明"にしたいということであり、上にあるか下にあるかではありません。
引用返信 編集キー/
■34331 / inTopicNo.6)  Re[4]: pictureboxを透過にしたい
□投稿者/ もろへいや (2回)-(2009/03/26(Thu) 09:07:07)
> 一番上に持ってきたいだけであれば、デザイナでそのコントロールを選択して、右クリックして表示されるメニューから「最前面へ移動」を選択することで実現できます。
ですよね〜〜何考えてたんだろ俺

> 但し、今回は描画の順番ではなく、背景を"完全な透明"にしたいということであり、上にあるか下にあるかではありません。
ようは縦線を引くために透明にしたいんじゃないんですか?
複雑な形(色)の線なら画像じゃないと無理でしょうが。。
引用返信 編集キー/
■34374 / inTopicNo.7)  Re[5]: pictureboxを透過にしたい
□投稿者/ ありあり (30回)-(2009/03/27(Fri) 17:15:12)
pictureBoxを透過にして、下のコントロールを出すのは無理みたいです。

LabelのWidthを1にしてパネルとラベルに線を追加することは出来ました。

一応解決とします。

皆さんありがとうございました。

        private void Form13_Load(object sender, EventArgs e) {
            int line = 140;
            AddLine(line);
        }

        private void AddLine(int position) {
            for (int i = 0; i < panel1.Controls.Count; i++) {
                Panel p = (Panel)panel1.Controls[i];
                Label labelLine = new Label();
                labelLine.Name = "labelLine";
                labelLine.Location = new Point(position, 0);
                labelLine.Size = new Size(1, p.Height);
                labelLine.BorderStyle = BorderStyle.FixedSingle;

                for (int j = 0; j < p.Controls.Count; j++) {
                    int startPos = p.Controls[j].Location.X;
                    int width = startPos + p.Controls[j].Width;

                    if (startPos <= position && position <= width) {
                        int newPosion = position - startPos;

                        Label labelLine2 = new Label();
                        labelLine2.Name = "labelLine2";
                        labelLine2.Location = new Point(newPosion, 0);
                        labelLine2.Size = new Size(1, panel2.Controls[j].Height);
                        labelLine2.BorderStyle = BorderStyle.FixedSingle;
                        p.Controls[j].Controls.Add(labelLine2);
                    }
                }

                p.Controls.Add(labelLine);
            }
        }


        private void MoveLine(int position) {
            for (int i = 0; i < panel1.Controls.Count; i++) {
                Control c = panel1.Controls[i];


                
                for (int j = 0; j < c.Controls.Count; j++) {
                    Control child = c.Controls[j];
                    if (child.Name == "labelLine") {
                        child.Location = new Point(position, 0);
                    }
                    child.Controls.Clear();
                }

                for (int j = 0; j < c.Controls.Count; j++) {
                    int startPos = c.Controls[j].Location.X;
                    int width = startPos + c.Controls[j].Width;

                    if (startPos <= position && position <= width) {
                        int newPosion = position - startPos;

                        Label labelLine2 = new Label();
                        labelLine2.Name = "labelLine2";
                        labelLine2.Location = new Point(newPosion, 0);
                        labelLine2.Size = new Size(1, panel2.Controls[j].Height);
                        labelLine2.BorderStyle = BorderStyle.FixedSingle;
                        c.Controls[j].Controls.Add(labelLine2);
                    }
                }

            }

        }

        private void button1_Click(object sender, EventArgs e) {
            int position = 0;
            string s = textBox1.Text;
            if (s == "") {
                position = 0;
            } else {
                position = int.Parse(s);
            }
            MoveLine(position);
        }

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -