0

パネルにピクチャボックスを配置するアプリケーションがあります。ピクチャ ボックスのドラッグ アンド ドロップの実装に成功した後、パネル上でピクチャ ボックスを便利に移動するためのグリッド オプションを追加したいと考えました。私が使用したコードは

private void PB14_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            if (grid)
            {
                if (MousePosition.X % 10 == 0)
                {
                    PBList[14].Location = new Point(PList[parent].PointToClient(new Point(MousePosition.X, MousePosition.Y)).X, PBList[14].Location.Y);
                }
                if (MousePosition.Y % 10 == 0)
                {
                    PBList[14].Location = new Point(PBList[14].Location.X, PList[parent].PointToClient(new Point(MousePosition.X, MousePosition.Y)).Y);
                }
            }
            else
            {
                ...
            }
        }
    }

PList はパネルのリストです。PList[parent] は (Pictureboxlist の外の) ピクチャボックス PBList[14] が含まれる親です。

問題は、Picturebox がスムーズに動かないことです。まったく動かないこともあります。% 操作の値によっては、より良いものもあれば悪いものもあることがわかりました。

if (MousePosition.X % 30 == 0)

if ステートメントでは、10 より悪いです。

if() の値をラベルに入れると、計算がスキップされることがあることがわかりました。つまり、値が 9 から 1 にジャンプし、0 になるはずのピクセルがスキップされ、Picturebox が移動しませんでした。

この目的のためにマウス座標を計算するより良い方法を知っていますか?

4

3 に答える 3

0

典型的なドラッグ アンド ドロップの実装に、グリッドにスナップする動作を追加することができました。グリッドはとに基づいていControlます。必要に応じて、とを定数に置き換えることで、これを変更できます。が画面外にドラッグされないようにすることもできます。HeightWidthcontrol.Heightcontrol.WidthControl

    private void OnMouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            control.Left = ((e.X + control.Left) / control.Width) * control.Width;
            control.Top = ((e.Y + control.Top) / control.Height) * control.Height;
        }
    }

Controlをスムーズにドラッグし、代わりにマウス ボタンを放したときにのみグリッドにスナップする場合は、次のようにします。

    private void OnMouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            control.Left += e.X - offset.X;
            control.Top += e.Y - offset.Y;
        }
    }

    private void OnMouseUp(object sender, MouseEventArgs e)
    {
        control.Left = ((control.Left + control.Width / 2) / control.Width) * control.Width;
        control.Top = ((control.Top + control.Height / 2) / control.Height) * control.Height;
    }

    private void OnMouseDown(object sender, MouseEventArgs e)
    {
        offset = e.Location;
    }
于 2013-07-31T14:06:40.020 に答える