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

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

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

Re[2]: Graphicsオブジェクトの透過の問題について


(過去ログ 43 を表示中)

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

■22821 / inTopicNo.1)  Graphicsオブジェクトの透過の問題について
  
□投稿者/ C#プログラマー (1回)-(2008/08/02(Sat) 17:08:29)

分類:[C#] 

はじめまして。C#プログラミングをしている者です。
環境はWindowsXP Service Pack3、Visual Studio2003です。

質問はGraphicsオブジェクトでPictureBoxに描画したときなのですが・・・。

pictureBox1とpictureBox2 があるとします(pictureBox1の上にpictureBox2 が重なっているとします)。
各PictureBoxにそれぞれ違うGraphicsオブジェクトで図形を描画します。
そのときpictureBox1に描画された図形をpictureBox2を通して(pictureBox2の背景を透明にして?)pictureBox2に描画された図形と同時に見ることはできるのでしょうか?
インターネットで調べていろいろ試したのですが現時点で出来ませんでした。
例えば、pictureBox2の背景を透明(Color.Transparent)にしてpictureBox2のParentプロパティをpictureBox1にすれば、
pictureBox1に設定されたBitmapオブジェクトやImageに対しては透明になるのですが、Graphicsオブジェクトで描画した図形に対しては透明になりませんでした。(pictureBox2と重なった部分は表示されない。)

Graphicsオブジェクトで描画された図形も透過させる方法がありましたら教えてください。よろしくお願いします。
参考までに試行してダメだったコードを載せます。


適当にpictureBox1とpictureBox2とbutton1,button2をForm上に配置します。
それに対して、以下のコードを書きました。

// button1をクリックしたとき
private void button1_Click(object sender, System.EventArgs e)
{
    // pictureBox2のParentプロパティをpictureBox1に設定する
    pictureBox2.Parent = pictureBox1;
    // pictureBox2の背景色をTransparentに設定する
    pictureBox2.BackColor = Color.Transparent;

    // Bitmapオブジェクトの生成
    Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
    // 各ピクセルに描画する
    for(int i=0 ; i< pictureBox1.Width; i++)
    {
        bmp.SetPixel(i, pictureBox1.Height/2, Color.Blue);
    }
    for(int j=0; j< pictureBox1.Height; j++)
    {
        bmp.SetPixel(pictureBox1.Width/2, j, Color.Blue);
    }

    // pictureBox1のImageプロパティに上記で作成したbmpを設定する
    pictureBox1.Image = bmp;
}

// button2をクリックしたとき
private void button2_Click(object sender, System.EventArgs e)
{
    // Graphicsオブジェクトの生成
    Graphics g = pictureBox1.CreateGraphics();
    // pictureBox1の真ん中から右下まで直線を描画
    g.DrawLine(Pens.Blue, pictureBox1.Width/2, pictureBox1.Height/2, pictureBox1.Width, pictureBox1.Height);			
}

上のコードでは、button1をクリックしたときにpictureBox2のParentプロパティをpictureBox1に設定し、pictureBox1上にbmpで書かれた線を設定します。
button2をクリックしたときは、pictureBox1上にGraphicsオブジェクトで直線を描画します。
button1とbutton2を押したあと、pictureBox1とpictureBox2の重なり具合によっては、bmpで描画された図形はpictureBox2と重なっている部分でも見られるのに、Graphicsオブジェクトで描画されたほうはpictureBox2と重なっている部分は見られませんでした。
このGraphicsオブジェクトで描画された部分も見たいのですが、これは可能なのでしょうか?
すみませんが、ご教授お願いいたします。

引用返信 編集キー/
■22823 / inTopicNo.2)  Re[1]: Graphicsオブジェクトの透過の問題について
□投稿者/ 欧米か (1回)-(2008/08/02(Sat) 18:45:58)
2008/08/02(Sat) 19:04:21 編集(投稿者)

VB/C#での透過処理は面倒ですよ。


引用返信 編集キー/
■22826 / inTopicNo.3)  Re[2]: Graphicsオブジェクトの透過の問題について
□投稿者/ C#プログラマー (2回)-(2008/08/02(Sat) 20:28:32)
No22823 (欧米か さん) に返信
欧米かさん、返信ありがとうございます。

確かにたくさんプログラミング言語がある中で、どうしてC#じゃないとダメなんだ、ということもあると思いますが、初めてはじめたプログラミング言語がC#で、C#も全然できないうちにほかの言語を勉強する気になれなくて・・・。とりあえず、限界を感じるまでC#で行ってみます。

ところで、質問した件なのですが、実は、なんとか実現出来そうになったので報告します。
先ほどはpictureBox1とpictureBox2にGraphicsオブジェクトで直接描画していたのですが、先ほどインターネットで情報を探していたら、BitmapオブジェクトにGraphicsオブジェクトで描画する(表現が正しいのか分かりません)方法があったので、それを試してみたら出来ました!
これならGraphicsオブジェクトのDrawLineとか使用して図形の描画が出来ますし、BitmapオブジェクトなのでpictureBox1のImageプロパティに設定して、pictureBox2を透過させて表示させることが出来ます。

実は、簡単なシミュレーションソフトみたいなのを作りたくて、シミュレーション結果と座標軸を同じPictureBoxに表示させてたのですが、時間経過で画面を更新するたびに座標軸も一緒に描画させると、画面いっぱいに座標軸を描画させているので画面がチカチカしてしまっていました。そこで、始めに座標軸だけを下のPictureBoxに表示させておいて、上に重ねたPictureBoxにGraphicsオブジェクトで描画したかったんです。
Bitmapオブジェクトが透過することは分かったのですが、Graphicsオブジェクトで描画した図形をBitmapオブジェクトに変換する方法がなかなか見つからなかったので、Graphicsオブジェクトを透過させる方法を探しておりました。

ちょっと文章が長くなってしまいましたが、最後に、「Graphicsオブジェクトで描画した図形がとりあえず透過出来たコード」を載せておきます。(timer1コントロールを追加しました。)



// グローバルのGraphicsオブジェクトとint型変数を宣言
Graphics graphics;
int x;

// button1を押したとき
private void button1_Click(object sender, System.EventArgs e)
{
  // ビットマップオブジェクトの生成
  Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
  // 生成されたビットマップオブジェクトを元にグラフィクスオブジェクトの生成
  Graphics g = Graphics.FromImage(bmp);
  // 原点座標を移動
  g.TranslateTransform(pictureBox1.Width/2, pictureBox1.Height/2);
  // 原点を通る座標軸を描画
  g.DrawLine(Pens.Blue, -picBoxWidth/2, 0, picBoxWidth/2, 0);
  g.DrawLine(Pens.Blue, 0, -picBoxHeight/2, 0, picBoxHeight/2);

  g.Dispose(); // リソースを開放
  pictureBox1.Image = bmp; // Bitmapオブジェクトを設定
}

// button2を押したとき
private void button2_Click(object sender, System.EventArgs e)
{
  // pictureBox2のGraphicsオブジェクトを生成
  graphics = pictureBox2.CreateGraphics();

  // timer1のEnabledプロパティを設定する
  if(timer1.Enabled == false)
  {
    // 無効の場合は有効
    timer1.Enabled= true;
  }
  else
  {
    // 有効の場合は無効
    timer1.Enabled = false;
  }
}

// timer1_Tickイベント
private void timer1_Tick(object sender, System.EventArgs e)
{
  // pictureBox2をクリア
  pictureBox2.Refresh();
  // x座標を更新
  x += 10;
  // 黒い円を描く
  graphics.FillEllipse(Brushes.Black, x, 10, 30,30);
}



結果的に自己完結してしまいましたが、どうもありがとうございました。お騒がせしました。
また、困ったことがあったらよろしくお願いします。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -