none
VB:PictureBoxの配置、調整、移動について RRS feed

  • 質問

  • 他サイトでも質問しましたが、こちらでも質問させてください。

    VisualBasicで、PictureBoxの配置に関してです。
    PictureBoxをタップすると音声が流れ、Trackbarでそのサイズの変更ができるようにしています。

    そのPictureBoxを1~6枚から選んで表示したいのですがその配置の仕方がわかりません。

    1枚だけ表示したい場合は、フォームの中央に表示し、2枚ならフォームの左右に均等に表示し、3枚ならフォームを横に3等分して表示し...という配置の仕方です。
    よろしくお願いします

    2018年10月1日 9:43

回答

  • これ

    6枚までとわかっているならTableLayoutPanelで列を6列用意して、表示非表示を切り替えるのが楽。

    Public Class Form1
        Private panel As TableLayoutPanel
        Private WithEvents updown As NumericUpDown
        Private pictures(0 To 5) As PictureBox
        Private WithEvents p As PictureBox
        Sub New()
    
            ' この呼び出しはデザイナーで必要です。
            InitializeComponent()
    
            ' InitializeComponent() 呼び出しの後で初期化を追加します。
    
            updown = New NumericUpDown()
            updown.Minimum = 0
            updown.Maximum = 6
            updown.Font = New Font(Me.Font.Name, 30)
            Me.Controls.Add(updown)
    
            panel = New TableLayoutPanel()
            panel.RowCount = 1
            panel.ColumnCount = 6
            panel.Left = 0
            panel.Top = updown.Height
            panel.Width = Me.ClientSize.Width
            panel.Height = Me.ClientSize.Height - panel.Top
            panel.Anchor = AnchorStyles.Left Or AnchorStyles.Right Or AnchorStyles.Top Or AnchorStyles.Bottom
            panel.BackColor = Color.White
    
    
            For column As Integer = 0 To 5
                panel.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 0))
                Dim p As New PictureBox
                p.Width = 0
                p.Height = 0
                p.Anchor = AnchorStyles.None '列の中央を維持するように
                p.Visible = False
                pictures(column) = p
                panel.Controls.Add(p, column, 0)
    
                p.Width = 30
                p.Height = 30
    
                'p.Controls.Add(New Label() With {.Text = (column + 1).ToString(), .Font = New Font(Me.Font.Name, 20)})
    
                p.Tag = column
                AddHandler p.Click, AddressOf pictureBox_Click
            Next
    
            pictures(0).BackColor = Color.Red
            pictures(1).BackColor = Color.Green
            pictures(2).BackColor = Color.Blue
            pictures(3).BackColor = Color.Pink
            pictures(4).BackColor = Color.LightGreen
            pictures(5).BackColor = Color.LightSkyBlue
    
            Me.Controls.Add(panel)
        End Sub
    
        Private Sub updown_ValueChanged(sender As Object, e As EventArgs) Handles updown.ValueChanged
            Me.SuspendLayout()
    
            panel.ColumnCount = updown.Value
    
            For i As Integer = 0 To pictures.Length - 1
                If (i < updown.Value) Then
                    '表示するようにする列
                    pictures(i).Visible = True
                    panel.ColumnStyles(i).SizeType = SizeType.Percent
                    panel.ColumnStyles(i).Width = pictures.Count / 100.0
                Else
                    '表示しないようにする列
                    pictures(i).Visible = False
                    panel.ColumnStyles(i).SizeType = SizeType.Percent
                    panel.ColumnStyles(i).Width = 0
                End If
            Next
    
            Me.ResumeLayout()
        End Sub
    
        Private Sub pictureBox_Click(sender As Object, e As EventArgs)
            Dim p As PictureBox = CType(sender, PictureBox)
            MessageBox.Show("Click" + p.Tag.ToString())
        End Sub
    End Clas
    #ほかのサイトで質問に回答している人が居るのに放置するのは良くない

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク 6503 2018年10月7日 2:58
    2018年10月1日 11:05

すべての返信

  • これ

    6枚までとわかっているならTableLayoutPanelで列を6列用意して、表示非表示を切り替えるのが楽。

    Public Class Form1
        Private panel As TableLayoutPanel
        Private WithEvents updown As NumericUpDown
        Private pictures(0 To 5) As PictureBox
        Private WithEvents p As PictureBox
        Sub New()
    
            ' この呼び出しはデザイナーで必要です。
            InitializeComponent()
    
            ' InitializeComponent() 呼び出しの後で初期化を追加します。
    
            updown = New NumericUpDown()
            updown.Minimum = 0
            updown.Maximum = 6
            updown.Font = New Font(Me.Font.Name, 30)
            Me.Controls.Add(updown)
    
            panel = New TableLayoutPanel()
            panel.RowCount = 1
            panel.ColumnCount = 6
            panel.Left = 0
            panel.Top = updown.Height
            panel.Width = Me.ClientSize.Width
            panel.Height = Me.ClientSize.Height - panel.Top
            panel.Anchor = AnchorStyles.Left Or AnchorStyles.Right Or AnchorStyles.Top Or AnchorStyles.Bottom
            panel.BackColor = Color.White
    
    
            For column As Integer = 0 To 5
                panel.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 0))
                Dim p As New PictureBox
                p.Width = 0
                p.Height = 0
                p.Anchor = AnchorStyles.None '列の中央を維持するように
                p.Visible = False
                pictures(column) = p
                panel.Controls.Add(p, column, 0)
    
                p.Width = 30
                p.Height = 30
    
                'p.Controls.Add(New Label() With {.Text = (column + 1).ToString(), .Font = New Font(Me.Font.Name, 20)})
    
                p.Tag = column
                AddHandler p.Click, AddressOf pictureBox_Click
            Next
    
            pictures(0).BackColor = Color.Red
            pictures(1).BackColor = Color.Green
            pictures(2).BackColor = Color.Blue
            pictures(3).BackColor = Color.Pink
            pictures(4).BackColor = Color.LightGreen
            pictures(5).BackColor = Color.LightSkyBlue
    
            Me.Controls.Add(panel)
        End Sub
    
        Private Sub updown_ValueChanged(sender As Object, e As EventArgs) Handles updown.ValueChanged
            Me.SuspendLayout()
    
            panel.ColumnCount = updown.Value
    
            For i As Integer = 0 To pictures.Length - 1
                If (i < updown.Value) Then
                    '表示するようにする列
                    pictures(i).Visible = True
                    panel.ColumnStyles(i).SizeType = SizeType.Percent
                    panel.ColumnStyles(i).Width = pictures.Count / 100.0
                Else
                    '表示しないようにする列
                    pictures(i).Visible = False
                    panel.ColumnStyles(i).SizeType = SizeType.Percent
                    panel.ColumnStyles(i).Width = 0
                End If
            Next
    
            Me.ResumeLayout()
        End Sub
    
        Private Sub pictureBox_Click(sender As Object, e As EventArgs)
            Dim p As PictureBox = CType(sender, PictureBox)
            MessageBox.Show("Click" + p.Tag.ToString())
        End Sub
    End Clas
    #ほかのサイトで質問に回答している人が居るのに放置するのは良くない

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク 6503 2018年10月7日 2:58
    2018年10月1日 11:05
  • 回答ありがとうございます。

    素人なのでかなり時間がかかりますが、回答いただいた内容で理解・検証したいと思います。

    2018年10月1日 14:08