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

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

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

Re[1]: 描画と消去につて


(過去ログ 21 を表示中)

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

■8915 / inTopicNo.1)  描画と消去につて
  
□投稿者/ yuki (1回)-(2007/10/13(Sat) 14:55:50)

分類:[C#] 

C#の初心者です。pictureBoxに描画するのとFormに直接描画した場合では、どのような面で異なるのでしょうか?
また、描画した画像を消去するコードは、pictureBoxの場合は、pictureBox.imge=null;ですが、Formに対して描画した画像を消すにはどのようにコーディングしたらよいのでしょか?
引用返信 編集キー/
■8917 / inTopicNo.2)  Re[1]: 描画と消去につて
□投稿者/ 渋木宏明(ひどり) (466回)-(2007/10/13(Sat) 15:58:39)
渋木宏明(ひどり) さんの Web サイト
> C#の初心者です。pictureBoxに描画するのとFormに直接描画した場合では、どのような面で異なるのでしょうか?

本質的には何も変わりありません。

> また、描画した画像を消去するコードは、pictureBoxの場合は、pictureBox.imge=null;ですが、

それだと、「PictureBox に描画」している場合、ウィンドウの重なりが変化した時なんかに再描画が発生して、みっともないことになりませんか?

> Formに対して描画した画像を消すにはどのようにコーディングしたらよいのでしょか?

PictureBox でも Form でも「地色で塗りつぶす」か「(自前の)再描画を抑制したうえで、Control.Update() や Form.Update() を呼び出す」ます。

が、僕はこの「直接描画する」という手法が大キライです。

必要なサイズの Bitmap を new して その Btimap に描画を行い、描画結果である「絵」が描かれた Bitmap を PictureBox.Image に設定するのが楽だし汎用性も高いと思います。

この場合は、描画結果を「ちゃら」にするのに PictureBox.Image = null とするも間違いではありません。



引用返信 編集キー/
■8918 / inTopicNo.3)  Re[1]: 描画と消去につて
□投稿者/ IIJIMAS (44回)-(2007/10/13(Sat) 16:04:30)
2007/10/13(Sat) 16:06:38 編集(投稿者)

No8915 (yuki さん) に返信
> C#の初心者です。pictureBoxに描画するのとFormに直接描画した場合では、どのような面で異なるのでしょうか?
> また、描画した画像を消去するコードは、pictureBoxの場合は、pictureBox.imge=null;ですが、Formに対して描画した画像を消すにはどのようにコーディングしたらよいのでしょか?

Formなどのコントロールに直接描画するにはPaintイベントのたびに自分で
Graphicsクラス:ハンドラの引数のPaintEventArgs.Graphics プロパティ
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.painteventargs.graphics(VS.80).aspx
などを使用して描画します。
OnPaintメソッドか、Paintイベントのハンドラに描画ルーチンを書きます。
この場合「消す」ためには、この描画ルーチンで何もしなければいいだけです。

PictureBoxは「描画」というよりも既存の画像を「表示」するためのコントロールという感じです。(もちろんコントロールなので直接描画もできますが…)
PictureBox.Image プロパティ
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.picturebox.image(VS.80).aspx

#かぶってしまいました…でも、あえて消しません…
引用返信 編集キー/
■8923 / inTopicNo.4)  Re[2]: 描画と消去につて
□投稿者/ yuki (2回)-(2007/10/13(Sat) 22:18:52)
No8918 (IIJIMAS さん) に返信
> 2007/10/13(Sat) 16:06:38 編集(投稿者)
> OnPaintメソッドか、Paintイベントのハンドラに描画ルーチンを書きます。
> この場合「消す」ためには、この描画ルーチンで何もしなければいいだけです。
すみません。具体的なコードをおしえていただけますか。
引用返信 編集キー/
■8924 / inTopicNo.5)  Re[3]: 描画と消去につて
□投稿者/ IIJIMAS (45回)-(2007/10/13(Sat) 22:49:13)
2007/10/13(Sat) 22:56:33 編集(投稿者)
2007/10/13(Sat) 22:53:04 編集(投稿者)
No8923 (yuki さん) に返信
> ■No8918 (IIJIMAS さん) に返信
>>2007/10/13(Sat) 16:06:38 編集(投稿者)
>>OnPaintメソッドか、Paintイベントのハンドラに描画ルーチンを書きます。
>>この場合「消す」ためには、この描画ルーチンで何もしなければいいだけです。
> すみません。具体的なコードをおしえていただけますか。

すいません、書くべきことが足りませんでしたね。
渋木宏明(ひどり) 様の仰せの通り、Control.Update メソッドやControl.Invalidate メソッド等を使用することで「再描画」が起きます。
このときにPaintイベントが発生し、OnPaintメソッドが呼び出されます。
ここに何も書いていなければ何も描画されません。
ここにに描画ルーチンが書いてあれば描画されます。
この方法の場合、コントロールに何かが「描かれている状態」というのは「必要な都度再描画している状態」なのです。

前の私の投稿ではったMSDNライブラリのページや関連のページはご覧になりましたでしょうか。
そこにあるサンプルコードはお試しになりましたでしょうか。

また、渋木宏明(ひどり) 様がご推奨されているPictureBox.Image プロパティを使用する方法はご検討されてはいないのでしょうか。
Graphics.FromImage メソッド
http://msdn2.microsoft.com/ja-jp/library/system.drawing.graphics.fromimage(VS.80).aspx
を使用して描画したBitmapをPictureBox.Image プロパティに設定するだけで、再描画の心配をしなくて済みますし、消すのもnullを設定することでよいはずなのですが。。。

#私の前の投稿での表現が悪かったのかも…だとしたらすいませんでした。
引用返信 編集キー/
■8927 / inTopicNo.6)  Re[4]: 描画と消去につて
□投稿者/ yuki (3回)-(2007/10/14(Sun) 09:29:51)
No8924 (IIJIMAS さん) に返信
> #私の前の投稿での表現が悪かったのかも…だとしたらすいませんでした。

とんでもありません。愚鈍な頭で理解がおぼつかず申し訳ありません。
下記に、マウスイベントで四角形を描画するサンプルを記述しましたが、この画像をbuttonで消去したいと思ってますが

最終行のprivate void button1_Click(object sender, EventArgs e)にはどのようなコードを記述したらよいのでしょうか?


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace WindowsApplication8
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Rectangle RcDraw;
private float PenWidth = 5;







private void Form1_MouseDown_1(object sender, MouseEventArgs e)
{
// Determine the initial rectangle coordinates...

RcDraw.X = e.X;
RcDraw.Y = e.Y;
}

private void Form1_MouseUp_1(object sender, MouseEventArgs e)
{
// Determine the width and height of the rectangle...

if (e.X < RcDraw.X)
{
RcDraw.Width = RcDraw.X - e.X;
RcDraw.X = e.X;
}
else
{
RcDraw.Width = e.X - RcDraw.X;
}

if (e.Y < RcDraw.Y)
{
RcDraw.Height = RcDraw.Y - e.Y;
RcDraw.Y = e.Y;
}
else
{
RcDraw.Height = e.Y - RcDraw.Y;
}

// Force a repaint of the region occupied by the rectangle...

this.Invalidate(RcDraw);

}

private void Form1_Paint_1(object sender, PaintEventArgs e)
{

// Draw the rectangle...

e.Graphics.DrawRectangle(new Pen(Color.Blue, PenWidth), RcDraw);

}

private void button1_Click(object sender, EventArgs e)
{

}


}

}
引用返信 編集キー/
■8928 / inTopicNo.7)  Re[5]: 描画と消去につて
□投稿者/ IIJIMAS (46回)-(2007/10/14(Sun) 10:30:07)
2007/10/14(Sun) 10:30:56 編集(投稿者)
No8927 (yuki さん) に返信
> 下記に、マウスイベントで四角形を描画するサンプルを記述しましたが、この画像をbuttonで消去したいと思ってますが
> 
>  最終行のprivate void button1_Click(object sender, EventArgs e)にはどのようなコードを記述したらよいのでしょうか?

”消去”するのはPaintのハンドラで描画ロジックを書かずにInvalidateすればよいのです。
例えばこんな感じでどうでしょうか。

bool doDrawFlag = true;

private void Form1_Paint_1(object sender, PaintEventArgs e)
{
    if (doDrawFlag)
    {
        e.Graphics.DrawRectangle(new Pen(Color.Blue, PenWidth), RcDraw);

    }
    else {
        doDrawFlag = true;
    }
}

private void button1_Click(object sender, EventArgs e)
{
    doDrawFlag = false;
    this.Invalidate();
}

引用返信 編集キー/
■8930 / inTopicNo.8)  Re[6]: 描画と消去につて
□投稿者/ yuki (4回)-(2007/10/14(Sun) 13:58:05)
No8928 (IIJIMAS さん) に返信


ありがとうございました。お陰様で無事解決しました。
this.Invalidate();とは、どのような意味なのでしょうか?
もしよろしかったらおしえてください。
引用返信 編集キー/
■8935 / inTopicNo.9)  Re[7]: 描画と消去につて
□投稿者/ IIJIMAS (49回)-(2007/10/14(Sun) 15:36:38)
No8930 (yuki さん) に返信

MSDNライブラリにある説明はご覧にならなかったのでしょうか。
Control.Invalidate メソッド
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.control.invalidate(VS.80).aspx

未知の語句やプログラミング要素を意味や使い方を知りたい場合は、
まずはMSDNライブラリ(ヘルプ)をご参照ください。
または検索サイトでそのキーワードをもとに検索してしまうの手です。
見つけたTIPSサイトのリンクをとっておくのもよいでしょう。
場合によっては書籍に探している情報がある場合もあります。
まずはそれらから答えがないか情報を探してからの方が、
掲示板で質問して返信が来るのを待つよりも早く解決する場合があります。
引用返信 編集キー/
■8939 / inTopicNo.10)  Re[8]: 描画と消去につて
□投稿者/ sin (3回)-(2007/10/14(Sun) 18:30:48)
No8935 (IIJIMAS さん) に返信
> 未知の語句やプログラミング要素を意味や使い方を知りたい場合は、
> まずはMSDNライブラリ(ヘルプ)をご参照ください。
> または検索サイトでそのキーワードをもとに検索してしまうの手です。
> 見つけたTIPSサイトのリンクをとっておくのもよいでしょう。
> 場合によっては書籍に探している情報がある場合もあります。
> まずはそれらから答えがないか情報を探してからの方が、
> 掲示板で質問して返信が来るのを待つよりも早く解決する場合があります。
 仰せの通りです。今後気をつけたいと思います。
解決済み
引用返信 編集キー/
■8940 / inTopicNo.11)  Re[9]: 描画と消去につて
□投稿者/ IIJIMAS (50回)-(2007/10/14(Sun) 19:25:26)
No8939 (sin さん) に返信
??
このスレの質問者の方なのですか?

…であれば、あまりハンドル名をころころ変えない方がよいと思います。
…でなければ、勝手に「解決済み」にしてよいのでしょうか。
引用返信 編集キー/
■8958 / inTopicNo.12)  Re[10]: 描画と消去につて
□投稿者/ yuki (5回)-(2007/10/15(Mon) 15:11:54)
No8940 (IIJIMAS さん) に返信
> ■No8939 (sin さん) に返信
> ??
> このスレの質問者の方なのですか?
>
> …であれば、あまりハンドル名をころころ変えない方がよいと思います。
> …でなければ、勝手に「解決済み」にしてよいのでしょうか。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -