0

フォームに描画するためのサンプルコードをここで見つけました。

http://msdn.microsoft.com/en-us/library/aa287522(v=vs.71).aspx

この要件のフォローアップとして(ユーザーがマウスをドラッグして記述した長方形の下にあるコントロールを検出する):

コントロールの場所とMouseDownおよび-Upイベントの場所の間に不一致があるようです

...ユーザーが選択しようとしているもの(マウスボタンを離したとき/離した場合)について、ユーザーに即座に/一定のフィードバックを提供したいと思います。マウスの動きに合わせて線を引くだけでなく、ネズミのラングリングで描かれている長方形を描きたいです。

上記の2つのリンクからのコードと組み合わせたMouseMoveイベントでうまくいくと思いますが、頻繁に発生するのでしょうか/パフォーマンスに悪意のある影響を与えるのでしょうか?もしそうなら、フックするのに好ましいイベントは何でしょうか、それともタイマーがここに行く方法でしょうか?

アップデート

このコードは、以下のJohnの例を応用したものです(唯一の違いは、StackOverflowによるbase。*の呼び出しがコメント化されており、色を赤から黒に変更しました(Stendahlへの参照は意図されていません))。以前に描画された長方形を除いて機能します。マウスを離した後、再び表示します。IOW、最初の長方形は完全に描画されます-マウスを上にクリックすると消えます(意図したとおり)。ただし、マウスの左キーを押して右下にドラッグして2番目の長方形を記述すると、最初の長方形が再び表示されます。そして、これは引き続き発生します。以前に描画されたすべての長方形が記憶され、新しい長方形が描画されるときに前面に戻されます。

パブリック部分クラスForm1:フォーム{プライベートポイント?_始める; プライベート長方形_previousBounds;

public Form1()
{
    InitializeComponent();
}

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    _start = e.Location;
    //base.OnMouseDown(e); 

}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    if (_start.HasValue)
        DrawFrame(e.Location);

    //base.OnMouseMove(e); 

}

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
    ReverseFrame();
    _start = null;
    //base.OnMouseUp(e); 
}

private void ReverseFrame() 
{ 
    ControlPaint.DrawReversibleFrame(_previousBounds, Color.Black, FrameStyle.Dashed); 
} 

private void DrawFrame(Point end) 
{ 
    ReverseFrame(); 

    var size = new Size(end.X - _start.Value.X, end.Y - _start.Value.Y); 
    _previousBounds = new Rectangle(_start.Value, size); 
    _previousBounds = this.RectangleToScreen(_previousBounds); 
    ControlPaint.DrawReversibleFrame(_previousBounds, Color.Black, FrameStyle.Dashed); 
} 

}

4

1 に答える 1

1

ControlPaint.DrawReversibleFrame()あなたが望むことをします。パフォーマンスは一般的に問題ではありません-それを小さくてきれいに保つだけです。

-編集:コードサンプルを追加しました。StackOverflowExceptionは、何かが間違っていることを示していますが、あなたのことを確認しないと、直接答えることはできません。

private Point? _start;
private Rectangle _previousBounds;

protected override void OnMouseDown(MouseEventArgs e)
{
    _start = e.Location;
    base.OnMouseDown(e);
}

protected override void OnMouseMove(MouseEventArgs e)
{
    if( _start.HasValue ) {
        ReverseFrame();
        DrawFrame(e.Location);
    }

    base.OnMouseMove(e);
}

protected override void OnMouseUp(MouseEventArgs e)
{
    ReverseFrame();
    _start = null;
    base.OnMouseUp(e);
}

private void ReverseFrame()
{
    ControlPaint.DrawReversibleFrame(_previousBounds, Color.Red, FrameStyle.Dashed);

}
private void DrawFrame(Point end)
{
    ReverseFrame();

    var size = new Size(end.X - _start.Value.X, end.Y - _start.Value.Y);
    _previousBounds = new Rectangle(_start.Value, size);
    _previousBounds = this.RectangleToScreen(_previousBounds);
    ControlPaint.DrawReversibleFrame(_previousBounds, Color.Red, FrameStyle.Dashed);
}
于 2012-04-29T17:46:03.227 に答える