8

私はこれを数時間試みてきましたが、私の人生のためにそれを可能にすることはできません。

私がやろうとしているのは、winformアプリケーションの画像ボックス内にある画像を移動することです。私の画像はおよそ1000x1000ピクセルで、ボックスは400x500のような任意のものです。たとえば、マウスをクリックすると、画像が50左に移動します。ただし、画像ボックスは同じサイズのままにする必要があります。

しかし、私の人生では、これを機能させることはできません。私ができることは次のとおりです。

     if (kinectController.hands[0].fingertips.Count == 1)
        {
            pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;

        }

この機能は私のkinectフィンガートラッキングアプリ用です。そのため、アプリケーションが画面上に表示可能な単一のファインダーポイントを検出すると、画像は中央に配置されます。ただし、最終的には、指の動きに合わせて画像を動かしたいと思います。これは、画像を数ピクセル横に動かすという基本的な手順を実行すると実現します。

これに関する助けをいただければ幸いです。

4

2 に答える 2

15

私は少し調べましたが、PictureBox内で画像を移動するのは簡単な作業ではないようです。少なくとも、これを可能にするものは見つかりませんでした(ただし、それを行う方法がないとは言えません)。

ただし、私は少し「回避策」を考え出しました。これがあなたのニーズに合うかどうかを確認してください。これを達成するには:

  • Panelコントロールを作成し、表示したい画像の大きさに合わせてサイズを変更します
  • そのパネル内に、画像を含むPictureBoxコントロールを配置し、SizeModeプロパティをAutoSizeに設定します。

次に、このコードをフォームに入力します

private bool Dragging;
private int xPos;
private int yPos;
private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { Dragging = false; }
private void pictureBox1_MouseDown(object sender, MouseEventArgs e) {
    if (e.Button == MouseButtons.Left) { 
        Dragging = true;
        xPos = e.X;
        yPos = e.Y;
    }
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e) {
    Control c = sender as Control;
    if (Dragging && c!= null) {
        c.Top = e.Y + c.Top - yPos;
        c.Left = e.X + c.Left - xPos;
    }
}

これで、PictureBoxをクリックしてドラッグするたびに、実際にはその中の画像は移動しませんが、パネル内のPictureBoxコントロールが移動します。繰り返しになりますが、あなたが探していたものとは異なり、これがどのようにKinectに変換されるかはわかりませんが、これで正しい方向に進むことを願っています。

于 2012-09-27T16:34:55.710 に答える
1

コメントするのに十分な評判ではありませんが、誰かが動き回る画像をさらに制御する必要があり、境界を越えて画像を移動できない場合は、ベンブラックの回答を追加したいと思います:

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        Control c = sender as Control;
        if (Dragging && c != null)
        {
            int maxX = pictureBox1.Size.Width * -1 + panel.Size.Width;
            int maxY = pictureBox1.Size.Height * -1 + panel.Size.Height;

            int newposLeft = e.X + c.Left - xPos;
            int newposTop = e.Y + c.Top - yPos;

            if (newposTop > 0)
            {
                newposTop = 0;
            }
            if (newposLeft > 0)
            {
                newposLeft = 0;
            }
            if (newposLeft < maxX)
            {
                newposLeft = maxX;
            }
            if (newposTop < maxY)
            {
                newposTop = maxY;
            }
            c.Top = newposTop;
            c.Left = newposLeft;

        }
    }
于 2019-08-29T16:57:54.383 に答える