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

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

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

Re[3]: ピクチャボックスへの再描画


(過去ログ 94 を表示中)

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

■56336 / inTopicNo.1)  ピクチャボックスへの再描画
  
□投稿者/ anny (6回)-(2011/01/11(Tue) 02:48:59)

分類:[C#] 

開発環境
Windows 7
Visual C# 2008

いつもお世話になっております.

ピクチャボックスの最初の状態を記憶しておく→そのピクチャボックスにマウスイベントで描画する
→ボタンを押すと最初の状態に戻る

という処理をしたいのですが,ボタンを押しても最初の状態に戻りません.
以下の bmp=new Bitmap(pictureBox01.Image); という部分で初期状態を記憶しているつもりなのですが,実際にはできていない気がします.
どうすればうまくいくでしょうか?

以下ソースコードです.よろしくお願いします.
grfxに対してマウスイベントで描画していますが,その部分は省いてあります.

Bitmap bmp;
public static Graphics grfx;
protected void Orig_Load(object sender, EventArgs e)        
{               
      pictureBox01.Image = new Bitmap(Screen.PrimaryScreen.WorkingArea.Width,Screen.PrimaryScreen.WorkingArea.Height);
      grfx = Graphics.FromImage(pictureBox1.Image) ;
      bmp=new Bitmap(pictureBox01.Image);
}

private void paint(Graphics g)
{
      g.DrawImage(bmp, 0, 0);
}

private void button13_Click_1(object sender, EventArgs e)
{
      this.paint(grfx);
}

private void pictureBox01_Paint(object sender, PaintEventArgs e)
{
      this.paint(e.Graphics);
}

引用返信 編集キー/
■56337 / inTopicNo.2)  Re[1]: ピクチャボックスへの再描画
□投稿者/ Azulean (676回)-(2011/01/11(Tue) 07:01:51)
No56336 (anny さん) に返信
> 以下ソースコードです.よろしくお願いします.
> grfxに対してマウスイベントで描画していますが,その部分は省いてあります.

とりあえず、このコードで感じた問題点を列挙しておきます。

・grfx が static になっていますが、static である必要はないのでは?

・ボタンを押したときも、pictureBox01 が再描画されるとき(Paint イベント)も、bmp で上書きしています。
 マウスイベントで pictureBox01 に対して Refresh したときも同じ場所を通っているはずですので、ブレークポイントで確認してください。
 (今の元に戻らない問題をなおしたときに、線が描けないバグになりますよ)

・Load イベントで作成した Bitmap は透明な状態です。
 透明な状態の Bitmap を上書きで DrawImage しても、やはり透明なので何も起きません。


単純に内容を消したいだけなら、g.Clear(Color.Transparent) をした後に Refresh あたりで何とかなるかどうか。
ある時点のバックアップにはなりませんが。
引用返信 編集キー/
■56338 / inTopicNo.3)  Re[1]: ピクチャボックスへの再描画
□投稿者/ shu (348回)-(2011/01/11(Tue) 08:02:41)
No56336 (anny さん) に返信

> ピクチャボックスの最初の状態を記憶しておく
最初とはどんな状態?

>→そのピクチャボックスにマウスイベントで描画する
何を描画する?


ピクチャボックスに表示するImageが2つあってそれを切り替えるなら
Image型のprivate変数を2つ用意してそれをImageプロパティにそれぞれの
イベントにて設定すればいい気がする。
引用返信 編集キー/
■56361 / inTopicNo.4)  Re[2]: ピクチャボックスへの再描画
□投稿者/ anny (7回)-(2011/01/11(Tue) 22:06:04)
Azulean様,shu様,回答ありがとうございます.

最初の状態という曖昧な表現をして申し訳ありません.
あるBitmapが表示された状態を最初の状態と呼んでいます.

頂いたアドバイスを元に書き直したところ,自分のやりたいように動かすことができました.


初期状態で描画しておきたい図をBitmap型の変数に格納.
 Bitmap temp = new Bitmap(CurrentDir+"\\Image01.jpg");

上書き用のBitmapも作成.
 Bitmap temp2 = new Bitmap(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
 for (int x = 0; x < Screen.PrimaryScreen.WorkingArea.Width; x++)
  {
         for (int y = 0; y < Screen.PrimaryScreen.WorkingArea.Height; y++)
         {
              temp2.SetPixel(x, y, Color.White);    //透明ではなく白に
         }
  }

ボタンのクリックイベントで
 grfx.DrawImage(temp2, 0, 0);
  grfx.DrawImage(temp, 10, 10);

としました.
上書き用のBitmap作成部分ですべてのピクセルをWhiteに設定しているのですが,もう少しスマートにならないでしょうか?

引用返信 編集キー/
■56362 / inTopicNo.5)  Re[3]: ピクチャボックスへの再描画
□投稿者/ Azulean (677回)-(2011/01/11(Tue) 22:22:14)
No56361 (anny さん) に返信
> 上書き用のBitmap作成部分ですべてのピクセルをWhiteに設定しているのですが,もう少しスマートにならないでしょうか?

(私の先の投稿で存在を示唆していますが)Graphics.Clear のヘルプを読みましたか?
引用返信 編集キー/
■56363 / inTopicNo.6)  Re[3]: ピクチャボックスへの再描画
□投稿者/ shu (351回)-(2011/01/11(Tue) 22:27:09)
No56361 (anny さん) に返信

>
> としました.
> 上書き用のBitmap作成部分ですべてのピクセルをWhiteに設定しているのですが,もう少しスマートにならないでしょうか?
Azuleanさんの返信内容にもありますがGraphicsにはClear(<Color>)というメソッドがあります。
この場合
grfx.Clear(Color.White);

引用返信 編集キー/
■56364 / inTopicNo.7)  Re[4]: ピクチャボックスへの再描画
□投稿者/ anny (8回)-(2011/01/11(Tue) 22:41:25)
Azulean様,shu様,再度回答ありがとうございます.

>(私の先の投稿で存在を示唆していますが)Graphics.Clear のヘルプを読みましたか?

ヘルプを読んだ時点では今回のケースとの関係性に気づけませんでしたが,お二人の今回のアドバイスでやっと繋がりました.
非常に助かります.ありがとうございました.
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -