2012-04-10 21 views
3

私はアプリケーションの画像ビューアを作成しています。私はWindows上で、.Netを使用していますドラッグ中に矩形領域をハイライト表示

私のアプリでは、私はドラッグ中に特定の領域を強調表示しようとしています。 私は長方形を作成しました。

Rectangle areaRect = new Rectangle(100,100, 300, 300); 
Point ptOld = new Point(0, 0); 
Pen rectPen = new Pen(Brushes.White, 3); 

protected override void OnPaint(PaintEventArgs e) 
{ 
    Graphics dcPaint = e.Graphics; 
    dcPaint.DrawRectangle(rectPen, areaRect); 
} 

ここでマウスの動きとともにこの長方形の領域をドラッグしています。私はこの時点まで、私のマウス

void MoveRect(Point point) 
{ 
Graphics grfxClient = CreateGraphics(); 
Rectangle tempRectangle = new Rectangle(areaRect.Left, areaRect.Top, areaRect.Width, areaRect.Height); 
grfxClient.DrawRectangle(rectPen, tempRectangle); 
this.Invalidate(); 
grfxClient.Dispose(); 
} 

マイコードと一緒に、この矩形を移動しようとしています

ここ
protected override void OnMouseMove(MouseEventArgs e) 
{ 
Point ptNew = new Point(e.X, e.Y); 
int dx = ptNew.X - ptOld.X; 
int dy = ptNew.Y - ptOld.Y; 
areaRect.Offset(dx, dy); 
MoveRect(ptNew); 
ptOld = ptNew; 
} 

が正常に動作しています。 今度は、逆ドラッグ領域(ドラッグ領域外の領域)を暗くしたいと思います。この領域内にある領域がドラッグ中に強調表示されるはずです。

どのように進めるか。

ありがとうございました。

-Pankaj

答えて

4

私はあなたが四角形の外側を覆っており、それが暗く見えるように半透明のSolidBrushでそれを埋めるRegionオブジェクトを作成することによって、それを行うことができたとします。

グラフィックを作成してOnMouseMoveイベントで描画する必要はありませんが、矩形をシフトして、描画しているコントロールのサーフェスを無効にするだけです。

私は多かれ少なかれ、このようなルックスを使用したコード:

Rectangle areaRect = new Rectangle(100,100, 300, 300); 
Point ptOld = new Point(0, 0); 
Pen rectPen = new Pen(Brushes.White, 3); 

//A new field with a semi-transparent brush to paint the outside of the rectangle 
Brush dimmingBrush = new SolidBrush(Color.FromArgb(128, 0, 0, 0)); 

protected override void OnPaint(PaintEventArgs e) 
{ 
    Region outsideRegion = new System.Drawing.Region(e.ClipRectangle); 
    outsideRegion.Exclude(areaRect); 
    Graphics dcPaint = e.Graphics; 
    dcPaint.FillRegion(dimmingBrush, outsideRegion); 
    dcPaint.DrawRectangle(rectPen, areaRect); 
} 

protected override void OnMouseMove(MouseEventArgs e) 
{ 
    Point ptNew = new Point(e.X, e.Y); 
    int dx = ptNew.X - ptOld.X; 
    int dy = ptNew.Y - ptOld.Y; 
    areaRect.Offset(dx, dy); 
    ptOld = ptNew; 
    this.Invalidate(); 
} 

MoveRectという名前のメソッドは必要ありません。

今はあなたが望むように動作するようです。

提案

私はまた、いくつかの提案を持っています。あなたはそれらを使用する必要はありません、多分あなたのために役立つだろう。

あなたは上に描画するために使用されているコントロールの種類を書かれた(またはFormメソッドをオーバーライドし、その上に直接塗る)が、私はあなたがPictureBoxコントロールを使用することをお勧めし、そこから派生したカスタムコントロールを作成し、オーバーライドしていませんそのイベント。これにより、塗装工程がスムーズになり、ちらつきが防止されるはずです。それをこのように行うには:

  • は...とユーザーコントロールの追加を選択することにより、新しいユーザーコントロールを作成しのでMyPictureBox
  • 変更コントロールの親クラス、すなわち新しいコントロールに名前を付けます

    public partial class MyPictureBox : PictureBox 
    
  • 開いているファイルMyPictureBox.Designer:それは今の行を含める必要があります。CSとコメントアウトこれらの行:

    //this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
    //this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
    
  • コピー私はこの答えに投稿されたコードや追加ラインbase.OnPaint(e);OnPaint方法

  • の先頭コンパイルプロジェクト

  • あなたがすべきあなたのメインフォームのデザイナーを開くことができる、ツールボックスからMyPictureBoxコントロールをドラッグし、追加コードなしでそれを使用する

ハイライト表示された領域の動作を変更して、マウスカーソルが中央に表示されるようにすることもできます。私はそれがユーザーにとってより直感的であると思います。

コードに問題がある場合は、コメントに書いてください。私は助けてくれるでしょう:)。

+0

ありがとうございましたLucas、それはまさに私が必要としたものです。 はいこのRectangleをカスタムPictureBoxクラスの上部に作成しましたが、このRectを移動するだけでなく、完全にサイズを変更することもできます(コーナーの1つを保持) もう一度ありがとうございます。 – Pankaj

+0

私はそれが助けてうれしいです:)。あなたが私の答えを正しいと印を付けることができれば、私は感謝するでしょう:)。 –

関連する問題