PictureBoxへImage.FromFileで表示する場合の配置について

タグの編集
投稿者 pirori  (その他) 投稿日時 2009/4/3 22:02:36
初心者です。「PictureBoxへImage.FromFileで表示する場合の配置について」教えて下さい。

VB2005Expressを使用。PictureBoxへImage.FromFileを使用し、Zoomでサイズを合わせてjpg画像を表示しています。PictureBoxはAnchorでFormに合わせて変形する仕様です。
そこで、対象の画像が縦長な場合、縦はPictureBoxいっぱいになって良いのですが、横は左右が空いた中央配置になってしまいます。これを右Anchorみたいに右寄せ配置して左側を空けたいのですが、PictureBox内のImageのAnchorってできるのでしょうか?コードスニペットにそれらしい候補がなく、立往生です。

初歩的な質問で申し訳ありませんが教えてください。よろしくお願いします!
投稿者   (社会人) 投稿日時 2009/4/3 22:51:21
まず無理だと思います。
なにゆえ、そのようなことをする必要があるのかおしえていただけますか?
投稿者 あにす  (社会人) 投稿日時 2009/4/3 22:52:30
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.picturebox_members(VS.80).aspx
MSDNを確認してもPictureBoxにはそういったメンバは無い様なので出来ないと思います。
少し面倒ですが、自分で描画するしかないですね。
投稿者 あにす  (社会人) 投稿日時 2009/4/3 23:27:58
面白そうだったので自前で描画してみました。
面倒かと思いましたが、書いてみるとそれ程でもないようです。
Public Class Form1
    Dim img As Image = Image.FromFile("C:\俺の嫁.bmp")

    Private Sub PictureBox1_Paint(ByVal sender As ObjectByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        Dim imgアスペクト比 As Double = img.Width / img.Height
        Dim pbアスペクト比 As Double = sender.Width / sender.Height
        Dim 描画サイズ As Size

        If imgアスペクト比 > pbアスペクト比 Then
            描画サイズ = New Size(sender.Width, sender.Width / imgアスペクト比)
        ElseIf imgアスペクト比 < pbアスペクト比 Then
            描画サイズ = New Size(sender.Height * imgアスペクト比, sender.Height)
        Else
            描画サイズ = New Size(sender.Width, sender.Height)
        End If

        e.Graphics.DrawImage(img, sender.Width - 描画サイズ.Width - 1, 0, 描画サイズ.Width, 描画サイズ.Height)
    End Sub

    Private Sub PictureBox1_SizeChanged(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles PictureBox1.SizeChanged
        sender.Refresh()
    End Sub
End Class
投稿者 pirori  (その他) 投稿日時 2009/4/3 23:30:59
拓さん、あにすさん、ご返答ありがとうございます。
やはり無理でしたか…

>なにゆえ、そのようなことをする必要があるのかおしえていただけますか?

本のようなイメージなんですが、左右に見開き状態のPictureBoxを2つ配置し、それぞれのPictureBoxに画像を表示し、ページをめくって(進める)ようなものをノートPCで作ったのですが、デスクトップ機で開いてみると小さすぎたので、拡大/縮小できるように対応しました。が、画面サイズにFormを合わせてPictureBoxを変形することにより、左右のPictureBoxの中央に表示されると間延びするんです。更に見開きいっぱい使ったページでは間が離れすぎなので、左のPictureBoxは右寄せ、右のPictureBoxは左寄せにしたかったのです。
かといってPictureBoxの縦横比を固定してしまうと、他のサイズの画像に対応できなくなるし…と悩んでいます。

>MSDNを確認してもPictureBoxにはそういったメンバは無い様なので出来ないと思います。
>少し面倒ですが、自分で描画するしかないですね。

お手数おかけ致しました。私も一応F1のHelpで探したのですが。
自分で描画ですか…考えてみます。
投稿者 pirori  (その他) 投稿日時 2009/4/3 23:35:56
なんと返信文を書いている間にコードまで…

参考にさせていただきます。ありがとうございます。
投稿者   (社会人) 投稿日時 2009/4/4 03:26:51
pirori さんへ

面白そうなものを作ってますね。
できたらぜひ披露してください。
楽しみにしています。
投稿者 pirori  (その他) 投稿日時 2009/4/4 07:59:35
拓さん、遅くなりました。

あにすさんのコードで、右寄せはできるようになったのですが、ページが進めなくなってしまい、格闘中でした。どう組み合わせればいいのか、結局のところ進んでいません。
なにぶん初心者なもので…

というわけで、とても晒せるようなシロモノではありませんよ(汗)
投稿者 pirori  (その他) 投稿日時 2009/4/4 09:06:58
やっと思ったとおり動くようになりました。

ありがとうございました。