質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.36%

フォーム上の背景に複数の図形の描画

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 925

score 8

フォーム上に複数の四角を動的に配置するために、ボタン入力されるたびに増減、変形、移動を行いたいのですが
私の書いたコードでは初期化の位置が悪いようで毎回一つの枠しか表示されません。

数値入力のボタンや、枠のon/offの切り替えが行われるたびにDrawFrameを呼んで、
BitmapとGraphicsを毎回初期化しているのが原因だと思うのですが、
どのように変更すればよいでしょうか?

外に出すと参照云々でエラーが出てしまい、flagで一回だけ行うなど考えてみたのですが、
ほかに何かありませんでしょうか?

        /////描画//////
        private void DrawFrame(int TP, decimal x, decimal y, decimal w, decimal h)
        {
            int X = Decimal.ToInt32(x);
            int Y = Decimal.ToInt32(y);
            int W = Decimal.ToInt32(w);
            int H = Decimal.ToInt32(h);

            Bitmap FrameCanvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);
            Graphics Frame = Graphics.FromImage(FrameCanvas);                      

            //////枠の作成//////
            Pen PenState = new Pen(Color.FromArgb(TP, R, G, B), 2);
            Frame.DrawRectangle(PenState, X, Y, W, H);
            PictureBox1.Image = FrameCanvas;

            Frame.Dispose();
            PenState.Dispose();
        }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

複数の四角

の座標を保持しておき,描画時にはその全てを描画すれば良いのではないでしょうか.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/16 10:47

    いつもありがとうございます!
    全座標を描画する発想はありませんでした!

    ですが、数が多くなると少し処理が重くなってしまったので
    もう少しほかのやり方を探してみます。。。

    キャンセル

  • 2019/10/16 10:53

    Frame.DrawRectangle(PenState, X, Y, W, H);
    の部分を四角形の個数分ループさせるだけでそんなに重くなりますか?
    (四角形の個数がとんでもなく多い?)

    キャンセル

  • 2019/10/16 11:12

    10こ20こだと全く気にならなかったのですが、10000こでやってみたら少し重くなってしまって.....

    今は背景を最初に一回読み込んでただ枠を書いているだけなのでこれでも問題ないのですが、
    カメラで撮影している画面を背景に枠を入れ込んだ場合に大丈夫なのかがいまいちわからなくて......

    と思ってたんですが杞憂だったみたいなので、全描画でやらせていただきます!!
    本当にいつもありがとうございます!

    キャンセル

0

毎回新しい画像を作っては破棄しているからだと思います。

            Bitmap FrameCanvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);

この部分を次のように変えてみてください。

            Bitmap FrameCanvas = pictureBox1.Image as Bitmap ??
                new Bitmap(PictureBox1.Width, PictureBox1.Height);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/16 11:06

    全部表示されるようにはなりましたが、移動や変形した際に前の枠も残ってしまって、画面が四角だらけになってしましました......

    ちょっとas演算子についても勉強してみます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る