1

今後の参考のために、このジェネリックを保持しようとします。

フォームに正方形のグリッドがあるとします (RectangleShapes を個別に「ポイント」と呼びます)。このグリッドのサイズはフォームが読み込まれる前に変化する可能性があるため、最初にパネル内にすべてのポイントを作成しました。フォームをロードして使用できます...

foreach (Squares point in mySquares)

...行動や外見を変えたいとき。これで、ユーザーが左または右にクリックしたときに個々のポイントの色を変更するコードが既に開発されています。次のようになります。

private void panelGrid_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left || e.Button == MouseButtons.Right)
    {
        foreach (Squares point in mySquares)
        {
            if (point.Rectangle.Contains(e.Location))     // determine which point to use
            {
                if (e.Button == MouseButtons.Left)
                {
                    Pencil(point);        // left-click to fill color
                }
                else
                {
                    Erase(point);       // right-click to erase color
                }
            }
        }
    panelGrid.Invalidate();            // refreshes grid
    }
}

そして、これは魅力のように機能します。しかし、このコードを変更する必要があるとします。 マウス ボタンを押したままにして、カーソルを新しいポイントに移動したときに色を変更することも必要です。(MS-Paint のようなものです。鉛筆ツールを複数のピクセルにドラッグすると、それぞれが順番に塗りつぶされます。)

私を混乱させるのは、この動作を適切に実装する適切な方法です。私の理解では、次の場合に Pencil/Eraser メソッドを呼び出す必要があります。

A.)マウスが「ポイント」に入り、かつボタンがすでに押されている。

また

B.)マウス ボタンが押されます。(上記のコードを参照)

これが私にとって難しいのは、新しいチェックを実装する最善の方法と、グリッド内の個々のポイントでそれらを実行する方法を決定することです-またはそれが必要な場合でも. 任意のヒント?

4

1 に答える 1

1

MouseDown イベントと MouseMove イベントで同じことをしたいようですね:

private void MouseStuff(MouseEventArgs e) {
  if (e.Button == MouseButtons.Left || e.Button == MouseButtons.Right)
  {
    foreach (Squares point in mySquares) {
      if (point.Square.Contains(e.Location)) {
        if (e.Button == MouseButtons.Left) {
          Pencil(point);
        } else {
           Erase(point);
        }
      }
    }
    panelGrid.Invalidate();
  }
}

次に、両方のイベントから呼び出してみます。

private void panelGrid_MouseDown(object sender, MouseEventArgs e) {
  MouseStuff(e);
}

private void panelGrid_MouseMove(object sender, MouseEventArgs e) {
  MouseStuff(e);
}

MouseMove イベントでパネルを無効にすると非常に負荷がかかる可能性があるため、ダブル バッファ パネルを使用してコントロールのちらつきを軽減することを検討してください。

public class BufferedPanel : Panel {
  public BufferedPanel() {
    this.DoubleBuffered = true;
    this.ResizeRedraw = true;
  }
}
于 2012-07-26T16:13:49.783 に答える