Скроллинг формы

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Gogic
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 24.08.2008 (Вс) 13:19

Скроллинг формы

Сообщение Gogic » 29.07.2014 (Вт) 14:55

Приветствую!

В общем, есть форма, на которой динамически создаются элементы.
На ней соответственно задано
Код: Выделить всё
AutoScroll=True
.
Но этот автоскролл работает чуть более, чем никак, т.к. колесо в нем не работает, форма прокручивается рывками, да и срабатывает он на MouseUp ползунка или стрелочки.

Подскажите, можно ли с этим что-то сделать, или лучше добавить свой VScrollBar и написать нужное мне ручками?

Может у кого есть уже готовое решение с нормальным скроллингом формы?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.07.2014 (Вт) 15:05

Для того, чтобы работал скролл колёсиком, надо чтобы фокус не находился на элементе, для которого прокрутка значит что-то своё (многострочные текстовые поля, списки, в том числе выпадающие и так далее).
Остальных проблем возникать не должно. Советую попробовать на чистом проекте и выложить его сюда, если проблемы возникают.

PS: Я про WinForms, если надо WPF - то не знаю, не работал.

Gogic
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 24.08.2008 (Вс) 13:19

Re: Скроллинг формы

Сообщение Gogic » 29.07.2014 (Вт) 15:36

WinForms. Про фокус это понятно, не совсем же нуб =) Хотя да, там есть и RichTextBox'ы c прокрутками, на которых колесо работает идеально.
А вот автоматически созданная по свойству прокрутка не работает по MouseWheel и все тут.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.07.2014 (Вт) 15:42

Gogic писал(а): Про фокус это понятно, не совсем же нуб =)

Ну, некоторые программы скролят то, над чем мышь, а не то, где фокус. В некоторых случаях это гораздо удобнее. Но от по умолчанию такого не происходит в WinForms.

Gogic писал(а):А вот автоматически созданная по свойству прокрутка не работает по MouseWheel и все тут.

Должна работать. У меня у FlowLayoutPanel точно работает. Пример проекта всё-таки можно?

Gogic
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 24.08.2008 (Вс) 13:19

Re:

Сообщение Gogic » 29.07.2014 (Вт) 15:53

Qwertiy писал(а):
Gogic писал(а): Про фокус это понятно, не совсем же нуб =)

Ну, некоторые программы скролят то, над чем мышь, а не то, где фокус. В некоторых случаях это гораздо удобнее. Но от по умолчанию такого не происходит в WinForms.

Gogic писал(а):А вот автоматически созданная по свойству прокрутка не работает по MouseWheel и все тут.

Должна работать. У меня у FlowLayoutPanel точно работает. Пример проекта всё-таки можно?



Вот, нагуглил похожую проблему: http://stackoverflow.com/questions/1829 ... x-controls

Пример также оттуда можно взять.

Интересно, можно ли обойтись событиями формы Scroll и Mouse Wheel, не опускаясь до уровня SendMessage.

Хотя всегда в конце концов выручает именно она =)

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.07.2014 (Вт) 16:00

Gogic писал(а):Пример также оттуда можно взять.

Можно пример в виде готового проекта, а не шмотков кода?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.07.2014 (Вт) 16:06

Gogic писал(а):А вот автоматически созданная по свойству прокрутка не работает по MouseWheel и все тут.

У меня прокрутка работает. ЧЯДНТ?
Код: Выделить всё
Public Class Form2

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  Dim Rand As New Random
  Me.AutoScroll = True

  For Q As Integer = 0 To 100
    Me.Controls.Add(New PictureBox With {
      .BackColor = Color.FromArgb(Rand.Next(256), Rand.Next(256), Rand.Next(256)),
      .Left = 8,
      .Top = Q * 64,
      .Height = 56
    })
  Next Q
End Sub

End Class

Gogic
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 24.08.2008 (Вс) 13:19

Re: Скроллинг формы

Сообщение Gogic » 01.08.2014 (Пт) 19:36

Да, у меня с простыми элементами тоже работает.
Но я создаю массив из своих UserControl (ucCatalogue), в который входит несколько элементов.

С прокруткой разберусь позже

В этом массиве ucCatalogue у меня есть Linklabel.

Как обработать клик на конкретном LinkLabel элемента массива ucCatalogue, т.е. вернуть индекс элемента ?

Я понимаю, что индексов у элементов в VB.NET нет, и делаются какие-то извращения с помощью инструкции AddHandler, но допереть пока не могу.

Код: Выделить всё
    Private Sub frmCatalog_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim i As Long

        If ShowMode = 0 Then

            Me.ItemsCount = 38
            Dim mCatalog(Me.ItemsCount - 1) As ucCatalogue

            For i = 0 To Me.ItemsCount - 1
                mCatalog(i) = New ucCatalogue
                mCatalog(i).Left = 12
                mCatalog(i).Top = 12 + i * (mCatalog(i).Height)

                mCatalog(i).picImage.Image = System.Drawing.Image.FromFile(CatPath & CStr(i + 1) & ".jpg")
                mCatalog(i).rtBox.LoadFile(CatPath & CStr(i + 1) & ".rtf")

                mCatalog(i).Visible = True

                Me.Controls.Add(mCatalog(i))

            Next i
        ElseIf ShowMode = 1 Then
            '!!!
        End If
        Me.Select()
    End Sub


Больно не ругайте, это моя вторая программа на VB.NET.
Вопросы, зачем мне тут юзерконтрол, также оставьте при себе: я так хочу :)

Gogic
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 24.08.2008 (Вс) 13:19

Re: Скроллинг формы

Сообщение Gogic » 01.08.2014 (Пт) 23:55

В общем решил
В форме:
Код: Выделить всё
    Private Sub frmCatalog_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim i As Long

        If ShowMode = 0 Then

            Me.ItemsCount = 38
            Dim mCatalog(Me.ItemsCount - 1) As ucCatalogue

            For i = 0 To Me.ItemsCount - 1
                mCatalog(i) = New ucCatalogue
                mCatalog(i).Left = 12
                mCatalog(i).Top = 12 + i * (mCatalog(i).Height)

                mCatalog(i).picImage.Image = System.Drawing.Image.FromFile(CatPath & CStr(i + 1) & ".jpg")
                mCatalog(i).rtBox.LoadFile(CatPath & CStr(i + 1) & ".rtf")

                mCatalog(i).Visible = True
                mCatalog(i).linkEssence.Name = "link_es" & CStr(i + 1)

                AddHandler mCatalog(i).linkEssence.LinkClicked, AddressOf mCatalog(i).linkEssence_LinkClicked

                Me.Controls.Add(mCatalog(i))

            Next i
        ElseIf ShowMode = 1 Then
            '!!!
        End If
        Me.Select()
    End Sub


В ucCatalogue:
Код: Выделить всё
    Public Sub linkEssence_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles linkEssence.LinkClicked
        Dim mLink As LinkLabel = DirectCast(sender, LinkLabel)
        Debug.Print(mLink.Name)

    End Sub


Все работает, но все равно Index в шестерке был доступнее для моего понимания :)

По поводу скроллинга - там просто фокус всегда на RichTextBox'ах
То есть добавил Button, и выделил ее - скролл заработал.
Теперь нужно придумать как быть с этими фокусами.

Так что все вопросы решены.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.08.2014 (Сб) 0:10

У меня тоже UserControl'ы были. Всё скроллится. Правда, если не ошибаюсь, я их сделал наследниками GroupBox, а не UserControl.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.08.2014 (Сб) 0:11

Gogic писал(а):Все работает, но все равно Index в шестерке был доступнее для моего понимания :)

Тут тебе целый контрол дают - так удобнее ;)

Gogic писал(а):По поводу скроллинга - там просто фокус всегда на RichTextBox'ах

:D


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45

    TopList