Article Options
Recently Viewed
Premium Sponsor
Premium Sponsor

 »  Home  »  .NET Newbie  »  A Simple Photo Browser  »  Creating Thumbnails at Run-Time
 »  Home  »  Windows Development  »  A Simple Photo Browser  »  Creating Thumbnails at Run-Time
 »  Home  »  Windows Development  »  Win Forms  »  A Simple Photo Browser  »  Creating Thumbnails at Run-Time
A Simple Photo Browser
by Chris Mills | Published  04/14/2006 | .NET Newbie Windows Development Win Forms | Rating:
Creating Thumbnails at Run-Time

We'll now add a function to generate a new thumbnail, set its size, add it to a specified Scrollable Control and set up an event handler for its "ThumbnailDoubleClick".  The function is shown below:

    Public Function AddThumbnail(ByRef cntlThumbnailContainer As ScrollableControl, ByVal strFileName As String) As Thumbnail

        Dim tnNewThumbnail As Thumbnail

        ' Create a new thumbnail
        tnNewThumbnail = New Thumbnail(strFileName)
        ' Assign its height, width and make sure it is visible
        With tnNewThumbnail
            If .Width <> iTNWidth Then .Width = iTNWidth
            If .Height <> iTNHeight Then .Height = iTNHeight
            .Visible = True
        End With
        ' Add the thumbnail to the specified control
        cntlThumbnailContainer.Controls.Add(tnNewThumbnail)
        ' Set up the event handler
        AddHandler tnNewThumbnail.ThumbnailDoubleClick, AddressOf OnThumbnailDoubleClick

        ' Return the thumbnail we just created
        Return tnNewThumbnail

    End Function

The next function used for the displaying of our thumbnails will be used to clear all thumbnails on the specified scrollable control.  Add the following function to your code:

    Public Sub ClearThumbnails(ByRef cntlThumbnailContainer As ScrollableControl)

        Dim i As Integer = 0
        Dim c As Control

        While i < cntlThumbnailContainer.Controls.Count
            c = cntlThumbnailContainer.Controls(i)
            If c.GetType Is GetType(Thumbnail) Then
                cntlThumbnailContainer.Controls.Remove(c) ' Remove the current thumbnail
                c.Dispose() ' Dispose of it
            Else
                i += 1
            End If
        End While

    End Sub

The loop used may seem complicated but is necessary as we are removing controls from the specified controls collection the more conventional For Each loop structure would not work as the number of controls in the collection could change after each loop iteration.

Generating Thumbnails for all Images in a Folder

Now we have all the functions to generate and display individual thumbnails we'll add a function to display thumbnails for all JPEGs in a folder, specified by the user using a FolderBrowserDialog, to the specified scrollable control.  Add this function to your forms code:

    Private Sub GenerateThumbnailsForFolder(ByRef cntlThumbnailContainer As ScrollableControl)

        Dim dlg As FolderBrowserDialog
        Dim iThumbnailCount As Integer = 0
        Dim tnNewThumbnail As Thumbnail

        ' Create a new instance of the folder browser dialog
        dlg = New FolderBrowserDialog

        ' Show the dialog and check that the user pressed OK to close it - not cancel
        If dlg.ShowDialog = DialogResult.OK Then

            Me.Cursor = Cursors.WaitCursor ' Set the Forms cursor to a hour glass

            ' Clear all thumbnails currently on the control
            ClearThumbnails(cntlThumbnailContainer)

            ' Get all the JPEG files in the specified folder and loop through them
            For Each objFile As FileInfo In New DirectoryInfo(dlg.SelectedPath).GetFiles("*.jpg")
                ' Create a new thumbnail to display the current file
                tnNewThumbnail = AddThumbnail(cntlThumbnailContainer, objFile.FullName)
                ' Arrange the thumbnail
                SetThumbnailPosition(tnNewThumbnail, cntlThumbnailContainer, iThumbnailCount)
                iThumbnailCount += 1  ' Increment the count of the thumbnails on the control
            Next

            ' Set the title of the application to reflect the folder name being browsed
            Me.Text = Application.ProductName & " - " & dlg.SelectedPath
            Me.Cursor = Cursors.Arrow ' Return the cursor to an arrow
        End If
        ' Dispose of the dialog
        dlg.Dispose()

    End Sub

This function uses the DirectoryInfo class to get all the JPEG images in the selected folder.  It then uses the functions we created to display and arrange the thumbnails on the specified control.  While the thumbnails are being generated we set the forms cursor to be an hour glass to indicate to the user that the application is busy, the cursor is restored to an arrow when the operation is complete.

We are now ready to add event handlers to the "Browse…" menu on our form.  It would have been possible to add the code in the "GenerateThumbnailsForFolder" function to this event handler; however this is not good practice.  In modern Windows application there is often more than one way of performing the same task, for example a main menu item, context menu item and toolbar button may all perform the same, or very similar tasks - to prevent adding the same large block of code several times in an application we create a function to do all the hard work and simply call this function from the required event handler.  Add the following to your code:

    Private Sub mnuFileOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFileOpen.Click
        GenerateThumbnailsForFolder(DirectCast(pnlThumbnails, ScrollableControl))
    End Sub

We simply call the function "GenerateThumbnailsForFolder" passing in the control the thumbnails are to be displayed on.  We have to cast the Panel to a ScrollableControl, which may seem unnecessary, but by passing in a reference to a ScrollableControl we can pass in a reference any control that is inherited from the ScrollableControl base class (either a Panel or Form - as before, this may make this code a little more useful in future applications.

Finally we'll add an event handler to allow the user to close the application from the menu we created earlier.  The code is shown below:

    Private Sub mnuFileExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFileExit.Click
        Me.Close()
    End Sub

Whilst the application is far from finished, it is how ready for to view its first images!

Comments    Submit Comment

Comment #1  (Posted by Ged on 04/14/2006)
Rating
Clear comprehensive and useful - Great stuff - Thanks!
 
Comment #2  (Posted by an unknown user on 04/21/2006)
Rating
WOW! Great! Thanks!
 
Comment #3  (Posted by an unknown user on 04/24/2006)
Rating
Very nice, would make a perfect tutorial for potential .NET programmers. Thanx
 
Comment #4  (Posted by Javier on 05/03/2006)
Rating
Excelent article, but I have a question: Does it work with vb6? Thanks
 
Comment #5  (Posted by Javier on 05/03/2006)
Rating
Hi Chris. My name is Javier. I´m writing from Argentina. I had read your article "A Simple Photo Browser" and I wish to know if that code works in vb6? I have to develop an app like that and I find your article very useful. Thank you.

PD: sorry for my bad English
 
Comment #6  (Posted by an unknown user on 10/07/2006)
Rating
Some weeks ago, I tried to make a user control on my own, but it didn't work. Now I finally got a great example of one. Thanks
 
Comment #7  (Posted by an unknown user on 11/10/2006)
Rating
Very clear and completely documented explanation!
thx
 
Comment #8  (Posted by an unknown user on 11/10/2006)
Rating
Very clear and completely documented explanation!
thx
 
Comment #9  (Posted by an unknown user on 11/21/2006)
Rating
Everything is clear and easy to understand. It helped me a lot. Thanks.
 
Comment #10  (Posted by an unknown user on 12/30/2006)
Rating
The best I've seen so far... Thanks.
 
Comment #11  (Posted by an unknown user on 01/23/2007)
Rating
Clear,Understandable and pupil not assumed to be a .Net expert.
 
Comment #12  (Posted by Graham on 01/24/2007)
Rating
This will not run, there is an error with
Dim tnThumbnail As Thumbnail
Squiggley under Thumbnail
Error Message = Type 'Thumbnail' not Defined.
 
Comment #13  (Posted by an unknown user on 01/28/2007)
Rating
This is very nice. Cleared all my querries.
 
Comment #14  (Posted by Asha on 07/13/2007)
Rating
Excellent article.Keep up the good work.Great description of code too!!
 
Comment #15  (Posted by an unknown user on 11/03/2007)
Rating
Thank you so much
 
Comment #16  (Posted by an unknown user on 11/05/2007)
Rating
Excellent article, Chris
 
Comment #17  (Posted by an unknown user on 01/02/2008)
Rating
Great article. I found it just when I need it.
 
Comment #18  (Posted by an unknown user on 02/17/2008)
Rating
thanks so much, it's really helpful
 
Comment #19  (Posted by an unknown user on 07/25/2008)
Rating
Great article!
 
Comment #20  (Posted by Anke on 10/12/2008)
Rating
but I do wonder exactly how much attention ,
 
Comment #21  (Posted by Lion on 10/12/2008)
Rating
a sort of open source world government ,
 
Comment #22  (Posted by Niro on 12/31/2008)
Rating
Nice stuff =)
Is the thumbnail panel supposed to flicker when its loading up a folder of images?
 
Comment #23  (Posted by an unknown user on 02/17/2009)
Rating
Very god!!!
 
Comment #24  (Posted by an unknown user on 04/20/2009)
Rating
Thank you, thank you. I've been looking for a way to zoom images in my own programming. This helps.
 
Comment #25  (Posted by an unknown user on 10/23/2009)
Rating
Great explaination of how code is used !
 
Comment #26  (Posted by an unknown user on 12/20/2009)
Rating
this is an excellent artical to learn for frehser
 
Sponsored Links