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

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

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

Re[6]: 動的画像描画後の削除方法


(過去ログ 131 を表示中)

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

■77613 / inTopicNo.1)  動的画像描画後の削除方法
  
□投稿者/ Nishimura (1回)-(2015/11/08(Sun) 10:01:08)

分類:[C#] 

C#初心者(2ヶ月程度)ですが、動的描画後の削除方法がわからないの教えて頂きたいと思います。
Visual Studio 2013 C#

(コード)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TokinClick
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            System.Drawing.Point sp = System.Windows.Forms.Cursor.Position;
            System.Drawing.Point cp = this.PointToClient(sp);
            int x4 = cp.X;
            int y4 = cp.Y;
            PictureBox p = new PictureBox();
            this.Controls.Add(p);
            p.Location = new Point(x4 - 36, y4 - 39);
            p.Size = new Size(72, 78);
            p.BackColor = Color.Transparent;
            p.BackgroundImageLayout = ImageLayout.Center;
            Bitmap canvas = new Bitmap(p.Width, p.Height);
            Graphics g = Graphics.FromImage(canvas);
            Bitmap img = new Bitmap(@"C:\画像.png");
            Rectangle srcRect = new Rectangle(73, 156, 68, 82);
            Rectangle desRect = new Rectangle(0, 0, srcRect.Width, srcRect.Height);
            g.DrawImage(img, desRect, srcRect, GraphicsUnit.Pixel);
            g.Dispose();
            p.Image = canvas;
        }

    }
}


(アプル概要)
@フォームをクリックした任意の場所に動的にpictureBoxを設定。
A画像ファイルの一部をトリミングして画像イメージを作成。
BpictureBoxに画像を表示。
C次にクリックされた新たな場所に画像表示(@〜Bの処理)
ここで質問の以前に表示した画像を削除する必要が出てきました。

この削除をする良い方法を教えて頂きたい。
よろしくお願い致します。



引用返信 編集キー/
■77615 / inTopicNo.2)  Re[1]: 動的画像描画後の削除方法
□投稿者/ Azulean (535回)-(2015/11/08(Sun) 16:08:15)
No77613 (Nishimura さん) に返信
> PictureBox p = new PictureBox();
> this.Controls.Add(p);

「動的に描画する」と表現されていることは、「PictureBox を新しく追加して、フォームに追加する」というこの2行が中心です。
すでにあるものを消すためには、p に入っていた PictureBox の参照を this.Controls.Remove(p) で消し、かつ、p に Dispose が必要です。

ただ、今、あなたは p を保持できていません。
Click ごとに違う p になっており、前回の p を参照して消すことができないようになっています。

1つしか常に置かないのであれば、 p をフィールド変数(メンバー変数)で保持してください。
複数配置を認めつつ、条件によりクリアするのであれば、 p をリスト(List)などでまとめてフィールド変数で保持してください。

サンプルを示しても良いのですが、フィールド変数とは何かを一度学んでみてからでも遅くないかと。
引用返信 編集キー/
■77618 / inTopicNo.3)  Re[2]: 動的画像描画後の削除方法
□投稿者/ Nishimura (2回)-(2015/11/09(Mon) 09:49:04)
No77615 (Azulean さん) に返信
> ■No77613 (Nishimura さん) に返信
>>            PictureBox p = new PictureBox();
>>            this.Controls.Add(p);
> 
> 「動的に描画する」と表現されていることは、「PictureBox を新しく追加して、フォームに追加する」というこの2行が中心です。
> すでにあるものを消すためには、p に入っていた PictureBox の参照を this.Controls.Remove(p) で消し、かつ、p に Dispose が必要です。
> 
> ただ、今、あなたは p を保持できていません。
> Click ごとに違う p になっており、前回の p を参照して消すことができないようになっています。
> 
> 1つしか常に置かないのであれば、 p をフィールド変数(メンバー変数)で保持してください。
> 複数配置を認めつつ、条件によりクリアするのであれば、 p をリスト(List)などでまとめてフィールド変数で保持してください。
> 
> サンプルを示しても良いのですが、フィールド変数とは何かを一度学んでみてからでも遅くないかと。


返信ありがとうございます。
フィールド変数を定義し一部コードを追加しましたが上手くいきません。コメント方よろしくお願いします。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TokinClick
{
    public partial class Form1 : Form
    {
        public int sw = 0;         // 追加
        public object px;          // 追加


        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            if (sw != 0)                        //  追加
            {
                this.Controls.Remove(px);       //  追加
                px.Dispose();                   //  追加
            }

            System.Drawing.Point sp = System.Windows.Forms.Cursor.Position;
            System.Drawing.Point cp = this.PointToClient(sp);
            int x4 = cp.X;
            int y4 = cp.Y;
            PictureBox p = new PictureBox();
            this.Controls.Add(p);
            p.Location = new Point(x4 - 36, y4 - 39);
            p.Size = new Size(72, 78);
            p.BackColor = Color.Transparent;
            p.BackgroundImageLayout = ImageLayout.Center;
            Bitmap canvas = new Bitmap(p.Width, p.Height);
            Graphics g = Graphics.FromImage(canvas);
            Bitmap img = new Bitmap(@"C:\画像.png");
            Rectangle srcRect = new Rectangle(73, 156, 68, 82);
            Rectangle desRect = new Rectangle(0, 0, srcRect.Width, srcRect.Height);
            g.DrawImage(img, desRect, srcRect, GraphicsUnit.Pixel);
            g.Dispose();
            p.Image = canvas;

            sw = 1;       //  追加
            px = p;       //  追加
        }

    }
}

引用返信 編集キー/
■77622 / inTopicNo.4)  Re[3]: 動的画像描画後の削除方法
□投稿者/ furu (33回)-(2015/11/09(Mon) 12:36:29)
No77618 (Nishimura さん) に返信
> フィールド変数を定義し一部コードを追加しましたが上手くいきません。コメント方よろしくお願いします。

どう上手くいかないの?
引用返信 編集キー/
■77624 / inTopicNo.5)  Re[4]: 動的画像描画後の削除方法
□投稿者/ Nishimura (3回)-(2015/11/09(Mon) 13:20:24)
No77622 (furu さん) に返信
> ■No77618 (Nishimura さん) に返信
>>フィールド変数を定義し一部コードを追加しましたが上手くいきません。コメント方よろしくお願いします。
>
> どう上手くいかないの?



this.Controls.Remove(px); // 追加
px.Dispose(); // 追加

がエラーで前の画像を削除出来ません。

(参考)
エラー 1 'System.Windows.Forms.Control.ControlCollection.Remove(System.Windows.Forms.Control)' に最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。 C:\Users\ns6r\Documents\Visual Studio 2013\Projects\TokinClick\TokinClick\Form1.cs 33 17 TokinClick
エラー 2 引数 1: 'object' から 'System.Windows.Forms.Control' に変換できません C:\Users\ns6r\Documents\Visual Studio 2013\Projects\TokinClick\TokinClick\Form1.cs 33 38 TokinClick
エラー 3 'object' に 'Dispose' の定義が含まれておらず、型 'object' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。 C:\Users\ns6r\Documents\Visual Studio 2013\Projects\TokinClick\TokinClick\Form1.cs 34 20 TokinClick


引用返信 編集キー/
■77626 / inTopicNo.6)  Re[5]: 動的画像描画後の削除方法
□投稿者/ furu (34回)-(2015/11/09(Mon) 13:40:13)
No77624 (Nishimura さん) に返信
> this.Controls.Remove(px); // 追加
> px.Dispose(); // 追加
>
> がエラーで前の画像を削除出来ません。

「エラーで…出来ません。」と書かれると実行中のエラーのようですが
実際のエラーはコンパイル(ビルド)時のエラーだったのですね。

「'System.Windows.Forms.Control' に変換できません」とありますので
変数pの型は、objectではなく、System.Windows.Forms.Controlにしては
どうですか?

引用返信 編集キー/
■77776 / inTopicNo.7)  Re[6]: 動的画像描画後の削除方法
□投稿者/ Nishimura (4回)-(2015/11/22(Sun) 12:30:39)
No77626 (furu さん) に返信
> ■No77624 (Nishimura さん) に返信
>> this.Controls.Remove(px); // 追加
>> px.Dispose(); // 追加
>>
>>がエラーで前の画像を削除出来ません。
>
> 「エラーで…出来ません。」と書かれると実行中のエラーのようですが
> 実際のエラーはコンパイル(ビルド)時のエラーだったのですね。
>
> 「'System.Windows.Forms.Control' に変換できません」とありますので
> 変数pの型は、objectではなく、System.Windows.Forms.Controlにしては
> どうですか?
>


public object px; を  public PictureBox px;  に変更し問題解決しました。
有り難うございました。





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


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

このトピックに書きこむ

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

管理者用

- Child Tree -