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

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

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

Re[2]: マウスが移動中の矩形描画


(過去ログ 101 を表示中)

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

■60074 / inTopicNo.1)  マウスが移動中の矩形描画
  
□投稿者/ anny (9回)-(2011/06/18(Sat) 22:55:22)

分類:[C#] 

開発環境
Windows7 
Visual C# 2010

いつもお世話になっております.
Windowsのペイントで四角形を描画するように,マウスの移動中も四角形を描画したいのですが,
マウスの移動中の軌跡全てを描画させることしかできません.(四角形がたくさんできる)
全ての軌跡ではなく,表示されている状態の四角形は常に一つになるようにするにはどうしたらいいでしょうか.

以下現状のソースコードです.よろしくお願い致します.

 Pen my_pen;
 int start = 0;  // 1 = 描画中        
 int start_X;     // X 起点
 int start_Y;     //  Y 起点
 private static int move_x, move_y; //移動中のマウスの座標

 protected void pictureBox1_MouseDown(object sender, MouseEventArgs e)       
{
   my_pen.Color == Color.Black;
      my_pen.Width = 1;
      start = 1;
      start_X = e.X;
      start_Y = e.Y;
      rect_x = start_X;
      rect_y = start_Y;
}
 private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
 {                 
      move_x = e.X;
      move_y = e.Y;
      pictureBox01.Refresh();
}
        
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
      start = 0;     
      pictureBox01.DrawRectangle(my_pen, rect_x, rect_y, e.X-rect_x, e.Y-rect_y);
      pictureBox01.Refresh();
}

private void pictureBox01_Paint(object sender, PaintEventArgs e)
{
      pictureBox01.DrawRectangle(my_pen, rect_x, rect_y, move_x - rect_x, move_y - rect_y);            
}

引用返信 編集キー/
■60078 / inTopicNo.2)  Re[1]: マウスが移動中の矩形描画
□投稿者/ 魔界の仮面弁士 (2228回)-(2011/06/19(Sun) 04:13:30)
No60074 (anny さん) に返信
> Windowsのペイントで四角形を描画するように,マウスの移動中も四角形を描画したいのですが,
提示されたソースにある、pictureBox1 と pictureBox01 の関係がわかりません。
この 2 つはどのような関係にあるのでしょうか?

最初は、PictureBox が 2 つあるのかとも思ったのですが、
pictureBox01 の方は DrawRectangle メソッドを有しているため、
次に想像したのは、pictureBox01 が Graphics クラスという可能性でした。

しかし、それだと pictureBox01.Refresh(); という行が矛盾するので、
結局、どのようなコードなのかを読み取りきれませんでした…。


> 以下現状のソースコードです.よろしくお願い致します.
本当は現状のコードとは異なりますよね? これでは動かないはずですし。


>         private static int move_x, move_y; //移動中のマウスの座標
static にしている理由は何ですか?


>  protected void pictureBox1_MouseDown(object sender, MouseEventArgs e)       
通常は private な pictureBox1_MouseDown を、わざわざ protected に
変更しているのは、どのような意図があるのでしょか?


>    my_pen.Color == Color.Black;
my_pen のインスタンスを得ている箇所が無いのは兎も角として…上記は比較動作ですか?
四角形がたくさんできるどころか、そもそもコンパイルエラー(CS0201) になってしまうと思うのですけれども。
(現状のコードには、この記述は無いですよね?)

>       start_X = e.X;
>       start_Y = e.Y;
>       rect_x = start_X;
>       rect_y = start_Y;
rect_x/y の変数宣言が漏れているのは兎も角として…start_X/Y は何をするための変数ですか?
start_X/Y が他で使われている様子も無いですし、rect_x/y と同じ値が入っているようなので、
存在意義が読み取れませんでした。


> 全ての軌跡ではなく,表示されている状態の四角形は常に一つになるようにするにはどうしたらいいでしょうか.
元のコードの意図が読み取りきれていないので、やりたい事に合致しているかどうかは分かりませんが:


Point? pos;
Rectangle rect;

protected void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    pos = e.Location;
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (pos != null)
    {
        Point a = pos.Value;
        Point b = e.Location;
        rect = Rectangle.FromLTRB(
            Math.Min(a.X, b.X), Math.Min(a.Y, b.Y),
            Math.Max(a.X, b.X), Math.Max(a.Y, b.Y));
        ((Control)sender).Invalidate();
    }
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    ((Control)sender).Update();
    pos = null;
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    if (pos != null)
    {
        e.Graphics.DrawRectangle(Pens.Black, rect);
    }
}

引用返信 編集キー/
■60079 / inTopicNo.3)  Re[1]: マウスが移動中の矩形描画
□投稿者/ やじゅ (1919回)-(2011/06/19(Sun) 04:36:45)
やじゅ さんの Web サイト
No60074 (anny さん) に返信
> 開発環境
> Windows7
> Visual C# 2010
>
> いつもお世話になっております.
> Windowsのペイントで四角形を描画するように,マウスの移動中も四角形を描画したいのですが,
> マウスの移動中の軌跡全てを描画させることしかできません.(四角形がたくさんできる)
> 全ての軌跡ではなく,表示されている状態の四角形は常に一つになるようにするにはどうしたらいいでしょうか.

XOR描画なるものがありまして、これは「同じ図形を同じ位置に2回描画すると、すべてのピクセルは元の色に戻る」という性質があります。
ControlPaint.DrawReversibleFrame メソッド を使うとXOR描画が出来ます。

キーワードとして「ラバーバンド C#」などで検索するといいと思います。

参照:
ラバー バンド四角形またはフォーカスの長方形を描画する Visual C# でする方法
http://support.microsoft.com/kb/314945/ja
http://dobon.net/vb/dotnet/graphics/drawcontrols.html
引用返信 編集キー/
■60281 / inTopicNo.4)  Re[2]: マウスが移動中の矩形描画
□投稿者/ anny (10回)-(2011/06/26(Sun) 14:53:43)
2011/06/26(Sun) 14:54:11 編集(投稿者)
2011/06/26(Sun) 14:54:04 編集(投稿者)

魔界の仮面弁士様,やじゅ様:
大変遅くなりましたが,回答いただきありがとうございました.

魔界の仮面弁士様のご指摘にありましたが,実際に動作させたプログラムとは違うものでした.
(質問した以外の処理もさせていたので,必要な分だけここに載せたかったのです)
さらに,私が必要な分を抜粋する際に,勘違いしていたところがあって混乱させてしまいました.
申し訳ありませんでした.

質問した内容についてですが,魔界の仮面弁士様が回答してくださったソースコードを参考に無事解決することができました.
ありがとうございます.


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


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

このトピックに書きこむ

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

管理者用

- Child Tree -