- 題名: AutoScrollの動作について
- 日時: 2009/06/11 15:55:11
- ID: 24726
- この記事の返信元:
- (なし)
- この記事への返信:
- [24731] Re[1]: AutoScrollの動作について2009/06/12 18:06:39
- ツリーを表示
サンプルを書いてみました。
ソースコードは2つのカスタムコントロールと、1つのFormで構成されます。
・PictureBoxEx・・・SizeMode=Zoomのときに、自身の高さとImageの高さが一致するように画像を表示するPictureBox。
・PictureBoxAutoScroll・・・PictureBoxExのコンテナ。Imageの高さと自身の高さを比較し、ScrollBarの
表示・非表示やImageの描画方法を制御します。UserControlの代わりにScrollableControlで作りました。
・PictureBoxAutoScrollTestForm・・・PictureBoxAutoScrollを表示するだけのテスト用Form。
参考になれば幸いです。
# 私のPC(XPHomeSP3、CeleronM1.5GHz)では、スクロールバーはフラッシュしません
Imports System.IO
Public Class PictureBoxAutoScrollTestForm
Inherits Form
Dim PictureBoxAutoScroll1 As New PictureBoxAutoScroll
Public Sub New()
Me.PictureBoxAutoScroll1.Dock = DockStyle.Fill
Me.Controls.Add(Me.PictureBoxAutoScroll1)
End Sub
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
Me.PictureBoxAutoScroll1.LoadPicture()
MyBase.OnLoad(e)
End Sub
End Class
' UserControlの代わりにScrollableControlを使いました
Public Class PictureBoxAutoScroll
Inherits ScrollableControl
Dim PictureBox1 As New PictureBoxEx
Dim _size As Size
Public Sub New()
Me.PictureBox1.Location = New Point(0, 0)
Me.Controls.Add(Me.PictureBox1)
End Sub
' 画像を読み込んでPictureBoxExに表示
Public Sub LoadPicture()
Using ofd As New OpenFileDialog
ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)
If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
Using fs As New FileStream(ofd.FileName, FileMode.Open)
Me.PictureBox1.Image = Image.FromStream(fs)
Me._size = Me.PictureBox1.Image.Size
End Using
End If
End Using
Me._resizePictureBox()
End Sub
Protected Overrides Sub OnSizeChanged(ByVal e As System.EventArgs)
Me._resizePictureBox()
MyBase.OnSizeChanged(e)
End Sub
' 画像の高さによって表示方法を変える
Private Sub _resizePictureBox()
If Me.ClientSize.Height >= Me._size.Height Then
Me.AutoScroll = False
Me.PictureBox1.Size = Me.ClientSize
Me.PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
Else
Me.AutoScroll = True
Me.PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize
End If
End Sub
End Class
Public Class PictureBoxEx
Inherits PictureBox
Protected Overrides Sub OnPaint(ByVal pe As System.Windows.Forms.PaintEventArgs)
If Me.Image IsNot Nothing AndAlso Me.SizeMode = PictureBoxSizeMode.Zoom Then
' SizeMode=Zoomのときは、Heightをあわせるために自分でImageを描画する
Dim scale As Double = Me.Height / Me.Image.Height
pe.Graphics.DrawImage(Me.Image, 0, 0, CInt(Me.Image.Width * scale), Me.Height)
Else
MyBase.OnPaint(pe)
End If
End Sub
End Class
分類:[.NET]
【解決したい問題】
いつも参考にさせていただいております。
AutoScrollの動作についてなのですが、例えば、
フォームにPictureBoxを貼り付けて、フォームのAutoScrollをTrueとします。
PictureBoxの高さはフォームの高さとなるように、Resizeで調整します。
以下にそのソースを記述します。
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
PictureBox1.Top = 0
PictureBox1.Left = 0
PictureBox1.Height = Me.ClientSize.Height - 1
Me.AutoScroll = True
End Sub
Private Sub Form1_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize
PictureBox1.Height = Me.ClientSize.Height - 1
End Sub
End Class
そこでお聞きしたいのですが、フォームの高さをマウスでつまんで縮小させると、スクロールバーがフラッシュします。
このスクロールバーを表示しないようにできないでしょうか?
PictureBox内の画像の高さがフォームの高さより小さい場合は、PictureBoxの高さ=フォームの高さ、
大きい場合はフォームにスクロールバーを表示させることをさせたいのです。
ここでは、フォームを利用しておりますが、UserControlで実現させようとしておりますので、そこのところを含み、解決策がありましたら、ご教授ください。
よろしくお願いいたします。