2013-04-22 13 views
1

Я пытаюсь сделать несколько снимков, сделанных славными слайдами, которые я видел во многих приложениях Microsoft. Тот, где движение начинается медленно, ускоряется на полпути, а затем приходит к хорошей медленной остановке в новом месте. У меня есть все расчеты, выяснение, получение и настройка местоположений окна изображения, подтверждение с помощью console.writeline, что расположение изображений правильное и даже пробный прогон, который работает в упрощенном формате.Изменение местоположения фотокамер 20 раз в секунду, а не перерисовка

Но в полномасштабной версии оно не перекраивает изображение. На самом деле, похоже, что ничего не произошло во время работы скрипта. Я пробовал Me.Refresh(), Invalidate(), Timer.Enabled = True/False и Me.Update(). Ни один из них не сработал. Последний шаг - самое неприятное: я вызываю мой метод SetPanelLocation() в конце, чтобы убедиться, что панель попадает в конечное местоположение независимо от того, работает ли движение. Ничего не происходит и в этом вызове, хотя сразу после этой процедуры вы можете вызвать тот же метод из другого пользовательского события, и он снова начнет работать, как будто ничего не случилось.

Я создаю свой собственный класс PictureBox с именем clsFeedImageBox, который наследует PictureBox, который включает эту функциональность (наряду с другими функциями). Каждое изображение составляет всего 300x225 пикселей, поэтому они не являются массивными изображениями, которые занимают много времени, чтобы перерисовать. Каждый экземпляр этого класса находится в общем Forms.SplitterPanel. Я использую много комментариев по привычке, поэтому я оставил их здесь, возможно, они добавят немного света.

Public Class clsFeedImgBox 
    Inherits PictureBox 

    Private iRank As Integer 'rank in whatever feed this file gets put in 
    Private iRankTarget As Integer 'rank to move to when rank feed event starts 
    Private iTopStart As Integer 'starting top location before feed event 
    Private iTopTarget As Integer 'final Top location after feed event 
    Private WithEvents tMyTimer As New System.Timers.Timer 
    Private WithEvents oParent As FeedBase 'splitter panel, all location info comes from the parent 

    Public Sub New(ByRef sender As FeedBase, ByVal rank as Integer) 
    'set objects 
    oParent = sender 
    'set .Image property to pre-made thumbnail 
    Image.FromFile(ThumbPath) 'ThumbPath is a property which is set by this point (some code has been removed) 
    'setup initial position 
    setPanelLocation(rank) 
    'set autosize 
    Me.SizeMode = PictureBoxSizeMode.StretchImage 
    'set Image Scroll timer interval to 20 fps (1000/20 = 50) 
    tMyTimer.Interval = 50 
    End Sub 

    Public Sub scroll(ByVal newRank As Integer) 
    'setPanelLocation(newRank) <== this works, timed movements don't 
    iRankTarget = newRank 
    iTopStart = Me.Top 
    iTopTarget = oParent.ImgTop(newRank) 'gets an integer for the new Top location 
    tMyTimer.Start() 
    End Sub 

    Private Sub myScrollStep() Handles tMyTimer.Elapsed 
    'tMyTimer.Enabled = False 'this idea with the enabled = True at the end didn't work 
    iTickCount += 1 
    Dim iScrollPerc As Integer 'scroll % between Start and End * 100 
    iScrollPerc = oParent.ScrollStep(iTickCount, Rank) 'this part works 
    Console.WriteLine(strThumbName & " scrollPerc: " & iScrollPerc.ToString) 
    If iScrollPerc >= 100 Then 
     'scroll event complete 
     Console.WriteLine(strThumbName & " SetFinalLocation") 
     Me.setPanelLocation(iRankTarget) '<== This line doesn't work here, but works when called by other means 
     'stop Feed updates 
     tMyTimer.Stop() 
     'reset iTickCount for next movement 
     iTickCount = 0 
    Else 
     'scrolling still going 
     Dim newTop As Integer 
     newTop = Math.Round(iTopTarget - (((100 - iScrollPerc) * (iTopTarget - iTopStart))/100)) 'this part works 
     'Console.WriteLine(strThumbName & " TopTarget: " & newTop) 
     Me.Top = newTop 'Nothing happens here 
    End If 
    'Me.Left = oParent.ImgLeft 
    'Me.Width = oParent.ImgWidth 
    'Me.Height = oParent.ImgHeight 'that didn't work 
    'Me.Refresh() 'this didn't work 
    'Invalidate() 'this didn't do much good either 
    'Me.Update() 'Aaaaand no cigar, time for StackOverflow 
    'tMyTimer.Enabled = True 
    End Sub 

    Public Sub setPanelLocation(ByVal rank As Integer) 
    iRank = rank 
    Me.MyRePaint() 
    End Sub 

    Public Sub MyRePaint() 
    'repaint image box with everything in it's current rank 
    Me.Left = oParent.ImgLeft 
    Me.Top = oParent.ImgTop(iRank) 
    Me.Width = oParent.ImgWidth 
    Me.Height = oParent.ImgHeight 
    End Sub 
End Class 

Что дает? Должны быть некоторые внутренние работы VB.NET, которые помогут мне понять это. Я использую VS 2012 и Win8

ответ

3

Вы можете сделать WPF приложение и использовать Slider управления вместо «вручную» сделать слайдер с плоскостями, картинных коробки и т.д., и т.д.