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);
}

今、この長方形の領域をマウスの動きに合わせてドラッグしています。

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;
}

ここで、この四角形をマウスと一緒に移動しようとしています

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();
}

この時点までの私のコードは正常に機能しています。ここで、INVERSE ドラッグ領域 (ドラッグ領域の外側にある領域) を暗くしたいと思います。つまり、ドラッグ中にこの Rectangle 内にある領域を強調表示する必要があります。

続行する方法についてのアイデア。

ありがとう。

-パンカジ

4

1 に答える 1

4

長方形の外側を覆うオブジェクトを作成Regionし、半透明で塗りつぶしてSolidBrush暗く見えるようにすることで、それを行うことができると思います。

また、グラフィックスを作成してイベントで描画する必要はありませんが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して、追加のコードを必要とせずに使用できるようになります。

また、強調表示された領域の動作を変更して、マウス カーソルがその領域の中央にくるようにすることも検討してください。ユーザーにとってより直感的なものになると思います。

コードに問題がある場合は、コメントに書いてください。私がお手伝いします :)。

于 2012-04-10T16:40:02.487 に答える