Move Dynamic Borderless Form via PictureBox
If you need help with a project or need to know how to do something specific in VB.NET then please ask your questions in here.
Forum rules
Please LOCK your topics once you have found the solution to your question so we know you no longer require help with your query.
Please LOCK your topics once you have found the solution to your question so we know you no longer require help with your query.
From the dynamic form I added. I realized that I can't get a gif animation to run in the form's background. So I thought I'd give it a try by embeding a picturebox on the dynamic form, but it's not working hence why I'm here.
So on my main form (Form1) I have 2 buttons, openfiledialog, and a picturebox. When you click button1 you browse for the an image to display in the picturebox, and when you press button2 as you can see from the code below. It'll open a new form, but what I want is to have the picturebox displayed over the whole form, but also play the gif animation I selected from my main form via Form1 onto the dynamically embeded one, but in the picturebox. Now I can't use it as BackgroundImage so I'm using it as just an Image, but my problem now is I'm unable to move each borderless form, and am unable to close each as well.
Anyway here's my code.
So on my main form (Form1) I have 2 buttons, openfiledialog, and a picturebox. When you click button1 you browse for the an image to display in the picturebox, and when you press button2 as you can see from the code below. It'll open a new form, but what I want is to have the picturebox displayed over the whole form, but also play the gif animation I selected from my main form via Form1 onto the dynamically embeded one, but in the picturebox. Now I can't use it as BackgroundImage so I'm using it as just an Image, but my problem now is I'm unable to move each borderless form, and am unable to close each as well.
Anyway here's my code.
Code: Select all
Any help would be greatly appreciated.Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
WidgetForm = New Form()
WidgetForm.ShowInTaskbar = False
WidgetForm.TopMost = True
WidgetForm.FormBorderStyle = Windows.Forms.FormBorderStyle.None
WidgetForm.ContextMenuStrip = ContextMenuStrip2
WidgetForm.Show()
Dim WidgetBG As PictureBox = New PictureBox()
sizew = Me.TextBox1.Text
sizey = Me.TextBox2.Text
WidgetBG.Size = New System.Drawing.Size(sizew, sizey)
WidgetBG.Image = Image.FromFile(Me.OpenFileDialog1.FileName)
WidgetBG.Location = New System.Drawing.Point(0, 0)
WidgetBG.Visible = True
WidgetForm.Controls.Add(WidgetBG)
opac = Me.TextBox3.Text
WidgetForm.Opacity = opac
WidgetForm.Size = New System.Drawing.Size(sizew, sizey)
'Add the event here
AddHandler WidgetBG.MouseDown, AddressOf WidgetBG_MouseDown
AddHandler WidgetBG.MouseMove, AddressOf WidgetBG_MouseMove
AddHandler WidgetBG.MouseUp, AddressOf WidgetBG_MouseUp
AddHandler WidgetBG.DoubleClick, AddressOf WidgetBG_DoubleClick
End Sub
Private Sub WidgetBG_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
drag = True
mousex = Windows.Forms.Cursor.Position.X - CType(sender, Form).Left
mousey = Windows.Forms.Cursor.Position.Y - CType(sender, Form).Top
End If
Timer1.Enabled = True
Timer1.Interval = 2500
End Sub
Private Sub WidgetBG_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If drag Then
CType(sender, Form).Top = Windows.Forms.Cursor.Position.Y - mousey
CType(sender, Form).Left = Windows.Forms.Cursor.Position.X - mousex
End If
End Sub
Private Sub WidgetBG_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Timer1.Enabled = False
drag = False
End Sub
Private Sub WidgetBG_DoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
CType(sender, Form).Close()
End Sub
Try this:
Code: Select all
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
widgetform = New Form()
widgetform.ShowInTaskbar = False
widgetform.TopMost = True
widgetform.FormBorderStyle = Windows.Forms.FormBorderStyle.None
widgetform.ContextMenuStrip = ContextMenuStrip2
widgetform.Show()
Dim WidgetBG As PictureBox = New PictureBox()
sizew = Me.TextBox1.Text
sizey = Me.TextBox2.Text
WidgetBG.Size = New System.Drawing.Size(sizew, sizey)
WidgetBG.Image = Image.FromFile(Me.OpenFileDialog1.FileName)
WidgetBG.Location = New System.Drawing.Point(0, 0)
WidgetBG.Visible = True
widgetform.Controls.Add(WidgetBG)
opac = Me.TextBox3.Text
widgetform.Opacity = opac
widgetform.Size = New System.Drawing.Size(sizew, sizey)
'Add the event here
AddHandler WidgetBG.MouseDown, AddressOf WidgetBG_MouseDown
AddHandler WidgetBG.MouseMove, AddressOf WidgetBG_MouseMove
AddHandler WidgetBG.MouseUp, AddressOf WidgetBG_MouseUp
AddHandler WidgetBG.DoubleClick, AddressOf WidgetBG_DoubleClick
End Sub
Private Sub WidgetBG_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
drag = True
mousex = e.X
mousey = e.Y
End If
Timer1.Enabled = True
Timer1.Interval = 2500
End Sub
Private Sub WidgetBG_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If drag Then
CType(sender, PictureBox).Parent.Location = New Point(CType(sender, PictureBox).Parent.Location.X + (e.X - mousex), CType(sender, PictureBox).Parent.Location.Y + (e.Y - mousey))
End If
End Sub
Private Sub WidgetBG_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Timer1.Enabled = False
drag = False
End Sub
Private Sub WidgetBG_DoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
CType(sender, PictureBox).Parent.Dispose()
End Sub
Welcome to CodenStuff.com Learn Code, Love Code. Thank you for being a member of the community.
I got the following error when projecting GIF animations.
You do not have the required permissions to view the files attached to this post.
A picturebox doesnt seem to handle gif images very well and im not sure where or why you get that error :?
Maybe take a look at the ImageAnimator class: http://msdn.microsoft.com/en-us/library ... .aspx#Y200
Maybe take a look at the ImageAnimator class: http://msdn.microsoft.com/en-us/library ... .aspx#Y200
Welcome to CodenStuff.com Learn Code, Love Code. Thank you for being a member of the community.
I just tried this, and got the same error.
I don't see how ImageAnimator would work for what I'm trying to achieve.
I don't see how ImageAnimator would work for what I'm trying to achieve.
Did it work before you tried the form movement? If it did, you can add this new class below to your project, and replace your PictureBox with a TransparentPictureBox (you need to build your project after you have added the class).
Code: Select all
Then, on the form you want to move, add this code:
Public Class TransparentPictureBox
Inherits PictureBox
Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = &H84 Then
m.Result = New IntPtr(-1)
Else
MyBase.WndProc(m)
End If
End Sub
End Class
Code: Select all
Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = &H84 Then
m.Result = New IntPtr(2)
Else
MyBase.WndProc(m)
End If
End Sub
LMAOSHMSFOAIDMT
Laughing my a** of so hard my sombrero fell off and I dropped my taco lmao;
Over 30 projects with source code!
Please give reputation to helpful members!
![Image]()
![Image]()
Laughing my a** of so hard my sombrero fell off and I dropped my taco lmao;
Over 30 projects with source code!
Please give reputation to helpful members!

MrAksel wrote:Did it work before you tried the form movement? If it did, you can add this new class below to your project, and replace your PictureBox with a TransparentPictureBox (you need to build your project after you have added the class).I released WidgetArea v1 earlier, along with the source code, but v1 does not have GIF support. v1.1 will have support as soon as this error's fixed. You can download the source code, and/or the app from here, or DeviantART[/url].Code: Select allThen, on the form you want to move, add this code:Public Class TransparentPictureBox Inherits PictureBox Protected Overrides Sub WndProc(ByRef m As Message) If m.Msg = &H84 Then m.Result = New IntPtr(-1) Else MyBase.WndProc(m) End If End Sub End Class
Code: Select allProtected Overrides Sub WndProc(ByRef m As Message) If m.Msg = &H84 Then m.Result = New IntPtr(2) Else MyBase.WndProc(m) End If End Sub
Now how would I implement this into the application?
Code: Select all
Private Sub ChooseImage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChooseImage.Click
PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
OpenFileDialog1.CheckFileExists = True
OpenFileDialog1.ShowReadOnly = False
OpenFileDialog1.Filter = "Supported Files | *.bmp;*.dib; *.jpg;*.jpeg;*.jpe;*.jfif; *.tif;*.tiff; *.png|Bitmap |*.bmp;*.dib|JPEG |*.jpg;*.jpeg;*.jpe;*.jfif|TIFF |*.tif;*.tiff |PNG |*.png |All Files |*.*"
OpenFileDialog1.FilterIndex = 1
If OpenFileDialog1.ShowDialog = DialogResult.OK Then
PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName)
WidgetW.Text = PictureBox1.Image.Width
WidgetY.Text = PictureBox1.Image.Height
AddWidget.Enabled = True
End If
End Sub
Private Sub AddWidget_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddWidget.Click
WidgetForm = New Form()
WidgetForm.ShowInTaskbar = False
WidgetForm.TopMost = True
WidgetForm.FormBorderStyle = Windows.Forms.FormBorderStyle.None
WidgetForm.ContextMenuStrip = ContextMenuStrip2
WidgetForm.Show()
Dim WidgetBG As PictureBox = New PictureBox()
sizew = Me.WidgetW.Text
sizey = Me.WidgetY.Text
WidgetBG.Size = New System.Drawing.Size(sizew, sizey)
WidgetBG.Image = Image.FromFile(Me.OpenFileDialog1.FileName)
WidgetBG.Location = New System.Drawing.Point(0, 0)
WidgetBG.Visible = True
WidgetForm.Controls.Add(WidgetBG)
opac = Me.OpacInt.Text
WidgetForm.Opacity = opac
WidgetForm.Size = New System.Drawing.Size(sizew, sizey)
'Add the event here
AddHandler WidgetBG.MouseDown, AddressOf WidgetBG_MouseDown
AddHandler WidgetBG.MouseMove, AddressOf WidgetBG_MouseMove
AddHandler WidgetBG.MouseUp, AddressOf WidgetBG_MouseUp
AddHandler WidgetBG.DoubleClick, AddressOf WidgetBG_DoubleClick
End Sub
Private Sub WidgetBG_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
drag = True
'Use FindForm() here to get your parent form
'You can also use CType(sender, PictureBox).Parent.Left which makes more sense
mousex = Windows.Forms.Cursor.Position.X - CType(sender, PictureBox).FindForm().Left
mousey = Windows.Forms.Cursor.Position.Y - CType(sender, PictureBox).FindForm().Top
End If
Timer1.Enabled = True
Timer1.Interval = 2500
End Sub
Private Sub WidgetBG_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If drag Then
CType(sender, PictureBox).FindForm().Top = Windows.Forms.Cursor.Position.Y - mousey
CType(sender, PictureBox).FindForm().Left = Windows.Forms.Cursor.Position.X - mousex
End If
End Sub
Private Sub WidgetBG_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Timer1.Enabled = False
drag = False
End Sub
Private Sub WidgetBG_DoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
CType(sender, PictureBox).FindForm().Close()
End Sub
First, you create a new file and add my first piece of code. Then build your project. Now, remove PictureBox1 and add a new TransparentPictureBox. You can use exactly the same code with loading images & such.
Next, in the form you want to drag without any border, add my second piece of code. Just paste it anywhere inside the class.
Now debug your project and you should have a click-transparent PictureBox and a form that drags perfectly around the screen.
Next, in the form you want to drag without any border, add my second piece of code. Just paste it anywhere inside the class.
Now debug your project and you should have a click-transparent PictureBox and a form that drags perfectly around the screen.
LMAOSHMSFOAIDMT
Laughing my a** of so hard my sombrero fell off and I dropped my taco lmao;
Over 30 projects with source code!
Please give reputation to helpful members!
![Image]()
![Image]()
Laughing my a** of so hard my sombrero fell off and I dropped my taco lmao;
Over 30 projects with source code!
Please give reputation to helpful members!

Let me see if I understand this correctly.
So first I go to Project/Add Class and add a Class (an empty class definition), or a code file, and add your first piece of code below.
I replaced PictureBox with TransparentPictureBox, and added your second code near the bottom, but still I get the following error. However some gifs play threw all the way, and some don't jump back to frame 1, but instead gives me the error I got before.
My full code
So first I go to Project/Add Class and add a Class (an empty class definition), or a code file, and add your first piece of code below.
Code: Select all
Next you say to add this piece of code to the borderless form.
Public Class TransparentPictureBox
Inherits PictureBox
Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = &H84 Then
m.Result = New IntPtr(-1)
Else
MyBase.WndProc(m)
End If
End Sub
End Class
Code: Select all
However the borderless form is dynamically created after pressing a button (so instead of using Dim like I did with the PictureBox I added the following near Public Class Form1, "Public WidgetForm As Form") and by adding your second code into another sub wouldn't work, cause of errors. Unless by adding it as it's own.Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = &H84 Then
m.Result = New IntPtr(2)
Else
MyBase.WndProc(m)
End If
End Sub
I replaced PictureBox with TransparentPictureBox, and added your second code near the bottom, but still I get the following error. However some gifs play threw all the way, and some don't jump back to frame 1, but instead gives me the error I got before.
My full code
Code: Select all
Public Class Form1
Inherits System.Windows.Forms.Form
Public WidgetForm As Form
Dim drag As Boolean
Dim mousex As Integer
Dim mousey As Integer
Dim sizew As Integer
Dim sizey As Integer
Dim opac As Double
Public Sub HelpWindow()
MsgBox("1) What's Pinning?" & vbCrLf & " Pin = Display above all other windows (aka Task Manager)" & vbCrLf & vbCrLf & "2) How do I move the widget I added?" & vbCrLf & " Simply drag and drop." & vbCrLf & vbCrLf & "3) How do I pin/unpin the widget I added?" & vbCrLf & " When the widget is active meaning when you're using it. (ex. Can't function Firefox, Chrome, etc: window the window being active) Simply press F1, or right click and press Pin/Unpin from the menu." & vbCrLf & vbCrLf & "4) How do I close a widget?" & vbCrLf & " Just double click the widget.", MsgBoxStyle.Question, "Need Help Functioning WidgetArea?")
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AddWidget.Enabled = False
End Sub
Private Sub ChooseImage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChooseImage.Click
PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
OpenFileDialog1.CheckFileExists = True
OpenFileDialog1.ShowReadOnly = False
OpenFileDialog1.Filter = "Supported Files | *.bmp;*.dib; *.jpg;*.jpeg;*.jpe;*.jfif; *.tif;*.tiff; *.png|Bitmap |*.bmp;*.dib|JPEG |*.jpg;*.jpeg;*.jpe;*.jfif|TIFF |*.tif;*.tiff |PNG |*.png |All Files |*.*"
OpenFileDialog1.FilterIndex = 1
If OpenFileDialog1.ShowDialog = DialogResult.OK Then
PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName)
WidgetW.Text = PictureBox1.Image.Width
WidgetY.Text = PictureBox1.Image.Height
AddWidget.Enabled = True
End If
End Sub
Private Sub AddWidget_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddWidget.Click
WidgetForm = New Form()
WidgetForm.ShowInTaskbar = False
WidgetForm.TopMost = True
WidgetForm.FormBorderStyle = Windows.Forms.FormBorderStyle.None
WidgetForm.ContextMenuStrip = ContextMenuStrip2
WidgetForm.Show()
Dim WidgetBG As TransparentPictureBox = New TransparentPictureBox()
sizew = Me.WidgetW.Text
sizey = Me.WidgetY.Text
WidgetBG.Size = New System.Drawing.Size(sizew, sizey)
WidgetBG.Image = Image.FromFile(Me.OpenFileDialog1.FileName)
WidgetBG.Location = New System.Drawing.Point(0, 0)
WidgetBG.Visible = True
WidgetForm.Controls.Add(WidgetBG)
opac = Me.OpacInt.Text
WidgetForm.Opacity = opac
WidgetForm.Size = New System.Drawing.Size(sizew, sizey)
'Add the event here
AddHandler WidgetBG.MouseDown, AddressOf WidgetBG_MouseDown
AddHandler WidgetBG.MouseMove, AddressOf WidgetBG_MouseMove
AddHandler WidgetBG.MouseUp, AddressOf WidgetBG_MouseUp
AddHandler WidgetBG.DoubleClick, AddressOf WidgetBG_DoubleClick
End Sub
Private Sub WidgetBG_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
drag = True
'Use FindForm() here to get your parent form
'You can also use CType(sender, TransparentPictureBox).Parent.Left which makes more sense
mousex = Windows.Forms.Cursor.Position.X - CType(sender, TransparentPictureBox).FindForm().Left
mousey = Windows.Forms.Cursor.Position.Y - CType(sender, TransparentPictureBox).FindForm().Top
End If
Timer1.Enabled = True
Timer1.Interval = 2500
End Sub
Private Sub WidgetBG_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If drag Then
CType(sender, TransparentPictureBox).FindForm().Top = Windows.Forms.Cursor.Position.Y - mousey
CType(sender, TransparentPictureBox).FindForm().Left = Windows.Forms.Cursor.Position.X - mousex
End If
End Sub
Private Sub WidgetBG_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Timer1.Enabled = False
drag = False
End Sub
Private Sub WidgetBG_DoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
CType(sender, TransparentPictureBox).FindForm().Close()
End Sub
Private Sub DonateToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
System.Diagnostics.Process.Start("https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=BSYGA2RB5ZJCC")
End Sub
Private Sub AddWidgetssToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddWidgetssToolStripMenuItem.Click
Me.UpdateTrayState(False)
Me.WindowState = FormWindowState.Normal
End Sub
Private Sub HelpToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
HelpWindow()
End Sub
Private Sub CloseToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CloseToolStripMenuItem.Click
Me.Close()
End Sub
Private Sub PayPalDonation_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PayPalDonation.Click
System.Diagnostics.Process.Start("https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=BSYGA2RB5ZJCC")
End Sub
Private Sub PinUnpinToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PinUnpinToolStripMenuItem.Click
If PinUnpinToolStripMenuItem.Checked = False Then
Me.WidgetForm.TopMost = True
PinUnpinToolStripMenuItem.CheckState = CheckState.Checked
Else
Me.WidgetForm.TopMost = False
PinUnpinToolStripMenuItem.CheckState = CheckState.Unchecked
End If
End Sub
Private Sub NotifyIcon1_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseDoubleClick
Me.UpdateTrayState(False)
Me.WindowState = FormWindowState.Normal
End Sub
Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
Me.UpdateTrayState(Me.WindowState = FormWindowState.Minimized)
End Sub
Private Sub UpdateTrayState(ByVal minimiseToTray As Boolean)
Me.Visible = Not minimiseToTray
Me.NotifyIcon1.Visible = minimiseToTray
End Sub
Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
If CheckBox1.Checked = True Then
CheckBox1.Checked = True
CheckBox1.CheckState = CheckState.Checked
Me.TopMost = True
Else
CheckBox1.Checked = False
CheckBox1.CheckState = CheckState.Unchecked
Me.TopMost = False
End If
End Sub
Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked
HelpWindow()
End Sub
Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = &H84 Then
m.Result = New IntPtr(2)
Else
MyBase.WndProc(m)
End If
End Sub
End Class
I can't help you with the GIF errors, as I know nothing why it fails, so if nothing works you could search up a library to help. My code is answering your question about moving the form with a PictureBox on top of it.
You have done everything correct with the TransparentPictureBox so thats good.
To fix the other, add a new form to your project, and name it DraggableForm. Then add this code to your new form:
Now you should be able to drag the widget form with a PictureBox(TransparentPictureBox) on top of it.
You have done everything correct with the TransparentPictureBox so thats good.
To fix the other, add a new form to your project, and name it DraggableForm. Then add this code to your new form:
Code: Select all
Now, inside your AddWidget_Click sub, replace WidgetForm = New Form() with WidgetForm = new DraggableForm() Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = &H84 Then
m.Result = New IntPtr(2)
Else
MyBase.WndProc(m)
End If
End Sub
Now you should be able to drag the widget form with a PictureBox(TransparentPictureBox) on top of it.
LMAOSHMSFOAIDMT
Laughing my a** of so hard my sombrero fell off and I dropped my taco lmao;
Over 30 projects with source code!
Please give reputation to helpful members!
![Image]()
![Image]()
Laughing my a** of so hard my sombrero fell off and I dropped my taco lmao;
Over 30 projects with source code!
Please give reputation to helpful members!

Copyright Information
Copyright © Codenstuff.com 2020 - 2023