2017-05-09 5 views
1

"Zoom"レイアウトの背景イメージ実際の幅と高さは、「ストレッチ」レイアウトではなく、コントロールの幅と高さに一致するとは限りません。任意の数式を実行せずにレンダリングされた現在のイメージを取得するためにwinformsにプロパティまたは何かがあるかどうか疑問に思っていますか?"zoom"レイアウトの背景イメージの実際のサイズ

+1

何もありません。数学は本当に怖いですか? – adv12

+0

@ adv12いいえ、私は数学が大好きですが、実際にはアンカーを待っていましたが、なぜホイールを再発明するのですか? –

答えて

1

これはSizeModesのいずれかでPictureBoxからRectangleピクセルを返します。

しかし、はい、それはズームモードのためにいくつかの計算を行います。

それは、対応するBackgroudImageLayout値に容易に適合することができます。私が知っている

Rectangle ImageArea(PictureBox pbox) 
{ 
    Size si = pbox.Image.Size; 
    Size sp = pbox.ClientSize; 

    if (pbox.SizeMode == PictureBoxSizeMode.StretchImage) return pbox.ClientRectangle; 
    if (pbox.SizeMode == PictureBoxSizeMode.Normal || 
     pbox.SizeMode == PictureBoxSizeMode.AutoSize) return new Rectangle(Point.Empty, si); 
    if (pbox.SizeMode == PictureBoxSizeMode.CenterImage) 
     return new Rectangle(new Point((sp.Width - si.Width)/2, 
          (sp.Height - si.Height)/2), si); 

    // PictureBoxSizeMode.Zoom 
    float ri = si.Width/si.Height; 
    float rp = sp.Width/sp.Height; 
    if (rp > ri) 
    { 
     int width = si.Width * sp.Height/si.Height; 
     int left = (sp.Width - width)/2; 
     return new Rectangle(left, 0, width, sp.Height); 
    } 
    else 
    { 
     int height = si.Height * sp.Width/si.Width; 
     int top = (sp.Height - height)/2; 
     return new Rectangle(0, top, sp.Width, height); 
    } 
} 
+0

「PictureBox」についての質問には一言もありませんが、私は思いついたようです。 –

+0

Trueですが、 'Panel'や' Label'のようなコントロールの 'BackgroundImageLayout'は基本的に' PictureBoxSizeMode 'を除いて' 'Tile''モードはありませんが' 'Autosize''モードを持っています。 – TaW

関連する問題