0

画像の一部を選択するための楽器を作っています。私はPictrureBoxを持っています、そしてそれを作る簡単な方法:

void StartPanel(object sender, MouseEventArgs args)
{
    xStart = args.X;
    yStart = args.Y;
    panelStarted = true;
    pan.Location = new Point(xStart, yStart);
}
void FinishPanel(object sender, MouseEventArgs args)
{
    xFinish = args.X;
    yFinish = args.Y;
    panelStarted = false;
}

void UpdatePanel(object sender, MouseEventArgs args)
{
    if (panelStarted)
    {
        int x = args.X;
        int y = args.Y;

        int newxstart = xStart;
        int newystart = yStart;
        int neww = 0;
        int newh = 0;

        if (x >= xStart)
            neww = x - xStart;
        else
        {
            neww = xStart - x;
            newxstart = x;
        }
        if (y >= yStart)
            newh = y - yStart;
        else
        {
            newh = yStart - y;
            newystart = y;
        }

        pan.Size = new Size(neww, newh);
        pan.Location = new Point(newxstart, newystart);
    }
}

マウスを上下に動かすと、まったく問題ありません。しかし、それを左または上に動かすと、私の領域でまばたきが見られます。つまり、マウスを左または上に動かすと、Panel.Locationが変更されるため、パネルが再描画され、マウスを右または下に動かすと、位置が変更されず、サイズのみが変更されるためです。再描画されず、一部のピクセルのみがパネルに追加されます。このための標準的なソリューションは何ですか?

4

2 に答える 2

0

パネルのサイズを変更するときに描画の問題を説明しているので、おそらく最も簡単な修正は、使用しているパネルを、ダブルバッファリングされ、イベントのサイズ変更時に無効になるパネルに置き換えることです。

public class BufferedPanel : Panel {
  public BufferedPanel() {
    this.DoubleBuffered = true;
    this.ResizeRedraw = true;
  }
}
于 2012-07-11T14:14:14.763 に答える
0

何をしようとしているのかを確認するのは簡単ではありませんが、ドラッグ可能なコントロールとしてパネルを使用して、下の画像の一部(レンズなど)をキャプチャするピクチャーボックスの表面をドラッグしていると思います-はい?

もしそうなら、これはそれを行うための最良の方法ではありません。ピクチャーボックスの表面に長方形を描き、その周りを「ドラッグ」することをお勧めします。これは、マウスイベントを使用して左上隅を設定し、オンペイントを使用して画像上に塗りつぶされていない長方形を描画するだけで簡単です。準備ができたら画像をキャプチャするのも簡単です。必要なイベントを使用して、同じ位置を指定して画像を新しいビットマップにコピーします。

あるコントロールを別のコントロールに置くと、ダブルバッファリングを使用している場合でも、ちらつきが発生することがよくあります。また、はるかに多くのコードが必要です。

于 2012-07-11T14:40:40.350 に答える