I've got a lot of images I need to load in from a directory into a project where I display a full-screened radrotator on a secondary monitor. I want to be able to show a slideshow of pictures, but I need them to properly fit the screen, and I'd like ones that are strange sizes to be horizontally and vertically centered. All of this seems to be working with my code so far except the centering part...
Here is my code:
Imports
System.Windows.Forms
Imports
Telerik.WinControls.UI
Imports
System.IO
Imports
System.Security.Cryptography
Public
Class
formSlideshow
Private
Sub
ShapedForm1_Load(sender
As
Object
, e
As
EventArgs)
Handles
Me
.Load
Me
.FormBorderStyle = FormBorderStyle.None
Me
.Bounds = GetSecondaryScreen().Bounds
Dim
screensize
As
New
Drawing.Size(
Me
.Width,
Me
.Height)
RadRotator1.Size = screensize
RadRotator1.Interval = (
CInt
(Val(formSettings.Interval)) * 1000)
If
LoadImages() =
True
Then
RadRotator1.Start()
End
Sub
'--Get size and location of secondary monitor
Public
Function
GetSecondaryScreen()
As
System.Windows.Forms.Screen
For
Each
windowscreen
As
System.Windows.Forms.Screen
In
System.Windows.Forms.Screen.AllScreens
If
Not
windowscreen
Is
System.Windows.Forms.Screen.PrimaryScreen
Then
Return
windowscreen
End
If
Next
Return
Screen.PrimaryScreen
End
Function
'--Load images into radRotator
Public
Function
LoadImages()
As
Boolean
Try
Dim
imageslist
As
New
List(Of
String
)
'--Get employees personal images
For
Each
employeeimage
As
String
In
Directory.GetFiles(formSettings.EmployeeDir)
If
Path.GetExtension(employeeimage) =
".jpeg"
Or
Path.GetExtension(employeeimage) =
".png"
Or
Path.GetExtension(employeeimage) =
".jpg"
Then
imageslist.Add(employeeimage)
End
If
Next
'--Get default images
For
Each
defaultimage
As
String
In
Directory.GetFiles(formSettings.DefaultDir)
If
Path.GetExtension(defaultimage) =
".jpeg"
Or
Path.GetExtension(defaultimage) =
".png"
Or
Path.GetExtension(defaultimage) =
".jpg"
Then
imageslist.Add(defaultimage)
End
If
Next
'--Randomize order of images
imageslist.Sort(
New
Randomizer(Of
String
)())
'--Add images to radRotator item list
For
Each
imagefile
As
String
In
imageslist
Dim
newimage
As
Image = Image.FromFile(imagefile)
Dim
rotatoritem
As
New
RadImageItem()
rotatoritem.Image = ScaleImage(newimage, 768, 1366)
RadRotator1.Items.Add(rotatoritem)
Next
Return
True
Catch
ex
As
Exception
Return
False
End
Try
Return
False
End
Function
'--Shrink images to fit screen, proportionately
Public
Function
ScaleImage(
ByVal
OldImage
As
Image,
ByVal
TargetHeight
As
Integer
,
ByVal
TargetWidth
As
Integer
)
As
System.Drawing.Image
Try
Dim
NewHeight
As
Integer
= TargetHeight
Dim
NewWidth
As
Integer
= NewHeight / OldImage.Height * OldImage.Width
If
NewWidth > TargetWidth
Then
NewWidth = TargetWidth
NewHeight = NewWidth / OldImage.Width * OldImage.Height
End
If
Return
New
Bitmap(OldImage, NewWidth, NewHeight)
Catch
ex
As
Exception
Return
Nothing
End
Try
Return
Nothing
End
Function
End
Class
Public
Class
Randomizer(Of T)
Implements
IComparer(Of T)
'--Insures different instances are sorted in different orders
Private
Shared
Salter
As
New
Random()
'--Only as random as your seed
Private
Salt
As
Integer
Public
Sub
New
()
Salt = Salter.
Next
(
Integer
.MinValue,
Integer
.MaxValue)
End
Sub
Private
Shared
sha
As
New
SHA1CryptoServiceProvider()
Private
Function
HashNSalt(
ByVal
x
As
Integer
)
As
Integer
Dim
b()
As
Byte
= sha.ComputeHash(BitConverter.GetBytes(x))
Dim
r
As
Integer
= 0
For
i
As
Integer
= 0
To
b.Length - 1
Step
4
r = r
Xor
BitConverter.ToInt32(b, i)
Next
Return
r
Xor
Salt
End
Function
Public
Function
Compare(x
As
T, y
As
T)
As
Integer
_
Implements
IComparer(Of T).Compare
Return
HashNSalt(x.GetHashCode()).CompareTo(HashNSalt(y.GetHashCode()))
End
Function
End
Class