RecordOrganizer/app/DD-Record-Organizer/Classes/ClassBackgroundHelper.vb
2024-05-06 13:38:52 +02:00

141 lines
5.7 KiB
VB.net

Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Drawing
Imports System.Drawing.Imaging
Imports DevExpress.XtraGrid.Views.Base
Imports DevExpress.XtraGrid.Blending
Imports DevExpress.XtraGrid
Imports DevExpress.XtraGrid.Views.Grid
Imports DevExpress.XtraGrid.Views.Grid.ViewInfo
Public Class ClassBackgroundHelper
Private _blendingComponent As XtraGridBlending
Private _originalImage As Bitmap
Private _grid As GridView
Private _pictureAlignment As ContentAlignment
Public Property Image() As Bitmap
Get
Return _originalImage
End Get
Set(value As Bitmap)
_originalImage = value
GenerateBackgroundImage()
End Set
End Property
Public Property PictureAlignment() As ContentAlignment
Get
Return _pictureAlignment
End Get
Set(value As ContentAlignment)
_pictureAlignment = value
GenerateBackgroundImage()
End Set
End Property
Public Sub New(grid As GridView, image As Bitmap, Optional alignment As ContentAlignment = ContentAlignment.BottomRight)
_grid = grid
InitializingBlendingComponent()
_originalImage = image
_grid.GridControl.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center
PictureAlignment = alignment
AddHandler _grid.GridControl.Resize, AddressOf GridControl_Resize
GenerateBackgroundImage()
End Sub
Private Sub GridControl_Resize(sender As Object, e As EventArgs)
GenerateBackgroundImage()
End Sub
Public Shared Function SetImgageOpacity(ByVal imgPic As Image, ByVal imgOpac As Double) As Image
Dim bmpPic As New Bitmap(imgPic.Width, imgPic.Height)
Dim gfxPic As Graphics = Graphics.FromImage(bmpPic)
Dim cmxPic As New ColorMatrix()
Dim iaPic As New ImageAttributes()
cmxPic.Matrix33 = imgOpac
iaPic.SetColorMatrix(cmxPic, ColorMatrixFlag.[Default], ColorAdjustType.Bitmap)
gfxPic.DrawImage(imgPic, New Rectangle(0, 0, bmpPic.Width, bmpPic.Height), 0, 0, imgPic.Width, imgPic.Height, GraphicsUnit.Pixel, iaPic)
gfxPic.Dispose()
iaPic.Dispose()
Return bmpPic
End Function
Private Sub GenerateBackgroundImage()
If IsNothing(_originalImage) Then
Exit Sub
End If
Try
Dim gvInfo As GridViewInfo = TryCast(_grid.GetViewInfo(), GridViewInfo)
Dim _processedImage As New Bitmap(gvInfo.ViewRects.Client.Width + 1, gvInfo.ViewRects.Client.Height + 1)
Using g As Graphics = Graphics.FromImage(_processedImage)
Dim p As Point = CalculateImageLocation(_originalImage.Width, _originalImage.Height, gvInfo, _pictureAlignment)
Dim transparentImage As Bitmap = SetImgageOpacity(_originalImage, 0.5)
g.DrawImage(transparentImage, p)
g.Save()
End Using
_grid.GridControl.BackgroundImage = _processedImage
Catch ex As Exception
LOGGER.Warn("Unexpected Error in GenerateBackgroundImage: " & ex.Message)
End Try
End Sub
Private Function CalculateImageLocation(imageWidth As Integer, imageHeight As Integer, gvInfo As GridViewInfo, alignment As ContentAlignment) As Point
Try
Dim location As Point = Point.Empty
Dim rect As Rectangle = gvInfo.ViewRects.Rows
Dim indicatorWidth As Integer = gvInfo.ViewRects.IndicatorWidth
Dim vScrollSize As Integer = If(gvInfo.VScrollBarPresence = ScrollBarPresence.Visible, 20, 0)
Dim hSctollSize As Integer = If(gvInfo.HScrollBarPresence = ScrollBarPresence.Visible, 20, 0)
Select Case alignment
Case ContentAlignment.BottomCenter
location.Offset((rect.Width / 2) - (imageWidth / 2), rect.Bottom - imageHeight - hSctollSize)
Exit Select
Case ContentAlignment.BottomLeft
location.Offset(indicatorWidth, rect.Bottom - imageHeight - hSctollSize)
Exit Select
Case ContentAlignment.BottomRight
location.Offset(rect.Right - imageWidth - vScrollSize, rect.Bottom - imageHeight - hSctollSize)
Exit Select
Case ContentAlignment.MiddleCenter
location.Offset((rect.Width / 2) - (imageWidth / 2), (rect.Height / 2) - (imageHeight / 2))
Exit Select
Case ContentAlignment.MiddleLeft
location.Offset(indicatorWidth, (rect.Height / 2) - (imageHeight / 2))
Exit Select
Case ContentAlignment.MiddleRight
location.Offset(rect.Width - imageWidth - vScrollSize, (rect.Height / 2) - (imageHeight / 2))
Exit Select
Case ContentAlignment.TopCenter
location.Offset((rect.Width / 2) - (imageWidth / 2), rect.Top)
Exit Select
Case ContentAlignment.TopLeft
location.Offset(indicatorWidth, rect.Top)
Exit Select
Case ContentAlignment.TopRight
location.Offset(rect.Right - imageWidth - vScrollSize, rect.Top)
Exit Select
Case Else
Exit Select
End Select
Return location
Catch ex As Exception
LOGGER.Warn("Unexpected Error in CalculateImageLocation: " & ex.Message)
Return Nothing
End Try
End Function
Private Sub InitializingBlendingComponent()
_blendingComponent = New XtraGridBlending()
_blendingComponent.GridControl = _grid.GridControl
End Sub
End Class