I love the new managed WebBrowser control. It makes it so easy to hack any number of fantastic things into Windows Forms.
Let's say you want to do a slide show between various images. You can muck around with DirectX...or you can just use the transitions and filters built into the WebBrowser control and the DHTML Document Object Model. The following Visual Basic.NET code shows a UserControl created in Visual Studio 2005 that uses the WebBrowser control's built-in transitions and filters to pull this off. Since IE defines a large number of transitions and filters, you can do any number of effects: fade, random dissolve, window blinds, etc. (See Introduction to Filters and Transitions to behold all of the possibilities.)
To recreate this yourself, create a UserControl called Slideshow. Add a WebBrowser control named webBrowser1, and set the Dock property to Fill. Paste in the following code to Slideshow.vb, and you're good to go. To use the control in your application, set the ImageFilePath property to the directory containing your images, and call StartSlideshow() to start it up.
Imports System.IO
Public Class Slideshow Private _ImageFolderPath As String Private CurrentImage As Integer = 0 Private Files As String() Private _Loop As Boolean = True
Private _AllowedExtensions As Dictionary(Of String, Integer)
Public Property ImagePath() As String Get ImagePath = _ImageFolderPath End Get
Set(ByVal value As String) Dim FileStrs As String() = Nothing
' If we don't include the Is Nothing test, the designer sets the value to Nothing automagically, ' causing our form to fail to load at design time. If (Directory.Exists(value) Or value Is Nothing) Then _ImageFolderPath = value Else Throw New System.IO.FileNotFoundException("Directory does not exist.") End If End Set End Property
Public Sub StartSlideshow(ByVal milliSeconds As Integer, ByVal LoopSlideshow As Boolean) If (_ImageFolderPath Is Nothing) Then Throw New ArgumentException("You must set a valid value for ImagePath first.") End If
' Load up the array of images through which to cycle. Dim FilesTmp As String() = Directory.GetFiles(Me._ImageFolderPath) Dim TmpArray As List(Of String) = New List(Of String)() ' Remove elements that aren't images. For Each File As String In FilesTmp Dim Ext As String = File.Substring(File.LastIndexOf(".") + 1).ToLower() If (Me._AllowedExtensions.ContainsKey(Ext)) Then TmpArray.Add(File) End If Next
Files = TmpArray.ToArray()
_Loop = LoopSlideshow
' Load up the initial page. We will manipulate the page by making Javascript calls via HtmlDocument's ' InvokeScript() method. Dim NewPage As String = "<HTML>" & vbCr & _"<script type=""text/javascript"">" & vbCr & _"function transitionImage(newImg){" & vbCr & _ "var imgObject = document.getElementById(""ourImage"");" & vbCr & _ "imgObject.filters[0].apply();" & vbCr & _ "imgObject.src = newImg;" & vbCr & _ "imgObject.filters[0].play();" & vbCr & _"}</script>" & vbCr & _"<BODY><IMG src=""" & GetNextImage() & _""" id=""ourImage"" style=""position:absolute;top:0px;left:0px;filter:progid:DXImageTransform.Microsoft.RandomDissolve(Duration=2);" & _"width:" & WebBrowser1.Width & ";height:" & WebBrowser1.Height & ";""></BODY></HTML>" WebBrowser1.DocumentText = NewPage
' Start the timer. Me.ImageSlideTimer.Interval = milliSeconds Me.ImageSlideTimer.Start() End Sub
Public Sub StopSlideshow() Me.ImageSlideTimer.Stop() End Sub
Private Function GetNextImage() As String Dim UriStr As String = Nothing
If (CurrentImage = Files.Length) Then If (_Loop) Then CurrentImage = 0 Else ' That was it - time to bail. StopSlideshow() End If End If
UriStr = Files(CurrentImage) CurrentImage += 1
GetNextImage = UriStr End Function
Private Sub ImageSlideTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ImageSlideTimer.Tick Dim UriStr As String = GetNextImage()
' Create transition page for image. Dim args(1) As String args(0) = UriStr WebBrowser1.Document.InvokeScript("transitionImage", args) End Sub
Private Sub Slideshow_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me._AllowedExtensions = New Dictionary(Of String, Integer)() With Me._AllowedExtensions .Add("jpg", 1) .Add("jpeg", 1) .Add("gif", 1) .Add("png", 1) .Add("tif", 1) .Add("tiff", 1) End With End SubEnd Class