2016-06-20 26 views
-1

イメージを表示するカスタムコントロールがあります。画像の周りには、各コーナーに4つのサイズのグリップがあります。ユーザがカーソルをサイズグリップに移動させると、アスペクト比を維持したまま画像のサイズを変更できるはずです。私はそれに任意の値を渡すことができ、アスペクト比が維持されるため、それ自体でマウスで画像のサイズを変更し、縦横比を維持

public void Resize(float value) 
{ 
    if (value == 0f) 
     value = 0.05f; 

    //Resize by the same value to keep aspect ratio 
    var width = (int)(frame.Width * value); 
    var height = (int)(frame.Height * value); 

    //Image resizing removed... 
} 

Resize方法が動作している:

Iはすでに動作リサイズ方法を有しています。 widthheightの両方を使用し、同じ値でサイズを変更します。

問題は、サイズグリップの1つを移動することによるサイズ変更が期待通りに機能していないことです。また、画像のアスペクト比が失われます。私が持っているMouseMoveイベントでは:マウスカーソルを移動してサイズ変更をしようとすると

if (e.Button == MouseButtons.Left) 
{ 
    //Get mouse position delta 
    var x = mousePosition.X - e.Location.X; 
    var y = mousePosition.Y - e.Location.Y; 

    if (x == 0 && y == 0) 
     return; 

    bool doY = false; 
    var diff = x; 

    if (x == 0 && y != 0) 
    { 
     diff = y; 
     doY = true; 
    } 

    float width = frame.Width + diff; 
    float amount = frame.Width/width; 

    if (doY) 
    { 
     float height = frame.Height + diff; 
     amount = frame.Height/height; 
    } 

    Resize(amount); 
} 

、アスペクト比が尊重されていません。上記のコードでは、xまたはyに変更があったかどうかを判断し、変更された値に応じてサイズ変更の値を決定します。

正しいxyデルタを取得し、移動するグリップに応じてアスペクト比を維持しながら画像のサイズを変更するより良い方法はありますか?

+0

"期待どおりに動作しない"とはどういう意味ですか?また、それについて考える "var x = mousePosition.X - e.Location.X;"私は "var x = Math.Abs​​(mousePosition.X - e.Location.X);"を使用します。 動作していないwhatsと、サイズグリップが機能していない場合は、もっと多くのコードを追加してくれますか? – MrApnea

+0

@FSDanielはい 'x'は負の数にすることができます。これは、グリップがドラッグされているサイズに応じてフレームのサイズが小さくなることを意味します。サイズグリップは、フレームの角に描かれた単純な矩形であり、矩形の上に 'Contains'メソッドを呼び出すことによってどのグリップがドラッグされているかを確認します。 –

答えて

0

あなたはルーチンを複雑にしているようです。

​​

On resize, compare the new size of the control and choose the most significant dimension change - width or height - base on some logic, e.g. the biggest one.

Calculate the ratio by which the dimension is changed, by comparing its new amount to the stored one.

Then apply this ratio by changing the other dimension in code.

Finally store the new size for future reference.

それを行う必要があります。このためのアプローチはな単純なものでなければなりません。いいえMouse_Move監視が必要です。

0

次の方法を試してください。大きなスタイルのカスタムコントロールを作成します。

class SizeablePictureBox : PictureBox 
{ 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      const int WS_SIZEBOX = 0x40000; 

      var cp = base.CreateParams; 
      cp.Style |= WS_SIZEBOX; 

      return cp; 
     } 
    } 
} 

レイアウトのプロパティを設定します。 Zoomに設定すると、縦横比は変わりません。

var pictureBox = new SizeablePictureBox { Parent = this, Width = 500, Height = 500 }; 
pictureBox.BackgroundImageLayout = ImageLayout.Zoom; 
pictureBox.BackgroundImage = Image.FromFile("pic.jpg"); 

準備!ユーザーはマウスでコントロールのサイズを変更できます。画像の寸法は自動的に変更されます。

関連する問題