Member 11856456 Ответов: 1

Как я могу просматривать pictureboxes в panel1. control?


Я хочу иметь возможность перемещаться по каждому picturebox в моей panel1. controls с помощью клавиш со стрелками вправо и влево, не знаю, почему код, который я использую, не позволяет мне это сделать.

Вот код, который я использую:

Sub convertPic(ByVal sender As System.Object, ByVal e As System.EventArgs)

     'CONVERT SENDER INTO PICTUREBOX, used on the images being displayed on the panel control, not used for images in database
     pic = CType(sender, PictureBox)

     ' Make new picturebox and fill it with inage data from pic, then after making dimesions fill dock with that image so that it
     ' can be streched or forshortend by dragging form.
     Dim expandpic As New PictureBox
     expandpic.Height = pic.Image.Height
     expandpic.Width = pic.Image.Width
     expandpic.Image = pic.Image
     expandpic.Dock = DockStyle.Fill
     expandpic.SizeMode = PictureBoxSizeMode.StretchImage

     ' Make a new form and add the new picture data to it
     Dim picform As New Form
     picform.Controls.Add(expandpic)
     picform.Height = 800
     picform.Width = 600
     picform.Show()


 End Sub
 Private Sub Navigate_pics(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Panel1.KeyDown


     If e.KeyCode = Keys.Right Then
         expandpic = CType(sender, PictureBox)
         picform.SelectNextControl(expandpic, True, True, True, True)
     End If




 End Sub


не знаю, что происходит.

Что я уже пробовал:

Я попытался изменить picform, которая является формой panel1. controls, и переключил ее, но это не сработало. Не знаю, что делать.

Ralf Meier

Может быть, вы попробуете вот так :

Private Sub Navigate_pics(ByVal sender As System.Объект, бывал е как система.Окна.Формы.KeyEventArgs) Обрабатывает Панель Panel1.Клавиша вниз
Панель 1.SelectNextControl ...
Конец Подводной Лодки

??? Что такое pic внутри SelectNextControl ? Где она определена и назначена ?

Member 11856456

Pic - это pictureboxes, которые я создал из массива. Pic добавляется в panel1. controls. Я пытаюсь использовать клавиши со стрелками вправо и влево, чтобы двигаться вперед и назад между изображениями, чтобы они могли отображаться в том темпе, в котором кто-то хотел бы идти.

Ralf Meier

Это отличается от кода, который вы опубликовали ...
Когда я вижу код, я предполагаю, что у вас есть панель с x PictureBoxes в ней. Ваша панель имеет фокус, и вы хотите выбрать следующий PictureBox внутри панели.
Так... что у тебя на самом деле? Количество PictureBoxes внутри панели или один PictureBox, который должен отображать несколько изображений ?
Если у вас есть количество PictureBoxes и вы выбираете один из них, панель больше не имеет фокуса. Так что теперь Keydown-событие будет исходить из PictureBox ...
Если у вас есть один PictureBox, вам следует подумать о создании его индивидуальной версии, которая будет иметь желаемое поведение ...

Member 11856456

Я улучшил вопрос, я думал, что это будет простой ответ, который я просто не мог понять. Причина, по которой я предполагаю, что панель содержит нужную мне информацию, заключается в том, что исходные pictureboxes, получившие название "pic", расположены на панели.


Ralf Meier

Вы еще не ответили на мои вопросы ...
Пожалуйста, помните: я не сижу рядом с вами и не вижу того, что видите вы ...

Member 11856456

Счетчика нет, изображения преобразуются в каждую папку, в которой они находятся в виде массива. эти изображения помещаются по отдельности в графические поля, а затем отображаются в panel1.control. Я могу перейти к 1 изображению за раз, но я хочу иметь возможность прокручивать каждое изображение с помощью клавиши со стрелкой вправо.

1. на панели есть графические поля
2. Я не уверен, где событие keydown должны быть размещены и как его правильно использовать.
3. "ПИК", которая является массив pictureboxes поведение элемента управления PictureBox, предполагают, чтобы сделать. Я просто хочу индивидуально перейти к следующему и показать его. Я думаю, что было бы проще сделать новую форму и отобразить их на ней, перейдя к следующему графическому окну в строке. В каком-то смысле это было бы похоже на просмотрщик картинок.

Ralf Meier

Я повторяю своими словами то, что я понял (то, что вы хотите иметь) ...
- элемент управления, которому вы можете дать список изображений, которые были показаны
- вы можете / будете отображать, например, 5 картинок
-с помощью левого / правого Курсора вы хотите повернуть список вперед или назад так, чтобы отображались/могли отображаться различные изображения

В тот момент, когда вы поняли это с помощью панели, которая содержит несколько PictureBoxes
- с помощью клавиши курсора вы хотите повернуть PictureBoxes или их содержимое

Итак, мой вопрос (потому что это был бы мой подход) :
Почему бы вам не создать свой собственный индивидуальный контроль, который имеет такое поведение ? Этот элемент управления может иметь свойство (type List of Image), в котором определяются изображения. Внутри этого элемента управления вы выполняете все необходимые действия ...
В первый момент это было бы большой работой ... но как только вы начнете с ним работать, вы увидите, что это намного проще, так как он был сшит в самом начале ...

Member 11856456

Я понимаю, о чем вы говорите, но понятия не имею, как к этому подойти. Я все еще учусь vb.net время от времени я пытаюсь продвинуть то, что у меня есть, к чему-то более эффективному или продвинутому. Поэтому, если бы вы могли помочь и показать пример того, о чем вы думаете, я был бы очень признателен.

Ralf Meier

смотрите мое решение ...

1 Ответов

Рейтинг:
9

Ralf Meier

Это небольшое быстрое и грязное решение для вас.
Не все работает оптимально, но я думаю, что вы могли бы увидеть, что в основном можно было бы сделать ...

Imports System.ComponentModel

Public Class myPB
    Inherits Control

    Public Sub New()
        Me.Size = New Size(640, 160)
        Me.BackColor = Color.Gainsboro
        SetStyle(ControlStyles.Selectable, True)
    End Sub

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
    ReadOnly Property Images As List(Of ImageDefinition)
        Get
            Return my_Images
        End Get
    End Property
    Private my_Images As New List(Of ImageDefinition)

 
    Property ImagesVisible As Integer
        Get
            Return my_ImagesVisible
        End Get
        Set(value As Integer)
            my_ImagesVisible = value
            my_ImageSize = New Size(Me.Width / my_ImagesVisible, Me.Height)
            Me.Invalidate()
        End Set
    End Property
    Private my_ImagesVisible As Integer = 3
    Private my_ImageSize As Size

    Property ActualImage As Integer
        Get
            Return my_ActualImage
        End Get
        Set(value As Integer)
            my_ActualImage = value '+ my_Images.Images.Count) Mod my_Images.Images.Count
            If my_ActualImage < 0 Then my_ActualImage = my_Images.Count - 1
            If my_ActualImage > my_Images.Count - 1 Then my_ActualImage = 0
              Me.Invalidate()
        End Set
    End Property
    Private my_ActualImage As Integer = 0


    Protected Overrides Sub OnResize(e As EventArgs)
        my_ImageSize = New Size(Me.Width / ImagesVisible, Me.Height)
        MyBase.OnResize(e)
        Me.Invalidate()
    End Sub

    Protected Overrides Sub OnPaint(e As PaintEventArgs)
        Dim gr As Graphics = e.Graphics

        If my_Images.Count > 0 Then
            Dim inx As Integer
            Dim n As Integer = my_ImagesVisible : If n > my_Images.Count Then n = my_Images.Count
            Dim myImage As Image
            For i As Integer = 0 To n - 1
                inx = (i + my_ActualImage) Mod my_Images.Count
                'If inx > my_Images.Images.Count Then inx = 0
                myImage = my_Images.Item(inx).xImage
                gr.DrawImage(myImage, New Rectangle(i * my_ImageSize.Width, 0, my_ImageSize.Width, my_ImageSize.Height), New Rectangle(0, 0, myImage.Width, myImage.Height), GraphicsUnit.Pixel)
            Next
        End If

        MyBase.OnPaint(e)
    End Sub

    'Protected Overrides Sub OnKeyDown(e As KeyEventArgs)
    '    If e.KeyCode = Keys.Left Then
    '        ActualImage -= 1
    '    ElseIf e.KeyCode = Keys.Right Then
    '        ActualImage += 1
    '    Else
    '        MyBase.OnKeyDown(e)
    '    End If
    'End Sub

    Protected Overrides Sub OnMouseClick(e As MouseEventArgs)
        If e.Button = Windows.Forms.MouseButtons.Left Then ActualImage += 1
        If e.Button = Windows.Forms.MouseButtons.Right Then ActualImage -= 1
          MyBase.OnMouseClick(e)
    End Sub

End Class

Public Class ImageDefinition

    Public Property xImage As Image

End Class


Мой контроль в данный момент работает только с кнопками мыши. С клавиатурой все еще нереализовано (на данный момент)...

Дополнительный :
чтобы справиться с клавиатурой, вы должны добавить этот метод в код :
Protected Overrides Sub OnPreviewKeyDown(e As PreviewKeyDownEventArgs)
    If e.KeyCode = Keys.Left Then ActualImage += 1
    If e.KeyCode = Keys.Right Then ActualImage -= 1
      MyBase.OnPreviewKeyDown(e)
End Sub