2012-02-21 11 views
3

朝、Winforms:ドラッグ可能な透明な四角形

私はこの時点で私の目を掴む準備ができています。 .NET 3.5でWindowsフォームを使用した基本的なイメージエディタを構築しています。私が必要とするのは「選択ツール」です。このツールは、ボタンがクリックされたときに表示される必要があり、固定サイズになり、それは透明中心としたドラッグアンドdropable長方形である必要があります。

この目的は、ユーザーが画像の一部に矩形をドラッグアンドドロップし、その時点で矩形の内側にあるものをスナップショットするために別のボタンを押すことができるという点でほぼ同じです。 (注:私はラバーバンドの矩形を必要としません、固定サイズでなければならず、フォーム全体にドラッグ可能で透明でなければなりません)。

は、私はインターネットやあらゆる使用されているいずれも可能な解決策を探してこのサイトを精練数日を費やしてきました。コントロールをドラッグ可能にすることができましたが、これは透明性に問題があります。以下は、コントロールをドラッグ可能にするコードですが、これが正しいパスであるかどうかはわかりません。

class ControlMover 
{ 
    public enum Direction 
    { 
     Any, 
     Horizontal, 
     Vertical 
    } 

    public static void Init(Control control) 
    { 
     Init(control, Direction.Any); 
    } 

    public static void Init(Control control, Direction direction) 
    { 
     Init(control, control, direction); 
    } 

    public static void Init(Control control, Control container, Direction direction) 
    { 
     EditorForm.blnSelectArea = true; 
     bool Dragging = false; 
     Point DragStart = Point.Empty; 
     control.MouseDown += delegate(object sender, MouseEventArgs e) 
     { 
      Dragging = true; 
      DragStart = new Point(e.X, e.Y); 
      control.Capture = true; 
     }; 
     control.MouseUp += delegate(object sender, MouseEventArgs e) 
     { 
      Dragging = false; 
      control.Capture = false; 
     }; 
     control.MouseMove += delegate(object sender, MouseEventArgs e) 
     { 
      if (Dragging) 
      { 
       if (direction != Direction.Vertical) 
        container.Left = Math.Max(0, e.X + container.Left - DragStart.X); 
       if (direction != Direction.Horizontal) 
        container.Top = Math.Max(0, e.Y + container.Top - DragStart.Y); 

       control.Invalidate(); 

      } 
     }; 
    } 
} 

誰でも正しい方向に向けることができます。また、どこから見てもいいですか?

多くのおかげ

答えて

6

正常に動作しますあなたが描く方法でドラッグ可能にするために私はMouseイベントを使用します。それを透明にするために、私は単に半透明のpng Imageを別のFormコントロールにして背景画像としました。

public partial class Photo : Form 
    { 
     public delegate void ScreenShotReadyDelegate(Bitmap g); 
     public event ScreenShotReadyDelegate ScreenShotReady; 

     bool Moving = false; 
     Point oldLoc = new Point(); 

     public Photo() 
     { 
      InitializeComponent(); 
      this.FormBorderStyle = FormBorderStyle.None; 
      this.DoubleBuffered = true; 
      this.SetStyle(ControlStyles.ResizeRedraw, true); 
     } 

     private void Photo_MouseDoubleClick(object sender, MouseEventArgs e) 
     { 
      this.BackgroundImage = null; 
      this.Invalidate(); 
      Rectangle bounds = this.Bounds; 
      using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height)) 
      { 
       using (Graphics g = Graphics.FromImage(bitmap)) 
       { 
        g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size); 
       } 
       ScreenShotReady(bitmap); 
      } 
      this.BackgroundImage = Properties.Resources.rect; 
      this.Invalidate(); 
     } 

     private void Photo_MouseDown(object sender, MouseEventArgs e) 
     { 
      this.Moving = true; 
      this.oldLoc = MousePosition; 
     } 

     private void Photo_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (this.Moving) 
      { 
       Point vector = new Point(MousePosition.X - this.oldLoc.X, MousePosition.Y - this.oldLoc.Y); 
       this.Location = new Point(this.Location.X + vector.X, this.Location.Y + vector.Y); 
       this.oldLoc = MousePosition; 
      } 
     } 

     private void Photo_MouseUp(object sender, MouseEventArgs e) 
     { 
      this.Moving = false; 
     } 
    } 
+0

これは私が取り組もうとしていたものであり、これから提案しようとしています。あなたは私が言いたいことをしました。 +1 – Maheep

+0

優秀、おそらく私の目は結局のところそのソケットに残ることができます!どうもありがとう! –

+0

透明な背景画像を 'rect'しますか? –

2

このPainting On Top Of Child Controls

を読んだ後、私は前に自分自身をControlPaint.DrawReversibleFrame(_FrameRect, Color.Black, FrameStyle.Dashed);を使用しているにあなたはできるはずですし、それは私がactualy働いていた画面キャプチャ用aplicationを作った:)

+0

を私はあなたの答えに感謝しますが、これは非ドラッグ可能なゴムバンドの長方形です。私は一定のサイズに設定し、その中をクリックしてページの周りをドラッグすることができる長方形を探しています。努力への情熱。 –

+2

私の悪いです。私は再びそれを読んで、私が答えを得たら戻ってきます。 – radbyx

+1

それを最初に何を描く場合、およびいくつかのdragingを検出したとき、あなたの代表者で、その後、あなたは最初に古い四角形をきれいにして、新しいものを描きますか?あなたは矩形やページをドラッグしたいですか?私は受け入れ答えは、とにかくあなたの入力のためのソリューション、感謝を供給 – radbyx

0

イメージを描画するカスタムコントロールを作成し、その上に矩形をオーバーレイするほうがよいでしょう。 マウスイベントを処理して、矩形を「移動」することができます。

いくつかの擬似コードは、あなたが始めるには:

class cropcontrol 

onpaint 
    paint image 
    paint rectangle using rect location 

onmousemove 
    if mouse down 
    update rect location 
関連する問題