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

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

ただいまの
回答率

90.51%

  • C#

    9028questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

図形の移動

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,505

seep0619

score 17

**質問内容**
図形の彩色箇所のみ移動

**要望**
図形がmousemoveのとき青→赤に変更するようになっており
赤の箇所のみマウスで移動させると赤の図形も移動するようにしたい。

**現状**
マウスで移動させると<<図形全体が移動>>し、
mouseupした時点で図形が元の位置に戻ってしまって
困っております。

どのあたりを変更すればよいか
教えて頂けたら幸いです。宜しくお願い致します。

””
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 C
{
public partial class Form1 : Form

{
// 四角形の座標List
List<Rectangle> _rects = new List<Rectangle>();

// 赤枠になっている四角形の座標List
List<Rectangle> _prev = new List<Rectangle>();
bool _isDraging = false;

Point? _diffPoint = null;
private Image canvas;

public Form1()
{
InitializeComponent();

}

public class SquareShape
{
PictureBox Owner; // 描画する先のPictureBox
Rectangle Bounds; // 位置と大きさ
Color FillColor;  // 色
private object shapeList;
}

private void Form1_Load(object sender, EventArgs e)
{

Bitmap canvas = new Bitmap(pictureBox1.Width, pictureBox1.Height);

using (Graphics g = Graphics.FromImage(canvas))
using (Pen pen = new Pen(Color.Blue))
{

Random rnd = new Random();

for (int i = 0; i < 400; i++)
{
int x = rnd.Next(i, i);
int y = rnd.Next(i, i);
Rectangle r = new Rectangle(x, y, 100, 100);

g.DrawRectangle(pen, r);
_rects.Add(r);
}
}

pictureBox1.Image = canvas;
}

private void pictureBox1_Click(object sender, EventArgs e)
{

}

private Point mousePoint;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{

if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
{
//位置を記憶する
mousePoint = new Point(e.X, e.Y);
}
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
{
List<Rectangle> hitRects = _rects.AsEnumerable()
.Where(v =>
v.X <= e.X && v.Y <= e.Y &&
(v.X + v.Width) >= e.X && (v.Y + v.Height) >= e.Y)
.Select(v => v)
.ToList();

if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
{
pictureBox1.Location = new Point(pictureBox1.Location.X + e.X, pictureBox1.Location.Y + e.Y);
pictureBox1.Refresh();
}

if (hitRects.Count > 0)
{
using (Graphics g = Graphics.FromImage(pictureBox1.Image))
{
if (_prev.Count() > 0)
{
using (Pen pen = new Pen(Color.Blue))
{
// 前回描画した赤枠を青枠に戻す
foreach (Rectangle r in _prev)
{
g.DrawRectangle(pen, r);
}
}
}

using (Pen pen = new Pen(Color.Red))
{
// 赤枠四角描画
foreach (Rectangle r in hitRects)
{
g.DrawRectangle(pen, r);
}
}

// 今回描画した赤枠座標を保存
_prev = hitRects;

// PictureBox更新
pictureBox1.Refresh();
}
}
}
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
{
//位置を記憶する
mousePoint = new Point(e.X, e.Y);

{
List<Rectangle> hitRects = _rects.AsEnumerable()
.Where(v =>
v.X <= e.X && v.Y <= e.Y &&
(v.X + v.Width) >= e.X && (v.Y + v.Height) >= e.Y)
.Select(v => v)
.ToList();

if (hitRects.Count > 0)
{
using (Graphics g = Graphics.FromImage(pictureBox1.Image))
{
if (_prev.Count() > 0)
{
using (Pen pen = new Pen(Color.Blue))
{
// 前回描画した赤枠を青枠に戻す
foreach (Rectangle r in _prev)
{
g.DrawRectangle(pen, r);
}
}
}

using (Pen pen = new Pen(Color.Red))
{
// 赤枠四角描画
foreach (Rectangle r in hitRects)
{
g.DrawRectangle(pen, r);
g.TranslateTransform(0, 120);

}
}
}

// 今回描画した赤枠座標を保存
_prev = hitRects;

// PictureBox更新
pictureBox1.Refresh();
}
}
}
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{

}

}
}

””

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

こんにちは
PicutureBoxクリック時に
①青枠BITMAP②赤枠BITMAPを別々に描画して、
ドラッグに合わせて①を②合成し、
PictureBoxに描画したらいかがでしょうか

それから、コードが凄く見ずらいです
</>のタグで囲みましょう

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • C#

    9028questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。